Skip to content

Commit bb9b0b8

Browse files
authored
Fixes #18879 - Add prefix filtering by assigned VLAN Group (#19182)
* feat(ipam): Add VLAN group filters to IPAM FilterSet Introduces filters for VLAN groups using both ID and slug fields. * feat(ipam): Add VLAN group filter in IPAM FilterForm Introduces a `vlan_group_id` filter to IPAM forms for filtering based on VLAN groups. * feat(ipam): Add VLAN group filtering to tests Introduces tests for VLAN group filtering in FilterSets. This ensures correct validation and behavior when filtering by VLAN group.
1 parent 785ad50 commit bb9b0b8

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

netbox/ipam/filtersets.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,18 @@ class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet, C
351351
to_field_name='rd',
352352
label=_('VRF (RD)'),
353353
)
354+
vlan_group_id = django_filters.ModelMultipleChoiceFilter(
355+
field_name='vlan__group',
356+
queryset=VLANGroup.objects.all(),
357+
to_field_name="id",
358+
label=_('VLAN Group (ID)'),
359+
)
360+
vlan_group = django_filters.ModelMultipleChoiceFilter(
361+
field_name='vlan__group__slug',
362+
queryset=VLANGroup.objects.all(),
363+
to_field_name="slug",
364+
label=_('VLAN Group (slug)'),
365+
)
354366
vlan_id = django_filters.ModelMultipleChoiceFilter(
355367
queryset=VLAN.objects.all(),
356368
label=_('VLAN (ID)'),

netbox/ipam/forms/filtersets.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFil
176176
'within_include', 'family', 'status', 'role_id', 'mask_length', 'is_pool', 'mark_utilized',
177177
name=_('Addressing')
178178
),
179-
FieldSet('vlan_id', name=_('VLAN Assignment')),
179+
FieldSet('vlan_group_id', 'vlan_id', name=_('VLAN Assignment')),
180180
FieldSet('vrf_id', 'present_in_vrf_id', name=_('VRF')),
181181
FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Scope')),
182182
FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')),
@@ -260,6 +260,11 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFil
260260
choices=BOOLEAN_WITH_BLANK_CHOICES
261261
)
262262
)
263+
vlan_group_id = DynamicModelMultipleChoiceField(
264+
queryset=VLANGroup.objects.all(),
265+
required=False,
266+
label=_('VLAN Group'),
267+
)
263268
vlan_id = DynamicModelMultipleChoiceField(
264269
queryset=VLAN.objects.all(),
265270
required=False,

netbox/ipam/tests/test_filtersets.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,9 +645,16 @@ def setUpTestData(cls):
645645
vrfs[1].export_targets.add(route_targets[1])
646646
vrfs[2].export_targets.add(route_targets[2])
647647

648+
vlan_groups = (
649+
VLANGroup(name='VLAN Group 1', slug='vlan-group-1'),
650+
VLANGroup(name='VLAN Group 2', slug='vlan-group-2'),
651+
)
652+
for vlan_group in vlan_groups:
653+
vlan_group.save()
654+
648655
vlans = (
649-
VLAN(vid=1, name='VLAN 1'),
650-
VLAN(vid=2, name='VLAN 2'),
656+
VLAN(vid=1, name='VLAN 1', group=vlan_groups[0]),
657+
VLAN(vid=2, name='VLAN 2', group=vlan_groups[1]),
651658
VLAN(vid=3, name='VLAN 3'),
652659
)
653660
VLAN.objects.bulk_create(vlans)
@@ -850,6 +857,13 @@ def test_site(self):
850857
params = {'site': [sites[0].slug, sites[1].slug]}
851858
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
852859

860+
def test_vlan_group(self):
861+
vlan_groups = VLANGroup.objects.all()[:2]
862+
params = {'vlan_group_id': [vlan_groups[0].pk, vlan_groups[1].pk]}
863+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
864+
params = {'vlan_group': [vlan_groups[0].slug, vlan_groups[1].slug]}
865+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
866+
853867
def test_vlan(self):
854868
vlans = VLAN.objects.all()[:2]
855869
params = {'vlan_id': [vlans[0].pk, vlans[1].pk]}

0 commit comments

Comments
 (0)