Browse Source

Adds mask length filters on ipaddress (#14218)

* adds mask length filters on ipaddress #14101

* Change IPaddress mask_length filter to multi-value; extend tests

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Abhimanyu Saharan 2 years ago
parent
commit
1203d761f4
2 changed files with 24 additions and 11 deletions
  1. 14 9
      netbox/ipam/filtersets.py
  2. 10 2
      netbox/ipam/tests/test_filtersets.py

+ 14 - 9
netbox/ipam/filtersets.py

@@ -266,7 +266,8 @@ class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
     )
     mask_length = MultiValueNumberFilter(
         field_name='prefix',
-        lookup_expr='net_mask_length'
+        lookup_expr='net_mask_length',
+        label=_('Mask length')
     )
     mask_length__gte = django_filters.NumberFilter(
         field_name='prefix',
@@ -531,9 +532,18 @@ class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
         method='filter_address',
         label=_('Address'),
     )
-    mask_length = django_filters.NumberFilter(
-        method='filter_mask_length',
-        label=_('Mask length'),
+    mask_length = MultiValueNumberFilter(
+        field_name='address',
+        lookup_expr='net_mask_length',
+        label=_('Mask length')
+    )
+    mask_length__gte = django_filters.NumberFilter(
+        field_name='address',
+        lookup_expr='net_mask_length__gte'
+    )
+    mask_length__lte = django_filters.NumberFilter(
+        field_name='address',
+        lookup_expr='net_mask_length__lte'
     )
     vrf_id = django_filters.ModelMultipleChoiceFilter(
         queryset=VRF.objects.all(),
@@ -677,11 +687,6 @@ class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
         except ValidationError:
             return queryset.none()
 
-    def filter_mask_length(self, queryset, name, value):
-        if not value:
-            return queryset
-        return queryset.filter(address__net_mask_length=value)
-
     @extend_schema_field(OpenApiTypes.STR)
     def filter_present_in_vrf(self, queryset, name, vrf):
         if vrf is None:

+ 10 - 2
netbox/ipam/tests/test_filtersets.py

@@ -627,8 +627,12 @@ class PrefixTestCase(TestCase, ChangeLoggedFilterSetTests):
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_mask_length(self):
-        params = {'mask_length': ['24']}
+        params = {'mask_length': [24]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
+        params = {'mask_length__gte': 32}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
+        params = {'mask_length__lte': 24}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
 
     def test_vrf(self):
         vrfs = VRF.objects.all()[:2]
@@ -954,8 +958,12 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_mask_length(self):
-        params = {'mask_length': '24'}
+        params = {'mask_length': [24]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
+        params = {'mask_length__gte': 64}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
+        params = {'mask_length__lte': 25}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
 
     def test_vrf(self):
         vrfs = VRF.objects.all()[:2]