mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
#4416: Add individual & changelog views for InventoryItem
This commit is contained in:
@ -1120,7 +1120,7 @@ class InventoryItem(ComponentModel):
|
|||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('dcim:device_inventory', kwargs={'pk': self.device.pk})
|
return reverse('dcim:inventoryitem', kwargs={'pk': self.pk})
|
||||||
|
|
||||||
def to_csv(self):
|
def to_csv(self):
|
||||||
return (
|
return (
|
||||||
|
@ -775,6 +775,20 @@ class DeviceBayTable(DeviceComponentTable):
|
|||||||
default_columns = ('pk', 'device', 'name', 'label', 'installed_device', 'description')
|
default_columns = ('pk', 'device', 'name', 'label', 'installed_device', 'description')
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemTable(DeviceComponentTable):
|
||||||
|
manufacturer = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
discovered = BooleanColumn()
|
||||||
|
|
||||||
|
class Meta(DeviceComponentTable.Meta):
|
||||||
|
model = InventoryItem
|
||||||
|
fields = (
|
||||||
|
'pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'discovered'
|
||||||
|
)
|
||||||
|
default_columns = ('pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag')
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Cables
|
# Cables
|
||||||
#
|
#
|
||||||
@ -917,29 +931,6 @@ class InterfaceConnectionTable(BaseTable):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# InventoryItems
|
|
||||||
#
|
|
||||||
|
|
||||||
class InventoryItemTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
device = tables.LinkColumn(
|
|
||||||
viewname='dcim:device_inventory',
|
|
||||||
args=[Accessor('device.pk')]
|
|
||||||
)
|
|
||||||
manufacturer = tables.Column(
|
|
||||||
accessor=Accessor('manufacturer')
|
|
||||||
)
|
|
||||||
discovered = BooleanColumn()
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = InventoryItem
|
|
||||||
fields = (
|
|
||||||
'pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'discovered'
|
|
||||||
)
|
|
||||||
default_columns = ('pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Virtual chassis
|
# Virtual chassis
|
||||||
#
|
#
|
||||||
|
@ -1419,16 +1419,7 @@ class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# TODO: Convert to DeviceComponentViewTestCase?
|
class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
||||||
class InventoryItemTestCase(
|
|
||||||
ViewTestCases.EditObjectViewTestCase,
|
|
||||||
ViewTestCases.DeleteObjectViewTestCase,
|
|
||||||
ViewTestCases.ListObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkCreateObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkImportObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkEditObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkDeleteObjectsViewTestCase
|
|
||||||
):
|
|
||||||
model = InventoryItem
|
model = InventoryItem
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -5,8 +5,8 @@ from ipam.views import ServiceEditView
|
|||||||
from . import views
|
from . import views
|
||||||
from .models import (
|
from .models import (
|
||||||
Cable, ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, FrontPort, Interface,
|
Cable, ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, FrontPort, Interface,
|
||||||
Manufacturer, Platform, PowerFeed, PowerPanel, PowerPort, PowerOutlet, Rack, RackGroup, RackReservation, RackRole,
|
InventoryItem, Manufacturer, Platform, PowerFeed, PowerPanel, PowerPort, PowerOutlet, Rack, RackGroup,
|
||||||
RearPort, Region, Site, VirtualChassis,
|
RackReservation, RackRole, RearPort, Region, Site, VirtualChassis,
|
||||||
)
|
)
|
||||||
|
|
||||||
app_name = 'dcim'
|
app_name = 'dcim'
|
||||||
@ -322,8 +322,10 @@ urlpatterns = [
|
|||||||
path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
|
path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
|
||||||
# TODO: Bulk rename view for InventoryItems
|
# TODO: Bulk rename view for InventoryItems
|
||||||
path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
|
path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
|
||||||
|
path('inventory-items/<int:pk>/', views.InventoryItemView.as_view(), name='inventoryitem'),
|
||||||
path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
|
path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
|
||||||
path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
|
path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
|
||||||
|
path('inventory-items/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='inventoryitem_changelog', kwargs={'model': InventoryItem}),
|
||||||
|
|
||||||
# Cables
|
# Cables
|
||||||
path('cables/', views.CableListView.as_view(), name='cable_list'),
|
path('cables/', views.CableListView.as_view(), name='cable_list'),
|
||||||
|
@ -1716,6 +1716,57 @@ class DeviceBayBulkDeleteView(BulkDeleteView):
|
|||||||
table = tables.DeviceBayTable
|
table = tables.DeviceBayTable
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Inventory items
|
||||||
|
#
|
||||||
|
|
||||||
|
class InventoryItemListView(ObjectListView):
|
||||||
|
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
||||||
|
filterset = filters.InventoryItemFilterSet
|
||||||
|
filterset_form = forms.InventoryItemFilterForm
|
||||||
|
table = tables.InventoryItemTable
|
||||||
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemView(ObjectView):
|
||||||
|
queryset = InventoryItem.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemEditView(ObjectEditView):
|
||||||
|
queryset = InventoryItem.objects.all()
|
||||||
|
model_form = forms.InventoryItemForm
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemCreateView(ComponentCreateView):
|
||||||
|
queryset = InventoryItem.objects.all()
|
||||||
|
form = forms.InventoryItemCreateForm
|
||||||
|
model_form = forms.InventoryItemForm
|
||||||
|
template_name = 'dcim/device_component_add.html'
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemDeleteView(ObjectDeleteView):
|
||||||
|
queryset = InventoryItem.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemBulkImportView(BulkImportView):
|
||||||
|
queryset = InventoryItem.objects.all()
|
||||||
|
model_form = forms.InventoryItemCSVForm
|
||||||
|
table = tables.InventoryItemTable
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemBulkEditView(BulkEditView):
|
||||||
|
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
||||||
|
filterset = filters.InventoryItemFilterSet
|
||||||
|
table = tables.InventoryItemTable
|
||||||
|
form = forms.InventoryItemBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemBulkDeleteView(BulkDeleteView):
|
||||||
|
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
||||||
|
table = tables.InventoryItemTable
|
||||||
|
template_name = 'dcim/inventoryitem_bulk_delete.html'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bulk Device component creation
|
# Bulk Device component creation
|
||||||
#
|
#
|
||||||
@ -2048,53 +2099,6 @@ class InterfaceConnectionsListView(ObjectListView):
|
|||||||
return '\n'.join(csv_data)
|
return '\n'.join(csv_data)
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Inventory items
|
|
||||||
#
|
|
||||||
|
|
||||||
class InventoryItemListView(ObjectListView):
|
|
||||||
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
|
||||||
filterset = filters.InventoryItemFilterSet
|
|
||||||
filterset_form = forms.InventoryItemFilterForm
|
|
||||||
table = tables.InventoryItemTable
|
|
||||||
action_buttons = ('import', 'export')
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemEditView(ObjectEditView):
|
|
||||||
queryset = InventoryItem.objects.all()
|
|
||||||
model_form = forms.InventoryItemForm
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemCreateView(ComponentCreateView):
|
|
||||||
queryset = InventoryItem.objects.all()
|
|
||||||
form = forms.InventoryItemCreateForm
|
|
||||||
model_form = forms.InventoryItemForm
|
|
||||||
template_name = 'dcim/device_component_add.html'
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemDeleteView(ObjectDeleteView):
|
|
||||||
queryset = InventoryItem.objects.all()
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemBulkImportView(BulkImportView):
|
|
||||||
queryset = InventoryItem.objects.all()
|
|
||||||
model_form = forms.InventoryItemCSVForm
|
|
||||||
table = tables.InventoryItemTable
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemBulkEditView(BulkEditView):
|
|
||||||
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
|
||||||
filterset = filters.InventoryItemFilterSet
|
|
||||||
table = tables.InventoryItemTable
|
|
||||||
form = forms.InventoryItemBulkEditForm
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemBulkDeleteView(BulkDeleteView):
|
|
||||||
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
|
|
||||||
table = tables.InventoryItemTable
|
|
||||||
template_name = 'dcim/inventoryitem_bulk_delete.html'
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Virtual chassis
|
# Virtual chassis
|
||||||
#
|
#
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td style="padding-left: {{ indent|add:5 }}px">{{ item }}</td>
|
<td style="padding-left: {{ indent|add:5 }}px">
|
||||||
|
<a href="{{ item.get_absolute_url }}">{{ item }}</a>
|
||||||
|
</td>
|
||||||
<td>{% if not item.discovered %}<i class="fa fa-asterisk" title="Manually created"></i>{% endif %}</td>
|
<td>{% if not item.discovered %}<i class="fa fa-asterisk" title="Manually created"></i>{% endif %}</td>
|
||||||
<td>{{ item.manufacturer|default:"" }}</td>
|
<td>{{ item.manufacturer|default:"" }}</td>
|
||||||
<td>{{ item.part_id }}</td>
|
<td>{{ item.part_id }}</td>
|
||||||
|
73
netbox/templates/dcim/inventoryitem.html
Normal file
73
netbox/templates/dcim/inventoryitem.html
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
{% extends 'dcim/device_component.html' %}
|
||||||
|
{% load helpers %}
|
||||||
|
{% load plugins %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<strong>Inventory Item</strong>
|
||||||
|
</div>
|
||||||
|
<table class="table table-hover panel-body attr-table">
|
||||||
|
<tr>
|
||||||
|
<td>Device</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ instance.device.get_absolute_url }}">{{ instance.device }}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Parent Item</td>
|
||||||
|
<td>
|
||||||
|
{% if instance.parent %}
|
||||||
|
<a href="{{ instance.parent.get_absolute_url }}">{{ instance.parent }}</a>
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted">—</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Name</td>
|
||||||
|
<td>{{ instance.name }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Manufacturer</td>
|
||||||
|
<td>
|
||||||
|
{% if instance.manufacturer %}
|
||||||
|
<a href="{{ instance.manufacturer.get_absolute_url }}">{{ instance.manufacturer }}</a>
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted">—</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Part ID</td>
|
||||||
|
<td>{{ instance.part_id|placeholder }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Serial</td>
|
||||||
|
<td>{{ instance.serial|placeholder }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Asset Tag</td>
|
||||||
|
<td>{{ instance.asset_tag|placeholder }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Description</td>
|
||||||
|
<td>{{ instance.description|placeholder }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% include 'extras/inc/tags_panel.html' with tags=instance.tags.all %}
|
||||||
|
{% plugin_left_page instance %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
{% plugin_right_page instance %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
{% plugin_full_width_page instance %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -173,16 +173,6 @@
|
|||||||
<a href="{% url 'dcim:manufacturer_list' %}">Manufacturers</a>
|
<a href="{% url 'dcim:manufacturer_list' %}">Manufacturers</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li class="dropdown-header">Inventory</li>
|
|
||||||
<li{% if not perms.dcim.view_inventoryitem %} class="disabled"{% endif %}>
|
|
||||||
{% if perms.dcim.add_inventoryitem %}
|
|
||||||
<div class="buttons pull-right">
|
|
||||||
<a href="{% url 'dcim:inventoryitem_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
<a href="{% url 'dcim:inventoryitem_list' %}">Inventory Items</a>
|
|
||||||
</li>
|
|
||||||
<li class="divider"></li>
|
|
||||||
<li class="dropdown-header">Connections</li>
|
<li class="dropdown-header">Connections</li>
|
||||||
<li{% if not perms.dcim.view_cable %} class="disabled"{% endif %}>
|
<li{% if not perms.dcim.view_cable %} class="disabled"{% endif %}>
|
||||||
{% if perms.dcim.add_cable %}
|
{% if perms.dcim.add_cable %}
|
||||||
@ -267,6 +257,14 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{% url 'dcim:devicebay_list' %}">Device Bays</a>
|
<a href="{% url 'dcim:devicebay_list' %}">Device Bays</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li{% if not perms.dcim.view_inventoryitem %} class="disabled"{% endif %}>
|
||||||
|
{% if perms.dcim.add_inventoryitem %}
|
||||||
|
<div class="buttons pull-right">
|
||||||
|
<a href="{% url 'dcim:inventoryitem_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{% url 'dcim:inventoryitem_list' %}">Inventory Items</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
|
Reference in New Issue
Block a user