From 61e5eff6660a3e1734b459a19adc3d83195bb4ce Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 8 Mar 2021 16:27:12 -0500 Subject: [PATCH] Fixes #5935: Fix filtering prefixes list by multiple prefix values --- docs/release-notes/version-2.10.md | 1 + netbox/ipam/filters.py | 16 ++++++++-------- netbox/ipam/tests/test_filters.py | 5 +++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md index 2996bdf96..529f52a1a 100644 --- a/docs/release-notes/version-2.10.md +++ b/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) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 176d77a88..974dfb08e 100644 --- a/netbox/ipam/filters.py +++ b/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() diff --git a/netbox/ipam/tests/test_filters.py b/netbox/ipam/tests/test_filters.py index 2fead3d93..3be539df3 100644 --- a/netbox/ipam/tests/test_filters.py +++ b/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)