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

Fixes #5935: Fix filtering prefixes list by multiple prefix values

Jeremy Stretch 5 лет назад
Родитель
Сommit
61e5eff666
3 измененных файлов с 14 добавлено и 8 удалено
  1. 1 0
      docs/release-notes/version-2.10.md
  2. 8 8
      netbox/ipam/filters.py
  3. 5 0
      netbox/ipam/tests/test_filters.py

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

@@ -13,6 +13,7 @@
 * [#5703](https://github.com/netbox-community/netbox/issues/5703) - Fix VRF and Tenant field population when adding IP addresses from prefix
 * [#5819](https://github.com/netbox-community/netbox/issues/5819) - Enable ordering of virtual machines by primary IP address
 * [#5872](https://github.com/netbox-community/netbox/issues/5872) - Ordering of devices by primary IP should respect PREFER_IPV4 configuration parameter
+* [#5935](https://github.com/netbox-community/netbox/issues/5935) - Fix filtering prefixes list by multiple prefix values
 
 ## v2.10.5 (2021-02-24)
 

+ 8 - 8
netbox/ipam/filters.py

@@ -192,7 +192,7 @@ class PrefixFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldModelFilterSet
         field_name='prefix',
         lookup_expr='family'
     )
-    prefix = django_filters.CharFilter(
+    prefix = MultiValueCharFilter(
         method='filter_prefix',
         label='Prefix',
     )
@@ -304,13 +304,13 @@ class PrefixFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldModelFilterSet
         return queryset.filter(qs_filter)
 
     def filter_prefix(self, queryset, name, value):
-        if not value.strip():
-            return queryset
-        try:
-            query = str(netaddr.IPNetwork(value).cidr)
-            return queryset.filter(prefix=query)
-        except (AddrFormatError, ValueError):
-            return queryset.none()
+        query_values = []
+        for v in value:
+            try:
+                query_values.append(netaddr.IPNetwork(v))
+            except (AddrFormatError, ValueError):
+                pass
+        return queryset.filter(prefix__in=query_values)
 
     def search_within(self, queryset, name, value):
         value = value.strip()

+ 5 - 0
netbox/ipam/tests/test_filters.py

@@ -422,6 +422,11 @@ class PrefixTestCase(TestCase):
         params = {'family': '6'}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
 
+    def test_prefix(self):
+        prefixes = Prefix.objects.all()[:2]
+        params = {'prefix': [prefixes[0].prefix, prefixes[1].prefix]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
     def test_is_pool(self):
         params = {'is_pool': 'true'}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)