mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-24 08:25:17 -06:00
Rename filter and re-introduce virtual_chassis filtering method (required)
This commit is contained in:
parent
e439a57e28
commit
5dba592658
@ -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 {
|
||||||
|
@ -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',
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -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]
|
||||||
|
Loading…
Reference in New Issue
Block a user