From 7e3e18faeabf419fe97c540e28103e4ceae503d4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Jul 2020 14:46:12 -0400 Subject: [PATCH] #4416: Add individual & changelog views for InventoryItem --- netbox/dcim/models/device_components.py | 2 +- netbox/dcim/tables.py | 37 +++----- netbox/dcim/tests/test_views.py | 11 +-- netbox/dcim/urls.py | 6 +- netbox/dcim/views.py | 98 ++++++++++---------- netbox/templates/dcim/inc/inventoryitem.html | 4 +- netbox/templates/dcim/inventoryitem.html | 73 +++++++++++++++ netbox/templates/inc/nav_menu.html | 18 ++-- 8 files changed, 155 insertions(+), 94 deletions(-) create mode 100644 netbox/templates/dcim/inventoryitem.html diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index d94e2484f..eaac1df7a 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1120,7 +1120,7 @@ class InventoryItem(ComponentModel): return self.name 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): return ( diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 871679fc7..f258df221 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -775,6 +775,20 @@ class DeviceBayTable(DeviceComponentTable): 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 # @@ -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 # diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index b3994ea8c..799d186b2 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1419,16 +1419,7 @@ class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase): ) -# TODO: Convert to DeviceComponentViewTestCase? -class InventoryItemTestCase( - ViewTestCases.EditObjectViewTestCase, - ViewTestCases.DeleteObjectViewTestCase, - ViewTestCases.ListObjectsViewTestCase, - ViewTestCases.BulkCreateObjectsViewTestCase, - ViewTestCases.BulkImportObjectsViewTestCase, - ViewTestCases.BulkEditObjectsViewTestCase, - ViewTestCases.BulkDeleteObjectsViewTestCase -): +class InventoryItemTestCase(ViewTestCases.DeviceComponentViewTestCase): model = InventoryItem @classmethod diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 4d5964ee1..53d65502c 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -5,8 +5,8 @@ from ipam.views import ServiceEditView from . import views from .models import ( Cable, ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, FrontPort, Interface, - Manufacturer, Platform, PowerFeed, PowerPanel, PowerPort, PowerOutlet, Rack, RackGroup, RackReservation, RackRole, - RearPort, Region, Site, VirtualChassis, + InventoryItem, Manufacturer, Platform, PowerFeed, PowerPanel, PowerPort, PowerOutlet, Rack, RackGroup, + RackReservation, RackRole, RearPort, Region, Site, VirtualChassis, ) app_name = 'dcim' @@ -322,8 +322,10 @@ urlpatterns = [ path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'), # TODO: Bulk rename view for InventoryItems path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'), + path('inventory-items//', views.InventoryItemView.as_view(), name='inventoryitem'), path('inventory-items//edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'), path('inventory-items//delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'), + path('inventory-items//changelog/', ObjectChangeLogView.as_view(), name='inventoryitem_changelog', kwargs={'model': InventoryItem}), # Cables path('cables/', views.CableListView.as_view(), name='cable_list'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 3eebbabae..054d3de34 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1716,6 +1716,57 @@ class DeviceBayBulkDeleteView(BulkDeleteView): 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 # @@ -2048,53 +2099,6 @@ class InterfaceConnectionsListView(ObjectListView): 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 # diff --git a/netbox/templates/dcim/inc/inventoryitem.html b/netbox/templates/dcim/inc/inventoryitem.html index 56ccfeace..d3a78afd4 100644 --- a/netbox/templates/dcim/inc/inventoryitem.html +++ b/netbox/templates/dcim/inc/inventoryitem.html @@ -1,5 +1,7 @@ - {{ item }} + + {{ item }} + {% if not item.discovered %}{% endif %} {{ item.manufacturer|default:"" }} {{ item.part_id }} diff --git a/netbox/templates/dcim/inventoryitem.html b/netbox/templates/dcim/inventoryitem.html new file mode 100644 index 000000000..6e12d9f33 --- /dev/null +++ b/netbox/templates/dcim/inventoryitem.html @@ -0,0 +1,73 @@ +{% extends 'dcim/device_component.html' %} +{% load helpers %} +{% load plugins %} + +{% block content %} +
+
+
+
+ Inventory Item +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Device + {{ instance.device }} +
Parent Item + {% if instance.parent %} + {{ instance.parent }} + {% else %} + + {% endif %} +
Name{{ instance.name }}
Manufacturer + {% if instance.manufacturer %} + {{ instance.manufacturer }} + {% else %} + + {% endif %} +
Part ID{{ instance.part_id|placeholder }}
Serial{{ instance.serial|placeholder }}
Asset Tag{{ instance.asset_tag|placeholder }}
Description{{ instance.description|placeholder }}
+
+ {% include 'extras/inc/tags_panel.html' with tags=instance.tags.all %} + {% plugin_left_page instance %} +
+
+ {% plugin_right_page instance %} +
+
+
+
+ {% plugin_full_width_page instance %} +
+
+{% endblock %} diff --git a/netbox/templates/inc/nav_menu.html b/netbox/templates/inc/nav_menu.html index f22baf7cc..23808bc04 100644 --- a/netbox/templates/inc/nav_menu.html +++ b/netbox/templates/inc/nav_menu.html @@ -173,16 +173,6 @@ Manufacturers
  • - - - {% if perms.dcim.add_inventoryitem %} -
    - -
    - {% endif %} - Inventory Items - -
  • {% if perms.dcim.add_cable %} @@ -267,6 +257,14 @@ {% endif %} Device Bays + + {% if perms.dcim.add_inventoryitem %} +
    + +
    + {% endif %} + Inventory Items +