From 584b076886502b322c79e23cdcdab3a35754f1d5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 18 Sep 2020 11:35:15 -0400 Subject: [PATCH] Closes #4956: Include inventory items on primary device view --- docs/release-notes/version-2.10.md | 1 + netbox/dcim/urls.py | 1 - netbox/dcim/views.py | 25 +- netbox/templates/dcim/device.html | 753 ++++++++++--------- netbox/templates/dcim/device_inventory.html | 63 -- netbox/templates/dcim/inc/inventoryitem.html | 4 +- 6 files changed, 415 insertions(+), 432 deletions(-) delete mode 100644 netbox/templates/dcim/device_inventory.html diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md index 4291b641d..54a6fcd39 100644 --- a/docs/release-notes/version-2.10.md +++ b/docs/release-notes/version-2.10.md @@ -7,6 +7,7 @@ ### New Features * [#1692](https://github.com/netbox-community/netbox/issues/1692) - Allow assigment of inventory items to parent items in web UI +* [#4956](https://github.com/netbox-community/netbox/issues/4956) - Include inventory items on primary device view * [#5146](https://github.com/netbox-community/netbox/issues/5146) - Add custom fields support for cables, power panels, rack reservations, and virtual chassis ### Other Changes diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 63ae5d2a4..aa0453baf 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -189,7 +189,6 @@ urlpatterns = [ path('devices//delete/', views.DeviceDeleteView.as_view(), name='device_delete'), path('devices//config-context/', views.DeviceConfigContextView.as_view(), name='device_configcontext'), path('devices//changelog/', ObjectChangeLogView.as_view(), name='device_changelog', kwargs={'model': Device}), - path('devices//inventory/', views.DeviceInventoryView.as_view(), name='device_inventory'), path('devices//status/', views.DeviceStatusView.as_view(), name='device_status'), path('devices//lldp-neighbors/', views.DeviceLLDPNeighborsView.as_view(), name='device_lldp_neighbors'), path('devices//config/', views.DeviceConfigView.as_view(), name='device_config'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0e322b2d3..31cc66bde 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1050,6 +1050,11 @@ class DeviceView(ObjectView): 'installed_device__device_type__manufacturer', ) + # Inventory items + inventoryitems = InventoryItem.objects.restrict(request.user, 'view').filter( + device=device + ).prefetch_related('manufacturer') + # Services services = Service.objects.restrict(request.user, 'view').filter(device=device) @@ -1072,9 +1077,10 @@ class DeviceView(ObjectView): 'powerports': powerports, 'poweroutlets': poweroutlets, 'interfaces': interfaces, - 'devicebays': devicebays, 'frontports': frontports, 'rearports': rearports, + 'devicebays': devicebays, + 'inventoryitems': inventoryitems, 'services': services, 'secrets': secrets, 'vc_members': vc_members, @@ -1082,23 +1088,6 @@ class DeviceView(ObjectView): }) -class DeviceInventoryView(ObjectView): - queryset = Device.objects.all() - - def get(self, request, pk): - - device = get_object_or_404(self.queryset, pk=pk) - inventory_items = InventoryItem.objects.restrict(request.user, 'view').filter( - device=device - ).prefetch_related('manufacturer') - - return render(request, 'dcim/device_inventory.html', { - 'device': device, - 'inventory_items': inventory_items, - 'active_tab': 'inventory', - }) - - class DeviceStatusView(ObjectView): additional_permissions = ['dcim.napalm_read_device'] queryset = Device.objects.all() diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 09f6eab40..ff82a49e2 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -69,7 +69,7 @@
  • Device Bays
  • {% endif %} {% if perms.dcim.add_inventoryitem %} -
  • Inventory Items
  • +
  • Inventory Items
  • {% endif %} @@ -93,11 +93,6 @@ - {% if perms.dcim.napalm_read_device %} {% if device.status != 'active' %} {% include 'dcim/inc/device_napalm_tabs.html' with disabled_message='Device must be in active status' %} @@ -123,351 +118,13 @@ {% endblock %} {% block content %} -
    -
    -
    -
    - Device -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Site - {% if device.site.region %} - {{ device.site.region }} - - {% endif %} - {{ device.site }} -
    Rack - {% if device.rack %} - {% if device.rack.group %} - {{ device.rack.group }} - - {% endif %} - {{ device.rack }} - {% else %} - None - {% endif %} -
    Position - {% if device.parent_bay %} - {% with device.parent_bay.device as parent %} - {{ parent }} {{ device.parent_bay }} - {% if parent.position %} - (U{{ parent.position }} / {{ parent.get_face_display }}) - {% endif %} - {% endwith %} - {% elif device.rack and device.position %} - U{{ device.position }} / {{ device.get_face_display }} - {% elif device.rack and device.device_type.u_height %} - Not racked - {% else %} - - {% endif %} -
    Tenant - {% if device.tenant %} - {% if device.tenant.group %} - {{ device.tenant.group }} - - {% endif %} - {{ device.tenant }} - {% else %} - None - {% endif %} -
    Device Type - {{ device.device_type.display_name }} ({{ device.device_type.u_height }}U) -
    Serial Number{{ device.serial|placeholder }}
    Asset Tag{{ device.asset_tag|placeholder }}
    -
    - {% if vc_members %} -
    -
    - Virtual Chassis -
    - - - - - - - - {% for vc_member in vc_members %} - - - - - - - {% endfor %} -
    DevicePositionMasterPriority
    - {{ vc_member }} - {{ vc_member.vc_position }}{% if device.virtual_chassis.master == vc_member %}{% endif %}{{ vc_member.vc_priority|default:"" }}
    - -
    - {% endif %} -
    -
    - Management -
    - - - - - - - - - - - - - - - - - - - - - - {% if device.cluster %} - - - - - {% endif %} -
    Role - {{ device.device_role }} -
    Platform - {% if device.platform %} - {{ device.platform }} - {% else %} - None - {% endif %} -
    Status - {{ device.get_status_display }} -
    Primary IPv4 - {% if device.primary_ip4 %} - {{ device.primary_ip4.address.ip }} - {% if device.primary_ip4.nat_inside %} - (NAT for {{ device.primary_ip4.nat_inside.address.ip }}) - {% elif device.primary_ip4.nat_outside %} - (NAT: {{ device.primary_ip4.nat_outside.address.ip }}) - {% endif %} - {% else %} - - {% endif %} -
    Primary IPv6 - {% if device.primary_ip6 %} - {{ device.primary_ip6.address.ip }} - {% if device.primary_ip6.nat_inside %} - (NAT for {{ device.primary_ip6.nat_inside.address.ip }}) - {% elif device.primary_ip6.nat_outside %} - (NAT: {{ device.primary_ip6.nat_outside.address.ip }}) - {% endif %} - {% else %} - - {% endif %} -
    Cluster - {% if device.cluster.group %} - {{ device.cluster.group }} - - {% endif %} - {{ device.cluster }} -
    -
    - {% include 'inc/custom_fields_panel.html' with obj=device %} - {% include 'extras/inc/tags_panel.html' with tags=device.tags.all url='dcim:device_list' %} -
    -
    - Comments -
    -
    - {% if device.comments %} - {{ device.comments|render_markdown }} - {% else %} - None - {% endif %} -
    -
    - {% plugin_left_page device %} -
    -
    - {% if power_ports and poweroutlets %} -
    -
    - Power Utilization -
    - - - - - - - - - {% for pp in power_ports %} - {% with utilization=pp.get_power_draw powerfeed=pp.connected_endpoint %} - - - - - {% if powerfeed.available_power %} - - - {% else %} - - - {% endif %} - - {% for leg in utilization.legs %} - - - - - - {% with phase_available=powerfeed.available_power|divide:3 %} - - {% endwith %} - - {% endfor %} - {% endwith %} - {% endfor %} -
    InputOutletsAllocatedAvailableUtilization
    {{ pp }}{{ utilization.outlet_count }}{{ utilization.allocated }}VA{{ powerfeed.available_power }}VA{% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}
    Leg {{ leg.name }}{{ leg.outlet_count }}{{ leg.allocated }}{{ powerfeed.available_power|divide:3 }}VA{% utilization_graph leg.allocated|percentage:phase_available %}
    -
    - {% endif %} - {% if request.user.is_authenticated %} -
    -
    - Secrets -
    - {% if secrets %} - - {% for secret in secrets %} - {% include 'secrets/inc/secret_tr.html' %} - {% endfor %} -
    - {% else %} -
    - None found -
    - {% endif %} - {% if perms.secrets.add_secret %} -
    - {% csrf_token %} -
    - - {% endif %} -
    - {% endif %} -
    -
    - Services -
    - {% if services %} - - {% for service in services %} - {% include 'ipam/inc/service.html' %} - {% endfor %} -
    - {% else %} -
    - None -
    - {% endif %} - {% if perms.ipam.add_service %} - - {% endif %} -
    -
    -
    - Images -
    - {% include 'inc/image_attachments.html' with images=device.images.all %} - {% if perms.extras.add_imageattachment %} - - {% endif %} -
    -
    -
    - Related Devices -
    - {% if related_devices %} - - {% for rd in related_devices %} - - - - - - {% endfor %} -
    - {{ rd }} - - {% if rd.rack %} - Rack {{ rd.rack }} - {% else %} - - {% endif %} - {{ rd.device_type.display_name }}
    - {% else %} -
    None found
    - {% endif %} -
    - {% plugin_right_page device %} -
    -
    - {% plugin_full_width_page device %} -
    -
    -
    -
    -
    diff --git a/netbox/templates/dcim/device_inventory.html b/netbox/templates/dcim/device_inventory.html deleted file mode 100644 index 3668d3052..000000000 --- a/netbox/templates/dcim/device_inventory.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends 'dcim/device.html' %} -{% load helpers %} - -{% block title %}{{ device }} - Inventory{% endblock %} - -{% block content %} -
    -
    -
    - {% csrf_token %} -
    -
    - Inventory Items -
    - - - - {% if perms.dcim.change_inventoryitem or perms.dcim.delete_inventoryitem %} - - {% endif %} - - - - - - - - - - - - {% for item in inventory_items %} - {% include 'dcim/inc/inventoryitem.html' %} - {% endfor %} - -
    NameManufacturerPart IDSerial NumberAsset TagDiscoveredDescription
    - -
    -
    -
    -
    -{% endblock %} diff --git a/netbox/templates/dcim/inc/inventoryitem.html b/netbox/templates/dcim/inc/inventoryitem.html index d56ae03c9..f7309fa59 100644 --- a/netbox/templates/dcim/inc/inventoryitem.html +++ b/netbox/templates/dcim/inc/inventoryitem.html @@ -31,10 +31,10 @@ {{ item.description|placeholder }} {% if perms.dcim.change_inventoryitem %} - + {% endif %} {% if perms.dcim.delete_inventoryitem %} - + {% endif %}