Просмотр исходного кода

#4416: Add individual & changelog views for InventoryItem

Jeremy Stretch 5 лет назад
Родитель
Сommit
7e3e18faea

+ 1 - 1
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 (

+ 14 - 23
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
 #

+ 1 - 10
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

+ 4 - 2
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/<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>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
+    path('inventory-items/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='inventoryitem_changelog', kwargs={'model': InventoryItem}),
 
     # Cables
     path('cables/', views.CableListView.as_view(), name='cable_list'),

+ 51 - 47
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
 #

+ 3 - 1
netbox/templates/dcim/inc/inventoryitem.html

@@ -1,5 +1,7 @@
 <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>{{ item.manufacturer|default:"" }}</td>
     <td>{{ item.part_id }}</td>

+ 73 - 0
netbox/templates/dcim/inventoryitem.html

@@ -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">&mdash;</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">&mdash;</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 %}

+ 8 - 10
netbox/templates/inc/nav_menu.html

@@ -173,16 +173,6 @@
                             <a href="{% url 'dcim:manufacturer_list' %}">Manufacturers</a>
                         </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{% if not perms.dcim.view_cable %} class="disabled"{% endif %}>
                             {% if perms.dcim.add_cable %}
@@ -267,6 +257,14 @@
                             {% endif %}
                             <a href="{% url 'dcim:devicebay_list' %}">Device Bays</a>
                         </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>
                 </li>
                 <li class="dropdown">