Skip to content

Commit c0ea63d

Browse files
committed
Simplify Multiple MAC addresses with additional selectable column for tables in list view and detail view
1 parent 087a2ad commit c0ea63d

File tree

5 files changed

+39
-44
lines changed

5 files changed

+39
-44
lines changed

netbox/dcim/models/device_components.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -732,25 +732,6 @@ def mac_address(self):
732732
if self.primary_mac_address:
733733
return self.primary_mac_address.mac_address
734734

735-
@property
736-
def mac_address_display(self):
737-
"""
738-
Rich representation of MAC addresses for use in table columns (e.g. InterfaceTable).
739-
Handles various configurations of MAC addresses for an interface:
740-
11:22:33:44:55:66 <-- Single MAC address on interface, assigned as primary
741-
11:22:33:44:55:66 (2) <-- Multiple MAC addresses on interface, one assigned as primary
742-
2 available <-- 1 or more MAC addresses on interface, none assigned as primary
743-
- <-- No MAC addresses on interface
744-
"""
745-
available_mac_count = self.mac_addresses.count()
746-
if self.primary_mac_address:
747-
if available_mac_count > 1:
748-
return f"{self.primary_mac_address} ({available_mac_count})"
749-
return self.primary_mac_address
750-
if available_mac_count:
751-
return f"{available_mac_count} available"
752-
return None
753-
754735

755736
class Interface(
756737
InterfaceValidationMixin,

netbox/dcim/tables/devices.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,15 @@ class BaseInterfaceTable(NetBoxTable):
583583
orderable=False,
584584
verbose_name=_('IP Addresses')
585585
)
586+
primary_mac_address = tables.Column(
587+
verbose_name=_('MAC Address'),
588+
linkify=True
589+
)
590+
mac_addresses = tables.TemplateColumn(
591+
template_code=INTERFACE_MACADDRESSES,
592+
orderable=False,
593+
verbose_name=_('MAC Addresses')
594+
)
586595
fhrp_groups = tables.TemplateColumn(
587596
accessor=Accessor('fhrp_group_assignments'),
588597
template_code=INTERFACE_FHRPGROUPS,
@@ -614,11 +623,6 @@ class BaseInterfaceTable(NetBoxTable):
614623
verbose_name=_('Q-in-Q SVLAN'),
615624
linkify=True
616625
)
617-
primary_mac_address = tables.Column(
618-
verbose_name=_('MAC Address'),
619-
accessor=Accessor('mac_address_display'),
620-
linkify=True
621-
)
622626

623627
def value_ip_addresses(self, value):
624628
return ",".join([str(obj.address) for obj in value.all()])
@@ -681,11 +685,12 @@ class Meta(DeviceComponentTable.Meta):
681685
model = models.Interface
682686
fields = (
683687
'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu',
684-
'speed', 'speed_formatted', 'duplex', 'mode', 'primary_mac_address', 'wwn', 'poe_mode', 'poe_type',
685-
'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description',
686-
'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection',
687-
'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
688-
'qinq_svlan', 'inventory_items', 'created', 'last_updated', 'vlan_translation_policy'
688+
'speed', 'speed_formatted', 'duplex', 'mode', 'mac_addresses', 'primary_mac_address', 'wwn',
689+
'poe_mode', 'poe_type', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
690+
'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer',
691+
'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups',
692+
'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'inventory_items', 'created', 'last_updated',
693+
'vlan_translation_policy',
689694
)
690695
default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description')
691696

@@ -719,10 +724,11 @@ class Meta(DeviceComponentTable.Meta):
719724
model = models.Interface
720725
fields = (
721726
'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag',
722-
'mgmt_only', 'mtu', 'mode', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency',
723-
'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link',
724-
'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses',
725-
'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions',
727+
'mgmt_only', 'mtu', 'mode', 'mac_addresses', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel',
728+
'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable',
729+
'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf',
730+
'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan',
731+
'actions',
726732
)
727733
default_columns = (
728734
'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses',
@@ -1172,4 +1178,6 @@ class Meta(PrimaryModelTable.Meta):
11721178
'pk', 'id', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description', 'is_primary',
11731179
'comments', 'tags', 'created', 'last_updated',
11741180
)
1175-
default_columns = ('pk', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description')
1181+
default_columns = (
1182+
'pk', 'mac_address', 'is_primary', 'assigned_object_parent', 'assigned_object', 'description',
1183+
)

netbox/dcim/tables/template_code.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@
6262
{% endif %}
6363
"""
6464

65+
INTERFACE_MACADDRESSES = """
66+
{% if value.count > 3 %}
67+
<a href="{% url 'ipam:macaddress_list' %}?{{ record|meta:"model_name" }}_id={{ record.pk }}">{{ value.count }}</a>
68+
{% else %}
69+
{% for mac in value.all %}
70+
<a href="{{ mac.get_absolute_url }}">{{ mac }}</a>
71+
{% endfor %}
72+
{% endif %}
73+
"""
74+
6575
INTERFACE_FHRPGROUPS = """
6676
{% for assignment in value.all %}
6777
<a href="{{ assignment.group.get_absolute_url }}">{{ assignment.group }}</a>

netbox/templates/dcim/interface.html

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,9 @@ <h2 class="card-header">{% trans "Addressing" %}</h2>
143143
<tr>
144144
<th scope="row">{% trans "MAC Address" %}</th>
145145
<td>
146-
{% if object.mac_address_display %}
147-
<span class="font-monospace">{{ object.mac_address_display|linkify }}</span>
148-
{% if object.primary_mac_address %}
149-
<span class="badge text-bg-primary">{% trans "Primary" %}</span>
150-
{% endif %}
146+
{% if object.primary_mac_address %}
147+
<span class="font-monospace">{{ object.primary_mac_address|linkify }}</span>
148+
<span class="badge text-bg-primary">{% trans "Primary" %}</span>
151149
{% else %}
152150
{{ ''|placeholder }}
153151
{% endif %}

netbox/templates/virtualization/vminterface.html

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,9 @@ <h2 class="card-header">{% trans "Addressing" %}</h2>
7878
<tr>
7979
<th scope="row">{% trans "MAC Address" %}</th>
8080
<td>
81-
{% if object.mac_address_display %}
82-
<span class="font-monospace">{{ object.mac_address_display|linkify }}</span>
83-
{% if object.primary_mac_address %}
84-
<span class="badge text-bg-primary">{% trans "Primary" %}</span>
85-
{% endif %}
81+
{% if object.primary_mac_address %}
82+
<span class="font-monospace">{{ object.primary_mac_address|linkify }}</span>
83+
<span class="badge text-bg-primary">{% trans "Primary" %}</span>
8684
{% else %}
8785
{{ ''|placeholder }}
8886
{% endif %}

0 commit comments

Comments
 (0)