Rename filter and re-introduce virtual_chassis filtering method (required)

This commit is contained in:
Daniel Sheppard 2023-08-21 16:27:20 -05:00
parent e439a57e28
commit 5dba592658
3 changed files with 64 additions and 25 deletions

View File

@ -1462,15 +1462,14 @@ class InterfaceFilterSet(
PathEndpointFilterSet, PathEndpointFilterSet,
CommonInterfaceFilterSet CommonInterfaceFilterSet
): ):
virtual_chassis_for_device = django_filters.ModelMultipleChoiceFilter( virtual_chassis_member = MultiValueCharFilter(
field_name='device__virtual_chassis__members', method='filter_virtual_chassis_member',
queryset=Device.objects.all(), field_name='name',
to_field_name='name', label=_('Virtual Chassis Interfaces for Device')
label=_('Virtual Chassis Interfaces for Device (ID)')
) )
virtual_chassis_for_device_id = django_filters.ModelMultipleChoiceFilter( virtual_chassis_member_id = MultiValueNumberFilter(
field_name='device__virtual_chassis__members', method='filter_virtual_chassis_member',
queryset=Device.objects.all(), field_name='pk',
label=_('Virtual Chassis Interfaces for Device (ID)') label=_('Virtual Chassis Interfaces for Device (ID)')
) )
kind = django_filters.CharFilter( kind = django_filters.CharFilter(
@ -1539,6 +1538,16 @@ 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_virtual_chassis_member(self, queryset, name, value):
try:
vc_interface_ids = []
devices = Device.objects.filter(**{'{}__in'.format(name): value})
for device in devices:
vc_interface_ids.extend(device.vc_interfaces(if_master=False).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,7 +1107,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('Parent interface'), label=_('Parent interface'),
query_params={ query_params={
'virtual_chassis_for_device_id': '$device', 'virtual_chassis_member_id': '$device',
} }
) )
bridge = DynamicModelChoiceField( bridge = DynamicModelChoiceField(
@ -1115,7 +1115,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('Bridged interface'), label=_('Bridged interface'),
query_params={ query_params={
'virtual_chassis_for_device_id': '$device', 'virtual_chassis_member_id': '$device',
} }
) )
lag = DynamicModelChoiceField( lag = DynamicModelChoiceField(
@ -1123,7 +1123,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
required=False, required=False,
label=_('LAG interface'), label=_('LAG interface'),
query_params={ query_params={
'virtual_chassis_for_device_id': '$device', 'virtual_chassis_member_id': '$device',
'type': 'lag', 'type': 'lag',
} }
) )

View File

@ -2822,11 +2822,44 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
) )
Rack.objects.bulk_create(racks) Rack.objects.bulk_create(racks)
# VirtualChassis assignment for filtering
virtual_chassis = VirtualChassis(name='Virtual Chassis')
virtual_chassis.save()
devices = ( devices = (
Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), Device(
Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), name='Device 1',
Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), device_type=device_types[0],
Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections role=roles[0], site=sites[0],
location=locations[0],
rack=racks[0],
virtual_chassis=virtual_chassis,
vc_position=1,
vc_priority=1
),
Device(
name='Device 2',
device_type=device_types[1],
role=roles[1], site=sites[1],
location=locations[1],
rack=racks[1]
),
Device(
name='Device 3',
device_type=device_types[2],
role=roles[2], site=sites[2],
location=locations[2],
rack=racks[2]
),
Device(
name=None,
device_type=device_types[2],
role=roles[2],
site=sites[3],
virtual_chassis=virtual_chassis,
vc_position=2,
vc_priority=1
), # For cable connections
) )
Device.objects.bulk_create(devices) Device.objects.bulk_create(devices)
@ -2858,11 +2891,6 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
) )
VirtualDeviceContext.objects.bulk_create(vdcs) VirtualDeviceContext.objects.bulk_create(vdcs)
# VirtualChassis assignment for filtering
virtual_chassis = VirtualChassis.objects.create(master=devices[0])
Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=virtual_chassis, vc_position=1, vc_priority=1)
Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis, vc_position=2, vc_priority=2)
interfaces = ( interfaces = (
Interface( Interface(
device=devices[0], device=devices[0],
@ -3116,12 +3144,14 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
params = {'device': [devices[0].name, devices[1].name]} params = {'device': [devices[0].name, devices[1].name]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_virtual_chassis_for_device(self): def test_virtual_chassis_member(self):
# Device 1 & 3 have 1 management interface, Device "None" has 5 interfaces, 2 of which are management and
# will not be visible
devices = Device.objects.filter(name__in=['Device 1', 'Device 3']) devices = Device.objects.filter(name__in=['Device 1', 'Device 3'])
params = {'device_id': [devices[0].pk, devices[1].pk]} params = {'virtual_chassis_member_id': [devices[0].pk, devices[1].pk]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
params = {'device': [devices[0].name, devices[1].name]} params = {'virtual_chassis_member': [devices[0].name, devices[1].name]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
def test_module(self): def test_module(self):
modules = Module.objects.all()[:2] modules = Module.objects.all()[:2]