From beaba088def05409a9ecdb09408e4310fdd02dfd Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Thu, 18 Dec 2025 21:31:33 +0530 Subject: [PATCH 1/3] Fixed #20953: add bridge interfaces to API --- .../dcim/api/serializers_/device_components.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 468d75af968..f4b14cda770 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -1,5 +1,5 @@ -from django.utils.translation import gettext as _ from django.contrib.contenttypes.models import ContentType +from django.utils.translation import gettext as _ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers @@ -183,6 +183,7 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect type = ChoiceField(choices=InterfaceTypeChoices) parent = NestedInterfaceSerializer(required=False, allow_null=True) bridge = NestedInterfaceSerializer(required=False, allow_null=True) + bridge_interfaces = NestedInterfaceSerializer(many=True, read_only=True) lag = NestedInterfaceSerializer(required=False, allow_null=True) mode = ChoiceField(choices=InterfaceModeChoices, required=False, allow_blank=True) duplex = ChoiceField(choices=InterfaceDuplexChoices, required=False, allow_blank=True, allow_null=True) @@ -222,13 +223,13 @@ class Meta: model = Interface fields = [ 'id', 'url', 'display_url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', - 'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'primary_mac_address', 'mac_addresses', 'speed', 'duplex', - 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'poe_mode', 'poe_type', - 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', - 'vlan_translation_policy', 'mark_connected', 'cable', 'cable_end', 'wireless_link', 'link_peers', - 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', - 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', - 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', + 'parent', 'bridge', 'bridge_interfaces', 'lag', 'mtu', 'mac_address', 'primary_mac_address', + 'mac_addresses', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', + 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', + 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', 'mark_connected', 'cable', 'cable_end', + 'wireless_link', 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', + 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', + 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') From db3d5ee691c1fde4d2c9351f1cde553583d69a93 Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Thu, 18 Dec 2025 21:32:06 +0530 Subject: [PATCH 2/3] Fixed #20953: add bridge interfaces to object view page --- netbox/templates/dcim/interface.html | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index f6e34e35519..a90fefd82d9 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -112,6 +112,19 @@

{% trans "Related Interfaces" %}

{% trans "Bridge" %} {{ object.bridge|linkify|placeholder }} + + {% trans "Bridged Interfaces" %} + + {% if object.is_bridge %} + {% for interface in bridge_interfaces %} + {{ interface|linkify }} + {% if not forloop.last %}
{% endif %} + {% endfor %} + {% else %} + {{ ''|placeholder }} + {% endif %} + + {% trans "LAG" %} {{ object.lag|linkify|placeholder }} @@ -438,7 +451,7 @@

{% if object.is_bridge %}
- {% include 'inc/panel_table.html' with table=bridge_interfaces_table heading="Bridge Interfaces" %} + {% include 'inc/panel_table.html' with table=bridge_interfaces_table heading="Bridged Interfaces" %}
{% endif %} From f58d05fb721654834a2a8cad9d6567e613a5e5b8 Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Thu, 18 Dec 2025 21:33:01 +0530 Subject: [PATCH 3/3] Fixed #20953: update extra context to have bridged interfaces --- netbox/dcim/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 1b9b1c5d7fc..08b29a11519 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -13,7 +13,7 @@ from circuits.models import Circuit, CircuitTermination from extras.views import ObjectConfigContextView, ObjectRenderConfigView -from ipam.models import ASN, IPAddress, Prefix, VLANGroup, VLAN +from ipam.models import ASN, IPAddress, Prefix, VLAN, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.object_actions import * from netbox.views import generic @@ -2856,7 +2856,10 @@ def get_extra_context(self, request, instance): vdc_table.configure(request) # Get bridge interfaces - bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance) + bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance).select_related( + 'device', 'module', 'parent', 'bridge', 'lag', 'vrf', 'untagged_vlan', 'qinq_svlan', + 'primary_mac_address' + ).prefetch_related('tagged_vlans', 'wireless_lans', 'vdcs') bridge_interfaces_table = tables.InterfaceTable( bridge_interfaces, exclude=('device', 'parent'), @@ -2899,6 +2902,7 @@ def get_extra_context(self, request, instance): return { 'vdc_table': vdc_table, + 'bridge_interfaces': bridge_interfaces, 'bridge_interfaces_table': bridge_interfaces_table, 'child_interfaces_table': child_interfaces_table, 'vlan_table': vlan_table,