diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index d77b2cc88..83de5ca0f 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -11,7 +11,7 @@ from utilities.tables import ( TagColumn, ToggleColumn, ) from .template_code import ( - CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, FRONTPORT_BUTTONS, + CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, FRONTPORT_BUTTONS, INTERFACE_BUTTONS, INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS, REARPORT_BUTTONS, ) @@ -23,6 +23,7 @@ __all__ = ( 'DeviceConsoleServerPortTable', 'DeviceFrontPortTable', 'DeviceImportTable', + 'DeviceInterfaceTable', 'DevicePowerPortTable', 'DevicePowerOutletTable', 'DeviceRearPortTable', @@ -405,6 +406,32 @@ class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, PathEndpointTable default_columns = ('pk', 'device', 'name', 'label', 'enabled', 'type', 'description') +class DeviceInterfaceTable(InterfaceTable): + name = tables.TemplateColumn( + template_code=' {{ value }}' + ) + actions = ButtonsColumn( + model=Interface, + buttons=('edit', 'delete'), + prepend_template=INTERFACE_BUTTONS + ) + + 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', + ) + default_columns = ( + 'pk', 'name', 'label', 'type', 'enabled', 'description', 'cable', 'cable_peer', 'actions', + ) + row_attrs = { + 'class': lambda record: record.cable.get_status_class() if record.cable else '' + } + + class FrontPortTable(DeviceComponentTable, CableTerminationTable): rear_port_position = tables.Column( verbose_name='Position' diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 9d717f794..8bcf87ff9 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -138,6 +138,31 @@ POWEROUTLET_BUTTONS = """ {% endif %} """ +INTERFACE_BUTTONS = """ +{% if perms.ipam.add_ipaddress %} + + + +{% 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 %} +{% endif %} +""" + FRONTPORT_BUTTONS = """ {% if frontport.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %} diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index c09b6cca5..953ef4d99 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1056,6 +1056,9 @@ class DeviceView(ObjectView): Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user)), 'lag', 'cable', '_path__destination', 'tags', ) + interface_table = tables.DeviceInterfaceTable(interfaces, orderable=False) + if request.user.has_perm('dcim.change_interface') or request.user.has_perm('dcim.delete_interface'): + interface_table.columns.show('pk') # Front ports frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( @@ -1102,7 +1105,7 @@ class DeviceView(ObjectView): 'consoleserverport_table': consoleserverport_table, 'powerport_table': powerport_table, 'poweroutlet_table': poweroutlet_table, - 'interfaces': interfaces, + 'interface_table': interface_table, 'frontport_table': frontport_table, 'rearport_table': rearport_table, 'devicebays': devicebays, diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 693f3ccf8..684805cc0 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -122,7 +122,7 @@ + Details
- {% endif %} - | Name | -LAG | -Description | -MTU | -Mode | -Cable | -Cable Termination | -Connection | -- |
---|