Add new filters instead of using undocumented query params

This commit is contained in:
Daniel Sheppard 2023-08-11 12:26:59 -05:00
parent e35d658d74
commit a91c096101
2 changed files with 32 additions and 29 deletions

View File

@ -1462,16 +1462,37 @@ class InterfaceFilterSet(
PathEndpointFilterSet, PathEndpointFilterSet,
CommonInterfaceFilterSet CommonInterfaceFilterSet
): ):
# Override device and device_id filters from DeviceComponentFilterSet to match against any peer virtual chassis virtual_chassis_for_device = django_filters.ModelMultipleChoiceFilter(
# members field_name='device__virtual_chassis__members',
device = MultiValueCharFilter( queryset=Device.objects.all(),
method='filter_device', to_field_name='name',
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'), label=_('Device'),
) )
device_id = MultiValueNumberFilter( device_id = django_filters.ModelMultipleChoiceFilter(
method='filter_device', field_name='device',
field_name='pk', queryset=Device.objects.all(),
label=_('Device (ID)'), label=_('Device (ID)'),
) )
kind = django_filters.CharFilter( kind = django_filters.CharFilter(
@ -1540,21 +1561,6 @@ class InterfaceFilterSet(
'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'cable_end', '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): def filter_kind(self, queryset, name, value):
value = value.strip().lower() value = value.strip().lower()
return { return {

View File

@ -1107,8 +1107,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('Parent interface'), label=_('Parent interface'),
query_params={ query_params={
'device_id': '$device', 'virtual_chassis_for_device_id': '$device',
'vc_interfaces': 'all',
} }
) )
bridge = DynamicModelChoiceField( bridge = DynamicModelChoiceField(
@ -1116,8 +1115,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('Bridged interface'), label=_('Bridged interface'),
query_params={ query_params={
'device_id': '$device', 'virtual_chassis_for_device_id': '$device',
'vc_interfaces': 'all',
} }
) )
lag = DynamicModelChoiceField( lag = DynamicModelChoiceField(
@ -1125,8 +1123,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('LAG interface'), label=_('LAG interface'),
query_params={ query_params={
'device_id': '$device', 'virtual_chassis_for_device_id': '$device',
'vc_interfaces': 'all',
'type': 'lag', 'type': 'lag',
} }
) )