Просмотр исходного кода

Closes #11110: Add start_address and end_address filters for IP ranges

jeremystretch 3 лет назад
Родитель
Сommit
c031951f4b

+ 1 - 0
docs/release-notes/version-3.4.md

@@ -4,6 +4,7 @@
 
 ### Enhancements
 
+* [#11110](https://github.com/netbox-community/netbox/issues/11110) - Add `start_address` and `end_address` filters for IP ranges
 * [#11592](https://github.com/netbox-community/netbox/issues/11592) - Introduce `FILE_UPLOAD_MAX_MEMORY_SIZE` configuration parameter
 
 ### Bug Fixes

+ 14 - 0
netbox/ipam/filtersets.py

@@ -405,6 +405,14 @@ class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
         field_name='start_address',
         lookup_expr='family'
     )
+    start_address = MultiValueCharFilter(
+        method='filter_address',
+        label=_('Address'),
+    )
+    end_address = MultiValueCharFilter(
+        method='filter_address',
+        label=_('Address'),
+    )
     contains = django_filters.CharFilter(
         method='search_contains',
         label=_('Ranges which contain this prefix or IP'),
@@ -461,6 +469,12 @@ class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
         except (AddrFormatError, ValueError):
             return queryset.none()
 
+    def filter_address(self, queryset, name, value):
+        try:
+            return queryset.filter(**{f'{name}__net_in': value})
+        except ValidationError:
+            return queryset.none()
+
 
 class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
     family = django_filters.NumberFilter(

+ 8 - 0
netbox/ipam/tests/test_filtersets.py

@@ -680,6 +680,14 @@ class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
         params = {'family': '6'}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
 
+    def test_start_address(self):
+        params = {'start_address': ['10.0.1.100', '10.0.2.100']}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
+    def test_end_address(self):
+        params = {'end_address': ['10.0.1.199', '10.0.2.199']}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
     def test_contains(self):
         params = {'contains': '10.0.1.150/24'}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)