From a91c0961011e6a1a505062a15a9f1786b97303f4 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 11 Aug 2023 12:26:59 -0500 Subject: [PATCH] Add new filters instead of using undocumented query params --- netbox/dcim/filtersets.py | 52 ++++++++++++++++++-------------- netbox/dcim/forms/model_forms.py | 9 ++---- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 37b96ec2d..1e85542b1 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1462,16 +1462,37 @@ class InterfaceFilterSet( PathEndpointFilterSet, CommonInterfaceFilterSet ): - # Override device and device_id filters from DeviceComponentFilterSet to match against any peer virtual chassis - # members - device = MultiValueCharFilter( - method='filter_device', - field_name='name', + virtual_chassis_for_device = django_filters.ModelMultipleChoiceFilter( + field_name='device__virtual_chassis__members', + queryset=Device.objects.all(), + to_field_name='name', + label=_('Virtual Chassis Interfaces for Device (ID)') + ) + virtual_chassis_for_device_id = django_filters.ModelMultipleChoiceFilter( + field_name='device__virtual_chassis__members', + queryset=Device.objects.all(), + label=_('Virtual Chassis Interfaces for Device (ID)') + ) + virtual_chassis = django_filters.ModelMultipleChoiceFilter( + field_name='device__virtual_chassis', + queryset=VirtualChassis.objects.all(), + to_field_name='name', + label=_('Virtual Chassis Interfaces') + ) + virtual_chassis_id = django_filters.ModelMultipleChoiceFilter( + field_name='device__virtual_chassis', + queryset=VirtualChassis.objects.all(), + label=_('Virtual Chassis Interfaces (ID)') + ) + device = django_filters.ModelMultipleChoiceFilter( + field_name='device', + queryset=Device.objects.all(), + to_field_name='name', label=_('Device'), ) - device_id = MultiValueNumberFilter( - method='filter_device', - field_name='pk', + device_id = django_filters.ModelMultipleChoiceFilter( + field_name='device', + queryset=Device.objects.all(), label=_('Device (ID)'), ) kind = django_filters.CharFilter( @@ -1540,21 +1561,6 @@ class InterfaceFilterSet( 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'cable_end', ] - def filter_device(self, queryset, name, value): - # Include interfaces belonging to peer virtual chassis members - vc_interface_ids = [] - try: - devices = Device.objects.filter(**{'{}__in'.format(name): value}) - for device in devices: - # Hack to show all VC member interfaces when requested - if self.request is not None and 'vc_interfaces' in self.request.GET.keys(): - vc_interface_ids += device.vc_interfaces(if_master=False).values_list('id', flat=True) - else: - vc_interface_ids.extend(device.vc_interfaces().values_list('id', flat=True)) - return queryset.filter(pk__in=vc_interface_ids) - except Device.DoesNotExist: - return queryset.none() - def filter_kind(self, queryset, name, value): value = value.strip().lower() return { diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index e62fb8b3c..4c8d89519 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1107,8 +1107,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): required=False, label=_('Parent interface'), query_params={ - 'device_id': '$device', - 'vc_interfaces': 'all', + 'virtual_chassis_for_device_id': '$device', } ) bridge = DynamicModelChoiceField( @@ -1116,8 +1115,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): required=False, label=_('Bridged interface'), query_params={ - 'device_id': '$device', - 'vc_interfaces': 'all', + 'virtual_chassis_for_device_id': '$device', } ) lag = DynamicModelChoiceField( @@ -1125,8 +1123,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): required=False, label=_('LAG interface'), query_params={ - 'device_id': '$device', - 'vc_interfaces': 'all', + 'virtual_chassis_for_device_id': '$device', 'type': 'lag', } )