From a33b2a64bf4814fafeafcd70222d376dc43fe2e2 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 2 Nov 2022 09:23:57 -0500 Subject: [PATCH] Interface related changes * Add filter fields to filterset for Interface filter * Add form field to filterset form for Interface filter * Add VDC display to interface detail template --- netbox/dcim/filtersets.py | 17 +++++++++++++++++ netbox/dcim/forms/filtersets.py | 11 ++++++++++- netbox/dcim/views.py | 9 +++++++++ netbox/templates/dcim/interface.html | 1 + 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 2e384843c..410bdb161 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1367,6 +1367,23 @@ class InterfaceFilterSet( to_field_name='rd', label='VRF (RD)', ) + vdc_id = django_filters.ModelMultipleChoiceFilter( + field_name='vdcs', + queryset=VirtualDeviceContext.objects.all(), + label='Virtual Device Context', + ) + vdc_identifier = django_filters.ModelMultipleChoiceFilter( + field_name='vdcs__identifier', + queryset=VirtualDeviceContext.objects.all(), + to_field_name='identifier', + label='Virtual Device Context (Identifier)', + ) + vdc = django_filters.ModelMultipleChoiceFilter( + field_name='vdcs__name', + queryset=VirtualDeviceContext.objects.all(), + to_field_name='name', + label='Virtual Device Context', + ) class Meta: model = Interface diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 7714fb0d2..031488f43 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1107,9 +1107,18 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): ('Addressing', ('vrf_id', 'mac_address', 'wwn')), ('PoE', ('poe_mode', 'poe_type')), ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), - ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'virtual_chassis_id', 'device_id')), + ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'virtual_chassis_id', + 'device_id', 'vdc_id')), ('Connection', ('cabled', 'connected', 'occupied')), ) + vdc_id = DynamicModelMultipleChoiceField( + queryset=VirtualDeviceContext.objects.all(), + required=False, + query_params={ + 'device_id': '$device_id', + }, + label=_('Virtual Device Context') + ) kind = MultipleChoiceField( choices=InterfaceKindChoices, required=False diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 50d3a082e..00d1dc0c8 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2441,6 +2441,14 @@ class InterfaceView(generic.ObjectView): queryset = Interface.objects.all() def get_extra_context(self, request, instance): + # Get assigned VDC's + vdc_table = tables.VirtualDeviceContextTable( + data=instance.vdcs.restrict(request.user, 'view').prefetch_related('device'), + exclude=('tenant', 'tenant_group', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments', 'tags', + 'created', 'last_updated', 'actions', ), + orderable=False + ) + # Get assigned IP addresses ipaddress_table = AssignedIPAddressesTable( data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'), @@ -2478,6 +2486,7 @@ class InterfaceView(generic.ObjectView): ) return { + 'vdc_table': vdc_table, 'ipaddress_table': ipaddress_table, 'bridge_interfaces_table': bridge_interfaces_tables, 'child_interfaces_table': child_interfaces_tables, diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index 887433d7b..73d590d3d 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -116,6 +116,7 @@ {% plugin_left_page object %}
+ {% include 'inc/panel_table.html' with table=vdc_table heading="Virtual Device Contexts" %}
Addressing