Closes #8882: Support filtering IP addresses by multiple parent prefixes

This commit is contained in:
jeremystretch 2022-06-07 11:00:14 -04:00
parent 6ed2dbf172
commit 8a4c808be5
3 changed files with 15 additions and 11 deletions

View File

@ -2,6 +2,10 @@
## v3.2.5 (FUTURE) ## v3.2.5 (FUTURE)
### Enhancements
* [#8882](https://github.com/netbox-community/netbox/issues/8882) - Support filtering IP addresses by multiple parent prefixes
### Bug Fixes ### Bug Fixes
* [#9480](https://github.com/netbox-community/netbox/issues/9480) - Fix sorting services & service templates by port numbers * [#9480](https://github.com/netbox-community/netbox/issues/9480) - Fix sorting services & service templates by port numbers

View File

@ -464,7 +464,7 @@ class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
field_name='address', field_name='address',
lookup_expr='family' lookup_expr='family'
) )
parent = django_filters.CharFilter( parent = MultiValueCharFilter(
method='search_by_parent', method='search_by_parent',
label='Parent prefix', label='Parent prefix',
) )
@ -571,14 +571,16 @@ class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
return queryset.filter(qs_filter) return queryset.filter(qs_filter)
def search_by_parent(self, queryset, name, value): def search_by_parent(self, queryset, name, value):
value = value.strip()
if not value: if not value:
return queryset return queryset
try: q = Q()
query = str(netaddr.IPNetwork(value.strip()).cidr) for prefix in value:
return queryset.filter(address__net_host_contained=query) try:
except (AddrFormatError, ValueError): query = str(netaddr.IPNetwork(prefix.strip()).cidr)
return queryset.none() q |= Q(address__net_host_contained=query)
except (AddrFormatError, ValueError):
return queryset.none()
return queryset.filter(q)
def filter_address(self, queryset, name, value): def filter_address(self, queryset, name, value):
try: try:

View File

@ -823,10 +823,8 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_parent(self): def test_parent(self):
params = {'parent': '10.0.0.0/24'} params = {'parent': ['10.0.0.0/30', '2001:db8::/126']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
params = {'parent': '2001:db8::/64'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
def test_filter_address(self): def test_filter_address(self):
# Check IPv4 and IPv6, with and without a mask # Check IPv4 and IPv6, with and without a mask