From 2b8284cb06352a055f8b36ad115e2066f4af5e9b Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 28 Jul 2023 11:17:35 -0500 Subject: [PATCH 1/2] Add `vc_interfaces` flag to control interface queryset --- netbox/dcim/filtersets.py | 20 +++++++------------- netbox/dcim/forms/model_forms.py | 3 +++ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 5ddaf9a9a..33259401d 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1440,7 +1440,7 @@ class InterfaceFilterSet( label=_('Device'), ) device_id = MultiValueNumberFilter( - method='filter_device_id', + method='filter_device', field_name='pk', label=_('Device (ID)'), ) @@ -1511,22 +1511,16 @@ class InterfaceFilterSet( ] def filter_device(self, queryset, name, value): - try: - devices = Device.objects.filter(**{'{}__in'.format(name): value}) - vc_interface_ids = [] - for device in devices: - 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_device_id(self, queryset, name, id_list): # Include interfaces belonging to peer virtual chassis members vc_interface_ids = [] try: - devices = Device.objects.filter(pk__in=id_list) + devices = Device.objects.filter(**{'{}__in'.format(name): value}) for device in devices: - vc_interface_ids += device.vc_interfaces(if_master=False).values_list('id', flat=True) + # Hack to show all VC member interfaces when requested + if '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() diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 219216045..36ed844df 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1052,6 +1052,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): label=_('Parent interface'), query_params={ 'device_id': '$device', + 'vc_interfaces': 'all', } ) bridge = DynamicModelChoiceField( @@ -1060,6 +1061,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): label=_('Bridged interface'), query_params={ 'device_id': '$device', + 'vc_interfaces': 'all', } ) lag = DynamicModelChoiceField( @@ -1068,6 +1070,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): label=_('LAG interface'), query_params={ 'device_id': '$device', + 'vc_interfaces': 'all', 'type': 'lag', } ) From 1f01dbc0e6e48412176c56dd78d24422a0bd7bd1 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 28 Jul 2023 13:18:30 -0500 Subject: [PATCH 2/2] Fix test failure --- netbox/dcim/filtersets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 33259401d..45428e8d6 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1517,7 +1517,7 @@ class InterfaceFilterSet( devices = Device.objects.filter(**{'{}__in'.format(name): value}) for device in devices: # Hack to show all VC member interfaces when requested - if 'vc_interfaces' in self.request.GET.keys(): + 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))