From ba9f6bf3597c43f8c1c2b1edf08fc9653a2542a6 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 5 Feb 2026 11:16:31 -0500 Subject: [PATCH] Fixes: #19129 - Richer display of MAC addresses in InterfaceTable when multiple MACs are present (#21270) * Richer display of MAC addresses in InterfaceTable when multiple MACs are present * Fix docstring * Fix docstring * Use mac_address_display in interface detail page * Ensure "-" null placeholder still shows up on detail page * Also include vminterface.html * Simplify Multiple MAC addresses with additional selectable column for tables in list view and detail view * Use ManyToManyColumn --- netbox/dcim/tables/devices.py | 37 ++++++++++++------- .../templates/virtualization/vminterface.html | 4 +- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 859c5d573..08cfbc92f 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -584,6 +584,15 @@ class BaseInterfaceTable(NetBoxTable): orderable=False, verbose_name=_('IP Addresses') ) + primary_mac_address = tables.Column( + verbose_name=_('Primary MAC'), + linkify=True + ) + mac_addresses = columns.ManyToManyColumn( + orderable=False, + linkify_item=True, + verbose_name=_('MAC Addresses') + ) fhrp_groups = tables.TemplateColumn( accessor=Accessor('fhrp_group_assignments'), template_code=INTERFACE_FHRPGROUPS, @@ -615,10 +624,6 @@ class BaseInterfaceTable(NetBoxTable): verbose_name=_('Q-in-Q SVLAN'), linkify=True ) - primary_mac_address = tables.Column( - verbose_name=_('MAC Address'), - linkify=True - ) def value_ip_addresses(self, value): return ",".join([str(obj.address) for obj in value.all()]) @@ -681,11 +686,12 @@ class InterfaceTable(BaseInterfaceTable, ModularDeviceComponentTable, PathEndpoi model = models.Interface fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', - 'speed', 'speed_formatted', 'duplex', 'mode', 'primary_mac_address', 'wwn', 'poe_mode', 'poe_type', - 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', - 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', - 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', - 'qinq_svlan', 'inventory_items', 'created', 'last_updated', 'vlan_translation_policy' + 'speed', 'speed_formatted', 'duplex', 'mode', 'mac_addresses', 'primary_mac_address', 'wwn', + 'poe_mode', 'poe_type', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', + 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', + 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', + 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'inventory_items', 'created', 'last_updated', + 'vlan_translation_policy', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') @@ -746,10 +752,11 @@ class DeviceInterfaceTable(InterfaceTable): model = models.Interface fields = ( 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', - 'mgmt_only', 'mtu', 'mode', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', - 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', - 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', - 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', + 'mgmt_only', 'mtu', 'mode', 'mac_addresses', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', + 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', + 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', + 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', + 'actions', ) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', @@ -1199,4 +1206,6 @@ class MACAddressTable(PrimaryModelTable): 'pk', 'id', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description', 'is_primary', 'comments', 'tags', 'created', 'last_updated', ) - default_columns = ('pk', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description') + default_columns = ( + 'pk', 'mac_address', 'is_primary', 'assigned_object_parent', 'assigned_object', 'description', + ) diff --git a/netbox/templates/virtualization/vminterface.html b/netbox/templates/virtualization/vminterface.html index b3e0061b7..b8ae28c5d 100644 --- a/netbox/templates/virtualization/vminterface.html +++ b/netbox/templates/virtualization/vminterface.html @@ -78,8 +78,8 @@ {% trans "MAC Address" %} - {% if object.mac_address %} - {{ object.mac_address }} + {% if object.primary_mac_address %} + {{ object.primary_mac_address|linkify }} {% trans "Primary" %} {% else %} {{ ''|placeholder }}