From 769b240164ab23da501d842fc5443bf734f035f5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 11:11:41 -0400 Subject: [PATCH 01/17] Extend device component tables to include cable peer --- netbox/dcim/tables/devices.py | 46 +++++++++++++++++++---------- netbox/dcim/tables/power.py | 16 +++------- netbox/dcim/tables/template_code.py | 10 +++++++ 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index c614c534b6..334947263c 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -10,7 +10,7 @@ BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, ToggleColumn, ) -from .template_code import DEVICE_LINK, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS +from .template_code import CABLETERMINATION, DEVICE_LINK, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS __all__ = ( 'ConsolePortTable', @@ -204,29 +204,40 @@ class Meta(BaseTable.Meta): order_by = ('device', 'name') -class ConsolePortTable(DeviceComponentTable): +class CableTerminationTable(BaseTable): + cable = tables.Column( + linkify=True + ) + cable_peer = tables.TemplateColumn( + accessor='get_cable_peer', + template_code=CABLETERMINATION, + orderable=False + ) + + +class ConsolePortTable(DeviceComponentTable, CableTerminationTable): tags = TagColumn( url_name='dcim:consoleport_list' ) class Meta(DeviceComponentTable.Meta): model = ConsolePort - fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'tags') + fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'tags') default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') -class ConsoleServerPortTable(DeviceComponentTable): +class ConsoleServerPortTable(DeviceComponentTable, CableTerminationTable): tags = TagColumn( url_name='dcim:consoleserverport_list' ) class Meta(DeviceComponentTable.Meta): model = ConsoleServerPort - fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'tags') + fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'tags') default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') -class PowerPortTable(DeviceComponentTable): +class PowerPortTable(DeviceComponentTable, CableTerminationTable): tags = TagColumn( url_name='dcim:powerport_list' ) @@ -234,19 +245,23 @@ class PowerPortTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( - 'pk', 'device', 'name', 'label', 'type', 'description', 'maximum_draw', 'allocated_draw', 'cable', 'tags', + 'pk', 'device', 'name', 'label', 'type', 'description', 'maximum_draw', 'allocated_draw', 'cable', + 'cable_peer', 'tags', ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') -class PowerOutletTable(DeviceComponentTable): +class PowerOutletTable(DeviceComponentTable, CableTerminationTable): tags = TagColumn( url_name='dcim:poweroutlet_list' ) class Meta(DeviceComponentTable.Meta): model = PowerOutlet - fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'power_port', 'feed_leg', 'cable', 'tags') + fields = ( + 'pk', 'device', 'name', 'label', 'type', 'description', 'power_port', 'feed_leg', 'cable', 'cable_peer', + 'tags', + ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description') @@ -265,7 +280,7 @@ class BaseInterfaceTable(BaseTable): ) -class InterfaceTable(DeviceComponentTable, BaseInterfaceTable): +class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, CableTerminationTable): tags = TagColumn( url_name='dcim:interface_list' ) @@ -274,12 +289,12 @@ class Meta(DeviceComponentTable.Meta): model = Interface fields = ( 'pk', 'device', 'name', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', - 'description', 'cable', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', + 'description', 'cable', 'cable_peer', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', ) default_columns = ('pk', 'device', 'name', 'label', 'enabled', 'type', 'description') -class FrontPortTable(DeviceComponentTable): +class FrontPortTable(DeviceComponentTable, CableTerminationTable): rear_port_position = tables.Column( verbose_name='Position' ) @@ -290,19 +305,20 @@ class FrontPortTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = FrontPort fields = ( - 'pk', 'device', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'tags', + 'pk', 'device', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', + 'cable_peer', 'tags', ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description') -class RearPortTable(DeviceComponentTable): +class RearPortTable(DeviceComponentTable, CableTerminationTable): tags = TagColumn( url_name='dcim:rearport_list' ) class Meta(DeviceComponentTable.Meta): model = RearPort - fields = ('pk', 'device', 'name', 'label', 'type', 'positions', 'description', 'cable', 'tags') + fields = ('pk', 'device', 'name', 'label', 'type', 'positions', 'description', 'cable', 'cable_peer', 'tags') default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index 8d90fb620a..471b1bb3ad 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -3,6 +3,7 @@ from dcim.models import PowerFeed, PowerPanel from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn +from .devices import CableTerminationTable from .template_code import POWERFEED_CABLE, POWERFEED_CABLETERMINATION __all__ = ( @@ -41,7 +42,7 @@ class Meta(BaseTable.Meta): # Power feeds # -class PowerFeedTable(BaseTable): +class PowerFeedTable(CableTerminationTable): pk = ToggleColumn() name = tables.LinkColumn() power_panel = tables.Column( @@ -55,15 +56,6 @@ class PowerFeedTable(BaseTable): max_utilization = tables.TemplateColumn( template_code="{{ value }}%" ) - cable = tables.TemplateColumn( - template_code=POWERFEED_CABLE, - orderable=False - ) - connection = tables.TemplateColumn( - accessor='get_cable_peer', - template_code=POWERFEED_CABLETERMINATION, - orderable=False - ) available_power = tables.Column( verbose_name='Available power (VA)' ) @@ -75,9 +67,9 @@ class Meta(BaseTable.Meta): model = PowerFeed fields = ( 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', - 'max_utilization', 'cable', 'connection', 'available_power', 'tags', + 'max_utilization', 'cable', 'cable_peer', 'connection', 'available_power', 'tags', ) default_columns = ( 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable', - 'connection', + 'cable_peer', ) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index b3840b48bb..7278de113f 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -1,3 +1,13 @@ +CABLETERMINATION = """ +{% if value %} + {{ value.parent }} + + {{ value }} +{% else %} + — +{% endif %} +""" + CABLE_LENGTH = """ {% if record.length %}{{ record.length }} {{ record.get_length_unit_display }}{% else %}—{% endif %} """ From 35273c7bfe3623d00ddfa27f7d74db055088394e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 11:41:24 -0400 Subject: [PATCH 02/17] Add connection column for path endpoints --- netbox/dcim/tables/devices.py | 31 +++++++++++++++++++++---------- netbox/dcim/tables/power.py | 2 ++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 334947263c..21c2f4244a 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -215,29 +215,40 @@ class CableTerminationTable(BaseTable): ) -class ConsolePortTable(DeviceComponentTable, CableTerminationTable): +class PathEndpointTable(CableTerminationTable): + connection = tables.TemplateColumn( + accessor='_path.destination', + template_code=CABLETERMINATION, + verbose_name='Connection', + orderable=False + ) + + +class ConsolePortTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:consoleport_list' ) class Meta(DeviceComponentTable.Meta): model = ConsolePort - fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'tags') + fields = ( + 'pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'connection', 'tags', + ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') -class ConsoleServerPortTable(DeviceComponentTable, CableTerminationTable): +class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:consoleserverport_list' ) class Meta(DeviceComponentTable.Meta): model = ConsoleServerPort - fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'tags') + fields = ('pk', 'device', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'connection', 'tags') default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') -class PowerPortTable(DeviceComponentTable, CableTerminationTable): +class PowerPortTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:powerport_list' ) @@ -246,12 +257,12 @@ class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( 'pk', 'device', 'name', 'label', 'type', 'description', 'maximum_draw', 'allocated_draw', 'cable', - 'cable_peer', 'tags', + 'cable_peer', 'connection', 'tags', ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') -class PowerOutletTable(DeviceComponentTable, CableTerminationTable): +class PowerOutletTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:poweroutlet_list' ) @@ -260,7 +271,7 @@ class Meta(DeviceComponentTable.Meta): model = PowerOutlet fields = ( 'pk', 'device', 'name', 'label', 'type', 'description', 'power_port', 'feed_leg', 'cable', 'cable_peer', - 'tags', + 'connection', 'tags', ) default_columns = ('pk', 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description') @@ -280,7 +291,7 @@ class BaseInterfaceTable(BaseTable): ) -class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, CableTerminationTable): +class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, PathEndpointTable): tags = TagColumn( url_name='dcim:interface_list' ) @@ -289,7 +300,7 @@ class Meta(DeviceComponentTable.Meta): model = Interface fields = ( 'pk', 'device', 'name', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', - 'description', 'cable', 'cable_peer', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', + 'description', 'cable', 'cable_peer', 'connection', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', ) default_columns = ('pk', 'device', 'name', 'label', 'enabled', 'type', 'description') diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index 471b1bb3ad..ae5c2a5c81 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -42,6 +42,8 @@ class Meta(BaseTable.Meta): # Power feeds # +# We're not using PathEndpointTable for PowerFeed because power connections +# cannot traverse pass-through ports. class PowerFeedTable(CableTerminationTable): pk = ToggleColumn() name = tables.LinkColumn() From 99352a5d30135168d82b34d87ffcb5d50810f515 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 14:39:15 -0400 Subject: [PATCH 03/17] Convert device console ports list to table --- netbox/dcim/tables/devices.py | 26 +++++++- netbox/dcim/tables/template_code.py | 21 ++++++ netbox/dcim/views.py | 5 +- netbox/templates/dcim/device.html | 27 ++------ netbox/templates/dcim/inc/consoleport.html | 77 ---------------------- 5 files changed, 55 insertions(+), 101 deletions(-) delete mode 100644 netbox/templates/dcim/inc/consoleport.html diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 21c2f4244a..5f61e03ba1 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -10,11 +10,14 @@ BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, ToggleColumn, ) -from .template_code import CABLETERMINATION, DEVICE_LINK, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS +from .template_code import ( + CABLETERMINATION, CONSOLEPORT_BUTTONS, DEVICE_LINK, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, +) __all__ = ( 'ConsolePortTable', 'ConsoleServerPortTable', + 'DeviceConsolePortTable', 'DeviceImportTable', 'DeviceTable', 'DeviceBayTable', @@ -237,6 +240,27 @@ class Meta(DeviceComponentTable.Meta): default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') +class DeviceConsolePortTable(ConsolePortTable): + name = tables.TemplateColumn( + template_code=' {{ value }}' + ) + actions = ButtonsColumn( + model=ConsolePort, + buttons=('edit', 'delete'), + prepend_template=CONSOLEPORT_BUTTONS + ) + + class Meta(DeviceComponentTable.Meta): + model = ConsolePort + fields = ( + 'pk', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'connection', 'tags', 'actions' + ) + default_columns = ('pk', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'actions') + row_attrs = { + 'class': lambda record: record.cable.get_status_class() if record.cable else '' + } + + class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:consoleserverport_list' diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 7278de113f..e17a5a8772 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -73,3 +73,24 @@ {% load helpers %} {% utilization_graph value %} """ + +# +# Device component buttons +# + +CONSOLEPORT_BUTTONS = """ +{% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} +{% elif perms.dcim.add_cable %} + + + + +{% endif %} +""" diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 06fb7619f2..3cf011503a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1019,6 +1019,9 @@ def get(self, request, pk): consoleports = ConsolePort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'cable', '_path__destination', ) + consoleport_table = tables.DeviceConsolePortTable(consoleports, orderable=False) + if request.user.has_perm('dcim.change_consoleport') or request.user.has_perm('dcim.delete_consoleport'): + consoleport_table.columns.show('pk') # Console server ports consoleserverports = ConsoleServerPort.objects.restrict(request.user, 'view').filter( @@ -1079,7 +1082,7 @@ def get(self, request, pk): return render(request, 'dcim/device.html', { 'device': device, - 'consoleports': consoleports, + 'consoleport_table': consoleport_table, 'consoleserverports': consoleserverports, 'powerports': powerports, 'poweroutlets': poweroutlets, diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index c06f86bf0c..1a74016b29 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -131,7 +131,7 @@

{{ device }}

Rear Ports {% badge rearports|length %}
  • - Console Ports {% badge consoleports|length %} + Console Ports {% badge consoleport_table.rows|length %}
  • Console Server Ports {% badge consoleserverports|length %} @@ -670,27 +670,9 @@

    {{ device }}

    Console Ports
    - - - - {% if perms.dcim.change_consoleport or perms.dcim.delete_consoleport %} - - {% endif %} - - - - - - - - - - {% for cp in consoleports %} - {% include 'dcim/inc/consoleport.html' %} - {% endfor %} -
    NameTypeDescriptionCableCable TerminationConnection
    + {% include 'responsive_table.html' with table=consoleport_table %} {% endif %} +
    diff --git a/netbox/templates/dcim/inc/consoleport.html b/netbox/templates/dcim/inc/consoleport.html deleted file mode 100644 index ace09cfe2c..0000000000 --- a/netbox/templates/dcim/inc/consoleport.html +++ /dev/null @@ -1,77 +0,0 @@ - - - {# Checkbox #} - {% if perms.dcim.change_consoleport or perms.dcim.delete_consoleport %} - - - - {% endif %} - - {# Name #} - - - {{ cp }} - - - {# Type #} - - {% if cp.type %}{{ cp.get_type_display }}{% else %}—{% endif %} - - - {# Description #} - - {{ cp.description }} - - - {# Cable #} - {% if cp.cable %} - - {{ cp.cable }} - - - - - {% include 'dcim/inc/cabletermination.html' with termination=cp.get_cable_peer %} - {% else %} - - Not connected - - {% endif %} - - {# Connection #} - {% include 'dcim/inc/endpoint_connection.html' with path=cp.path %} - - {# Actions #} - - {% if cp.cable %} - {% include 'dcim/inc/cable_toggle_buttons.html' with cable=cp.cable %} - {% elif perms.dcim.add_cable %} - - - - - {% endif %} - {% if perms.dcim.change_consoleport %} - - - - {% endif %} - {% if perms.dcim.delete_consoleport %} - {% if cp.connected_endpoint %} - - {% else %} - - - - {% endif %} - {% endif %} - - From 60c30b92bab6f745d879feee6e031e755f979874 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 15:01:16 -0400 Subject: [PATCH 04/17] Convert device console server ports list to table --- netbox/dcim/tables/devices.py | 25 +++++- netbox/dcim/tables/template_code.py | 17 ++++ netbox/dcim/views.py | 6 +- netbox/templates/dcim/device.html | 30 ++----- .../templates/dcim/inc/consoleserverport.html | 79 ------------------- 5 files changed, 51 insertions(+), 106 deletions(-) delete mode 100644 netbox/templates/dcim/inc/consoleserverport.html diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 5f61e03ba1..84460a6326 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -11,13 +11,15 @@ TagColumn, ToggleColumn, ) from .template_code import ( - CABLETERMINATION, CONSOLEPORT_BUTTONS, DEVICE_LINK, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, + CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, INTERFACE_IPADDRESSES, + INTERFACE_TAGGED_VLANS, ) __all__ = ( 'ConsolePortTable', 'ConsoleServerPortTable', 'DeviceConsolePortTable', + 'DeviceConsoleServerPortTable', 'DeviceImportTable', 'DeviceTable', 'DeviceBayTable', @@ -272,6 +274,27 @@ class Meta(DeviceComponentTable.Meta): default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') +class DeviceConsoleServerPortTable(ConsoleServerPortTable): + name = tables.TemplateColumn( + template_code=' {{ value }}' + ) + actions = ButtonsColumn( + model=ConsoleServerPort, + buttons=('edit', 'delete'), + prepend_template=CONSOLESERVERPORT_BUTTONS + ) + + class Meta(DeviceComponentTable.Meta): + model = ConsoleServerPort + fields = ( + 'pk', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'connection', 'tags', 'actions' + ) + default_columns = ('pk', 'name', 'label', 'type', 'description', 'cable', 'cable_peer', 'actions') + row_attrs = { + 'class': lambda record: record.cable.get_status_class() if record.cable else '' + } + + class PowerPortTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:powerport_list' diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index e17a5a8772..5e2b7e1c6d 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -94,3 +94,20 @@ {% endif %} """ + +CONSOLESERVERPORT_BUTTONS = """ +{% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} +{% elif perms.dcim.add_cable %} + + + + +{% endif %} +""" diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 3cf011503a..0de6804204 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1029,6 +1029,10 @@ def get(self, request, pk): ).prefetch_related( 'cable', '_path__destination', ) + consoleserverport_table = tables.DeviceConsoleServerPortTable(consoleserverports, orderable=False) + if request.user.has_perm('dcim.change_consoleserverport') or \ + request.user.has_perm('dcim.delete_consoleserverport'): + consoleserverport_table.columns.show('pk') # Power ports powerports = PowerPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( @@ -1083,7 +1087,7 @@ def get(self, request, pk): return render(request, 'dcim/device.html', { 'device': device, 'consoleport_table': consoleport_table, - 'consoleserverports': consoleserverports, + 'consoleserverport_table': consoleserverport_table, 'powerports': powerports, 'poweroutlets': poweroutlets, 'interfaces': interfaces, diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 1a74016b29..962d1127f6 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -134,7 +134,7 @@

    {{ device }}

    Console Ports {% badge consoleport_table.rows|length %}
  • - Console Server Ports {% badge consoleserverports|length %} + Console Server Ports {% badge consoleserverport_table.rows|length %}
  • Power Ports {% badge powerports|length %} @@ -707,29 +707,9 @@

    {{ device }}

    Console Server Ports
    - - - - {% if perms.dcim.change_consoleserverport or perms.dcim.delete_consoleserverport %} - - {% endif %} - - - - - - - - - - - {% for csp in consoleserverports %} - {% include 'dcim/inc/consoleserverport.html' %} - {% endfor %} - -
    NameTypeDescriptionCableCable TerminationConnection
    + {% include 'responsive_table.html' with table=consoleserverport_table %} -
    {% endif %} +
    diff --git a/netbox/templates/dcim/inc/consoleserverport.html b/netbox/templates/dcim/inc/consoleserverport.html deleted file mode 100644 index 025b0bf028..0000000000 --- a/netbox/templates/dcim/inc/consoleserverport.html +++ /dev/null @@ -1,79 +0,0 @@ -{% load helpers %} - - - - {# Checkbox #} - {% if perms.dcim.change_consoleserverport or perms.dcim.delete_consoleserverport %} - - - - {% endif %} - - {# Name #} - - - {{ csp }} - - - {# Type #} - - {% if csp.type %}{{ csp.get_type_display }}{% else %}—{% endif %} - - - {# Description #} - - {{ csp.description|placeholder }} - - - {# Cable #} - {% if csp.cable %} - - {{ csp.cable }} - - - - - {% include 'dcim/inc/cabletermination.html' with termination=csp.get_cable_peer %} - {% else %} - - Not connected - - {% endif %} - - {# Connection #} - {% include 'dcim/inc/endpoint_connection.html' with path=csp.path %} - - {# Actions #} - - {% if csp.cable %} - {% include 'dcim/inc/cable_toggle_buttons.html' with cable=csp.cable %} - {% elif perms.dcim.add_cable %} - - - - - {% endif %} - {% if perms.dcim.change_consoleserverport %} - - - - {% endif %} - {% if perms.dcim.delete_consoleserverport %} - {% if csp.connected_endpoint %} - - {% else %} - - - - {% endif %} - {% endif %} - - From 3a47e0e2edb68d5ab1f44bfe5449bf5d224bf433 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 15:09:23 -0400 Subject: [PATCH 05/17] Convert device power ports list to table --- netbox/dcim/tables/devices.py | 32 ++++++++- netbox/dcim/tables/template_code.py | 16 +++++ netbox/dcim/views.py | 5 +- netbox/templates/dcim/device.html | 26 ++------ netbox/templates/dcim/inc/powerport.html | 82 ------------------------ 5 files changed, 53 insertions(+), 108 deletions(-) delete mode 100644 netbox/templates/dcim/inc/powerport.html diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 84460a6326..92d2be1381 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -12,18 +12,19 @@ ) from .template_code import ( CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, INTERFACE_IPADDRESSES, - INTERFACE_TAGGED_VLANS, + INTERFACE_TAGGED_VLANS, POWERPORT_BUTTONS, ) __all__ = ( 'ConsolePortTable', 'ConsoleServerPortTable', + 'DeviceBayTable', 'DeviceConsolePortTable', 'DeviceConsoleServerPortTable', 'DeviceImportTable', - 'DeviceTable', - 'DeviceBayTable', + 'DevicePowerPortTable', 'DeviceRoleTable', + 'DeviceTable', 'FrontPortTable', 'InterfaceTable', 'InventoryItemTable', @@ -309,6 +310,31 @@ class Meta(DeviceComponentTable.Meta): default_columns = ('pk', 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') +class DevicePowerPortTable(PowerPortTable): + name = tables.TemplateColumn( + template_code=' {{ value }}' + ) + actions = ButtonsColumn( + model=PowerPort, + buttons=('edit', 'delete'), + prepend_template=POWERPORT_BUTTONS + ) + + class Meta(DeviceComponentTable.Meta): + model = PowerPort + fields = ( + 'pk', 'name', 'label', 'type', 'description', 'maximum_draw', 'allocated_draw', 'cable', 'cable_peer', + 'connection', 'tags', 'actions', + ) + default_columns = ( + 'pk', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'cable', 'cable_peer', + 'actions', + ) + row_attrs = { + 'class': lambda record: record.cable.get_status_class() if record.cable else '' + } + + class PowerOutletTable(DeviceComponentTable, PathEndpointTable): tags = TagColumn( url_name='dcim:poweroutlet_list' diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 5e2b7e1c6d..121b33bd32 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -111,3 +111,19 @@ {% endif %} """ + +POWERPORT_BUTTONS = """ +{% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} +{% elif perms.dcim.add_cable %} + + + + +{% endif %} +""" diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0de6804204..aa00ad1ffc 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1038,6 +1038,9 @@ def get(self, request, pk): powerports = PowerPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'cable', '_path__destination', ) + powerport_table = tables.DevicePowerPortTable(powerports, orderable=False) + if request.user.has_perm('dcim.change_powerport') or request.user.has_perm('dcim.delete_powerport'): + powerport_table.columns.show('pk') # Power outlets poweroutlets = PowerOutlet.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( @@ -1088,7 +1091,7 @@ def get(self, request, pk): 'device': device, 'consoleport_table': consoleport_table, 'consoleserverport_table': consoleserverport_table, - 'powerports': powerports, + 'powerport_table': powerport_table, 'poweroutlets': poweroutlets, 'interfaces': interfaces, 'frontports': frontports, diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 962d1127f6..d9c1e55b8d 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -137,7 +137,7 @@

    {{ device }}

    Console Server Ports {% badge consoleserverport_table.rows|length %}
  • - Power Ports {% badge powerports|length %} + Power Ports {% badge powerport_table.rows|length %}
  • Power Outlets {% badge poweroutlets|length %} @@ -744,27 +744,9 @@

    {{ device }}

    Power Ports
    - - - - {% if perms.dcim.change_consoleport or perms.dcim.delete_consoleport %} - - {% endif %} - - - - - - - - - - {% for pp in powerports %} - {% include 'dcim/inc/powerport.html' %} - {% endfor %} -
    NameTypeDrawDescriptionCableConnection
    + {% include 'responsive_table.html' with table=powerport_table %}
  • - Power Outlets {% badge poweroutlets|length %} + Power Outlets {% badge poweroutlet_table.rows|length %}
  • Device Bays {% badge devicebays|length %} @@ -780,29 +780,9 @@

    {{ device }}

    Power Outlets
    - - - - {% if perms.dcim.change_poweroutlet or perms.dcim.delete_poweroutlet %} - - {% endif %} - - - - - - - - - - - {% for po in poweroutlets %} - {% include 'dcim/inc/poweroutlet.html' %} - {% endfor %} - -
    NameTypeInput/LegDescriptionCableConnection
    + {% include 'responsive_table.html' with table=poweroutlet_table %}
  • - Front Ports {% badge frontports|length %} + Front Ports {% badge frontport_table.rows|length %}
  • Rear Ports {% badge rearports|length %} @@ -542,8 +542,8 @@

    {{ device }}

    Add interfaces -
    {% endif %} +
    @@ -555,28 +555,7 @@

    {{ device }}

    Front Ports
    - - - - {% if perms.dcim.change_frontport or perms.dcim.delete_frontport %} - - {% endif %} - - - - - - - - - - - - {% for frontport in frontports %} - {% include 'dcim/inc/frontport.html' %} - {% endfor %} - -
    NameTypeRear PortPositionDescriptionCableCable Termination
    + {% include 'responsive_table.html' with table=frontport_table %} -
    {% endif %} +
    @@ -657,8 +636,8 @@

    {{ device }}

    Add rear ports -
    {% endif %} +
    @@ -804,8 +783,8 @@

    {{ device }}

    Add power outlets -
    {% endif %} +
    @@ -857,8 +836,8 @@

    {{ device }}

    Add device bays -
    {% endif %} +
    diff --git a/netbox/templates/dcim/inc/frontport.html b/netbox/templates/dcim/inc/frontport.html deleted file mode 100644 index 91374cb1eb..0000000000 --- a/netbox/templates/dcim/inc/frontport.html +++ /dev/null @@ -1,72 +0,0 @@ -{% load helpers %} - - - {# Checkbox #} - {% if perms.dcim.change_frontport or perms.dcim.delete_frontport %} - - - - {% endif %} - - {# Name #} - - - {{ frontport }} - - - {# Type #} - {{ frontport.get_type_display }} - - {# Rear port #} - {{ frontport.rear_port }} - {{ frontport.rear_port_position }} - - {# Description #} - {{ frontport.description|placeholder }} - - {# Cable #} - {% if frontport.cable %} - - {{ frontport.cable }} - - - - - {% include 'dcim/inc/cabletermination.html' with termination=frontport.get_cable_peer %} - {% else %} - - Not connected - - {% endif %} - - {# Actions #} - - {% if frontport.cable %} - {% include 'dcim/inc/cable_toggle_buttons.html' with cable=frontport.cable %} - {% elif perms.dcim.add_cable %} - - - - - {% endif %} - {% if perms.dcim.change_frontport %} - - - - {% endif %} - {% if perms.dcim.delete_frontport %} - - - - {% endif %} - - From e3f98a011c16e9543f9b5ab3ee62744ceb28c82a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 15:33:39 -0400 Subject: [PATCH 08/17] Convert device rear ports list to table --- netbox/dcim/tables/devices.py | 28 +++++++++- netbox/dcim/tables/template_code.py | 18 +++++++ netbox/dcim/views.py | 5 +- netbox/templates/dcim/device.html | 32 +++--------- netbox/templates/dcim/inc/rearport.html | 69 ------------------------- 5 files changed, 55 insertions(+), 97 deletions(-) delete mode 100644 netbox/templates/dcim/inc/rearport.html diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 95e459a475..d77b2cc888 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -12,7 +12,7 @@ ) from .template_code import ( CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, FRONTPORT_BUTTONS, - INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS, + INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS, REARPORT_BUTTONS, ) __all__ = ( @@ -25,6 +25,7 @@ 'DeviceImportTable', 'DevicePowerPortTable', 'DevicePowerOutletTable', + 'DeviceRearPortTable', 'DeviceRoleTable', 'DeviceTable', 'FrontPortTable', @@ -458,6 +459,31 @@ class Meta(DeviceComponentTable.Meta): default_columns = ('pk', 'device', 'name', 'label', 'type', 'description') +class DeviceRearPortTable(RearPortTable): + name = tables.TemplateColumn( + template_code=' ' + '{{ value }}' + ) + actions = ButtonsColumn( + model=RearPort, + buttons=('edit', 'delete'), + prepend_template=REARPORT_BUTTONS + ) + + class Meta(DeviceComponentTable.Meta): + model = RearPort + fields = ( + 'pk', 'name', 'label', 'type', 'positions', 'description', 'cable', 'cable_peer', 'connection', 'tags', + 'actions', + ) + default_columns = ( + 'pk', 'name', 'label', 'type', 'positions', 'description', 'cable', 'cable_peer', 'actions', + ) + row_attrs = { + 'class': lambda record: record.cable.get_status_class() if record.cable else '' + } + + class DeviceBayTable(DeviceComponentTable): installed_device = tables.Column( linkify=True diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index e7182e1da5..9d717f794d 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -157,3 +157,21 @@ {% endif %} """ + +REARPORT_BUTTONS = """ +{% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} +{% elif perms.dcim.add_cable %} + + + + +{% endif %} +""" diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 1056a8078e..c09b6cca5b 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1067,6 +1067,9 @@ def get(self, request, pk): # Rear ports rearports = RearPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related('cable') + rearport_table = tables.DeviceRearPortTable(rearports, orderable=False) + if request.user.has_perm('dcim.change_rearport') or request.user.has_perm('dcim.delete_rearport'): + rearport_table.columns.show('pk') # Device bays devicebays = DeviceBay.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( @@ -1101,7 +1104,7 @@ def get(self, request, pk): 'poweroutlet_table': poweroutlet_table, 'interfaces': interfaces, 'frontport_table': frontport_table, - 'rearports': rearports, + 'rearport_table': rearport_table, 'devicebays': devicebays, 'inventoryitems': inventoryitems, 'services': services, diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 94f66b3458..693f3ccf83 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -128,7 +128,7 @@

    {{ device }}

    Front Ports {% badge frontport_table.rows|length %}
  • - Rear Ports {% badge rearports|length %} + Rear Ports {% badge rearport_table.rows|length %}
  • Console Ports {% badge consoleport_table.rows|length %} @@ -557,7 +557,7 @@

    {{ device }}

    {% include 'responsive_table.html' with table=frontport_table %}
  • - Interfaces {% badge interfaces|length %} + Interfaces {% badge interface_table.rows|length %}
  • Front Ports {% badge frontport_table.rows|length %} @@ -494,29 +494,7 @@

    {{ device }}

    - - - - {% if perms.dcim.change_interface or perms.dcim.delete_interface %} - - {% endif %} - - - - - - - - - - - - - {% for iface in interfaces %} - {% include 'dcim/inc/interface.html' %} - {% endfor %} - -
    NameLAGDescriptionMTUModeCableCable TerminationConnection
    + {% include 'responsive_table.html' with table=interface_table %}
  • - Device Bays {% badge devicebays|length %} + Device Bays {% badge devicebay_table.rows|length %}
  • Inventory {% badge inventoryitems|length %} @@ -754,36 +754,14 @@

    {{ device }}

    Device Bays
    - - - - {% if perms.dcim.change_devicebay or perms.dcim.delete_devicebay %} - - {% endif %} - - - - - - - - - {% for devicebay in devicebays %} - {% include 'dcim/inc/devicebay.html' %} - {% empty %} - - - - {% endfor %} - -
    NameStatusDescriptionInstalled Device
    — No device bays defined —
    + {% include 'responsive_table.html' with table=devicebay_table %}
  • - Inventory {% badge inventoryitems|length %} + Inventory {% badge inventoryitem_table.rows|length %}
  • @@ -785,28 +785,7 @@

    {{ device }}

    Inventory Items
    - - - - {% if perms.dcim.change_inventoryitem or perms.dcim.delete_inventoryitem %} - - {% endif %} - - - - - - - - - - - - {% for item in inventoryitems %} - {% include 'dcim/inc/inventoryitem.html' %} - {% endfor %} - -
    NameManufacturerPart IDSerial NumberAsset TagDiscoveredDescription
    + {% include 'responsive_table.html' with table=inventoryitem_table %} {% endif %} +
    diff --git a/netbox/templates/dcim/inc/inventoryitem.html b/netbox/templates/dcim/inc/inventoryitem.html deleted file mode 100644 index f7309fa59e..0000000000 --- a/netbox/templates/dcim/inc/inventoryitem.html +++ /dev/null @@ -1,40 +0,0 @@ -{% load helpers %} - - - {# Checkbox #} - {% if perms.dcim.change_inventoryitem or perms.dcim.delete_inventoryitem %} - - - - {% endif %} - - - {{ item }} - - - {% if item.manufacturer %} - {{ item.manufacturer }} - {% else %} - - {% endif %} - - {{ item.part_id|placeholder }} - {{ item.serial|placeholder }} - {{ item.asset_tag|placeholder }} - - {% if item.discovered %} - - {% else %} - - {% endif %} - - {{ item.description|placeholder }} - - {% if perms.dcim.change_inventoryitem %} - - {% endif %} - {% if perms.dcim.delete_inventoryitem %} - - {% endif %} - - From 51821818e0c39e88f74b6402be72e8a1681da8b2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 16:14:05 -0400 Subject: [PATCH 12/17] Add cable trace buttons --- netbox/dcim/tables/template_code.py | 39 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index ac8ecca76d..6041747018 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -80,6 +80,7 @@ CONSOLEPORT_BUTTONS = """ {% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} @@ -97,6 +98,7 @@ CONSOLESERVERPORT_BUTTONS = """ {% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} @@ -114,6 +116,7 @@ POWERPORT_BUTTONS = """ {% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} @@ -130,6 +133,7 @@ POWEROUTLET_BUTTONS = """ {% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} @@ -144,27 +148,27 @@ {% endif %} -{% if perms.dcim.change_interface %} - {% if record.cable %} - {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} - {% elif record.is_connectable and perms.dcim.add_cable %} - - - - - {% endif %} +{% if record.cable %} + + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} +{% elif record.is_connectable and perms.dcim.add_cable %} + + + + {% endif %} """ FRONTPORT_BUTTONS = """ -{% if frontport.cable %} +{% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} @@ -185,6 +189,7 @@ REARPORT_BUTTONS = """ {% if record.cable %} + {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} {% elif perms.dcim.add_cable %} From 0a67926012f51a6ecef39e5b2c851721c7b55ba9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 16:33:08 -0400 Subject: [PATCH 13/17] Fix up missing table columns --- netbox/dcim/tables/devices.py | 36 ++++++++++++++++++++--------- netbox/dcim/tables/template_code.py | 10 ++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index e318babb09..185ad9b32e 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -11,9 +11,9 @@ TagColumn, ToggleColumn, ) from .template_code import ( - CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, DEVICEBAY_BUTTONS, FRONTPORT_BUTTONS, - INTERFACE_BUTTONS, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS, - REARPORT_BUTTONS, + CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, DEVICEBAY_BUTTONS, DEVICEBAY_STATUS, + FRONTPORT_BUTTONS, INTERFACE_BUTTONS, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, + POWERPORT_BUTTONS, REARPORT_BUTTONS, ) __all__ = ( @@ -343,6 +343,9 @@ class Meta(DeviceComponentTable.Meta): class PowerOutletTable(DeviceComponentTable, PathEndpointTable): + power_port = tables.Column( + linkify=True + ) tags = TagColumn( url_name='dcim:poweroutlet_list' ) @@ -415,6 +418,10 @@ class DeviceInterfaceTable(InterfaceTable): '{% elif iface.is_virtual %}circle{% elif iface.is_wireless %}wifi{% else %}exchange' '{% endif %}"> {{ value }}' ) + lag = tables.Column( + linkify=True, + verbose_name='LAG' + ) actions = ButtonsColumn( model=Interface, buttons=('edit', 'delete'), @@ -424,11 +431,11 @@ class DeviceInterfaceTable(InterfaceTable): class Meta(DeviceComponentTable.Meta): model = Interface fields = ( - 'pk', 'name', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'description', 'cable', - 'cable_peer', 'connection', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', 'actions', + 'pk', 'name', 'label', 'enabled', 'lag', 'type', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'description', + 'cable', 'cable_peer', 'connection', 'tags', 'ip_addresses', 'untagged_vlan', 'tagged_vlans', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'type', 'enabled', 'description', 'cable', 'cable_peer', 'actions', + 'pk', 'name', 'label', 'enabled', 'lag', 'type', 'description', 'cable', 'cable_peer', 'actions', ) row_attrs = { 'class': lambda record: record.cable.get_status_class() if record.cable else '' @@ -439,6 +446,9 @@ class FrontPortTable(DeviceComponentTable, CableTerminationTable): rear_port_position = tables.Column( verbose_name='Position' ) + rear_port = tables.Column( + linkify=True + ) tags = TagColumn( url_name='dcim:frontport_list' ) @@ -514,6 +524,9 @@ class Meta(DeviceComponentTable.Meta): class DeviceBayTable(DeviceComponentTable): + status = tables.TemplateColumn( + template_code=DEVICEBAY_STATUS + ) installed_device = tables.Column( linkify=True ) @@ -523,8 +536,8 @@ class DeviceBayTable(DeviceComponentTable): class Meta(DeviceComponentTable.Meta): model = DeviceBay - fields = ('pk', 'device', 'name', 'label', 'installed_device', 'description', 'tags') - default_columns = ('pk', 'device', 'name', 'label', 'installed_device', 'description') + fields = ('pk', 'device', 'name', 'label', 'status', 'installed_device', 'description', 'tags') + default_columns = ('pk', 'device', 'name', 'label', 'status', 'installed_device', 'description') class DeviceDeviceBayTable(DeviceBayTable): @@ -541,10 +554,10 @@ class DeviceDeviceBayTable(DeviceBayTable): class Meta(DeviceComponentTable.Meta): model = DeviceBay fields = ( - 'pk', 'name', 'label', 'installed_device', 'description', 'tags', 'actions', + 'pk', 'name', 'label', 'status', 'installed_device', 'description', 'tags', 'actions', ) default_columns = ( - 'pk', 'name', 'label', 'installed_device', 'description', 'actions', + 'pk', 'name', 'label', 'status', 'installed_device', 'description', 'actions', ) @@ -580,7 +593,8 @@ class DeviceInventoryItemTable(DeviceBayTable): class Meta(DeviceComponentTable.Meta): model = InventoryItem fields = ( - 'pk', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'tags', 'actions', + 'pk', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'discovered', + 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', 'actions', diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 6041747018..fcfeb01471 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -28,6 +28,16 @@ """ +DEVICEBAY_STATUS = """ +{% if record.installed_device_id %} + + {{ record.installed_device.get_status_display }} + +{% else %} + Vacant +{% endif %} +""" + INTERFACE_IPADDRESSES = """ {% for ip in record.ip_addresses.unrestricted %} {{ ip }}
    From a969b81e6313e0eab2e82d71e8ab10603d35fcfa Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 16:36:12 -0400 Subject: [PATCH 14/17] Change color for edit button --- netbox/utilities/tables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 24a8284f12..5fd3a3a79d 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -142,7 +142,7 @@ class ButtonsColumn(tables.TemplateColumn): {{% endif %}} {{% if "edit" in buttons and perms.{app_label}.change_{model_name} %}} - + {{% endif %}} From 00caa368c58a7646349aa26855790ac734ba60ac Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 16:40:21 -0400 Subject: [PATCH 15/17] Remove interface IPs toggle --- netbox/project-static/js/interface_toggles.js | 13 ------------- netbox/templates/dcim/device.html | 5 ----- netbox/templates/virtualization/virtualmachine.html | 5 ----- 3 files changed, 23 deletions(-) diff --git a/netbox/project-static/js/interface_toggles.js b/netbox/project-static/js/interface_toggles.js index df8ac064b7..bf205b92a1 100644 --- a/netbox/project-static/js/interface_toggles.js +++ b/netbox/project-static/js/interface_toggles.js @@ -1,16 +1,3 @@ -// Toggle the display of IP addresses under interfaces -$('button.toggle-ips').click(function() { - var selected = $(this).attr('selected'); - if (selected) { - $('#interfaces_table tr.interface:visible + tr.ipaddresses').hide(); - } else { - $('#interfaces_table tr.interface:visible + tr.ipaddresses').show(); - } - $(this).attr('selected', !selected); - $(this).children('span').toggleClass('glyphicon-check glyphicon-unchecked'); - return false; -}); - // Inteface filtering $('input.interface-filter').on('input', function() { var filter = new RegExp(this.value); diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index d7b35d3d76..7253bdcae0 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -485,11 +485,6 @@

    {{ device }}

    Interfaces -
    - -
    diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html index 7eabcf5049..b72eec571b 100644 --- a/netbox/templates/virtualization/virtualmachine.html +++ b/netbox/templates/virtualization/virtualmachine.html @@ -276,11 +276,6 @@

    {% block title %}{{ virtualmachine }}{% endblock %}

    Interfaces -
    - -
    From 502b66367c176db17e92694eed6e3c2453a1a73a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 16 Oct 2020 17:01:55 -0400 Subject: [PATCH 16/17] Convert VM interfaces list to table --- .../virtualization/inc/vminterface.html | 136 ------------------ .../virtualization/virtualmachine.html | 25 +--- netbox/virtualization/tables.py | 34 +++++ netbox/virtualization/views.py | 8 +- 4 files changed, 41 insertions(+), 162 deletions(-) delete mode 100644 netbox/templates/virtualization/inc/vminterface.html diff --git a/netbox/templates/virtualization/inc/vminterface.html b/netbox/templates/virtualization/inc/vminterface.html deleted file mode 100644 index 93efafb5ab..0000000000 --- a/netbox/templates/virtualization/inc/vminterface.html +++ /dev/null @@ -1,136 +0,0 @@ -{% load helpers %} - - - {# Checkbox #} - {% if perms.virtualization.change_vminterface or perms.virtualization.delete_vminterface %} - - - - {% endif %} - - {# Name #} - - {{ iface }} - - - {# MAC address #} - - {{ iface.mac_address|default:"—" }} - - - {# MTU #} - {{ iface.mtu|default:"—" }} - - {# 802.1Q mode #} - {{ iface.get_mode_display|default:"—" }} - - {# Description/tags #} - - {% if iface.description %} - {{ iface.description }}
    - {% endif %} - {% for tag in iface.tags.all %} - {% tag tag %} - {% empty %} - {% if not iface.description %}—{% endif %} - {% endfor %} - - - {# Buttons #} - - {% if perms.ipam.add_ipaddress %} - - - - {% endif %} - {% if perms.virtualization.change_vminterface %} - - - - {% endif %} - {% if perms.virtualization.delete_vminterface %} - - - - {% endif %} - - - -{% with ipaddresses=iface.ip_addresses.all %} - {% if ipaddresses %} - - {# Placeholder #} - {% if perms.virtualization.change_vminterface or perms.virtualization.delete_vminterface %} - - {% endif %} - - {# IP addresses table #} - - - - - - - - - - - - {% for ip in iface.ip_addresses.all %} - - - {# IP address #} - - - {# Primary/status/role #} - - - {# VRF #} - - - {# Description #} - - - {# Buttons #} - - - - {% endfor %} -
    IP AddressStatus/RoleVRFDescription
    - {{ ip }} - - {% if virtualmachine.primary_ip4 == ip or virtualmachine.primary_ip6 == ip %} - Primary - {% endif %} - {{ ip.get_status_display }} - {% if ip.role %} - {{ ip.get_role_display }} - {% endif %} - - {% if ip.vrf %} - {{ ip.vrf.name }} - {% else %} - Global - {% endif %} - - {% if ip.description %} - {{ ip.description }} - {% else %} - - {% endif %} - - {% if perms.ipam.change_ipaddress %} - - - - {% endif %} - {% if perms.ipam.delete_ipaddress %} - - - - {% endif %} -
    - - - {% endif %} -{% endwith %} diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html index b72eec571b..a2213aee1f 100644 --- a/netbox/templates/virtualization/virtualmachine.html +++ b/netbox/templates/virtualization/virtualmachine.html @@ -280,30 +280,7 @@

    {% block title %}{{ virtualmachine }}{% endblock %}

    - - - - {% if perms.virtualization.change_vminterface or perms.virtualization.delete_vminterface %} - - {% endif %} - - - - - - - - - - {% for iface in interfaces %} - {% include 'virtualization/inc/vminterface.html' %} - {% empty %} - - - - {% endfor %} - -
    NameMAC AddressMTUModeDescription
    — No interfaces defined —
    + {% include 'responsive_table.html' with table=vminterface_table %} {% if perms.virtualization.add_vminterface or perms.virtualization.delete_vminterface %}