Skip to content

Commit ebef48e

Browse files
Merge pull request #4075 from kobayashi/3507-filter-by-devices
Fixes #3507: Filtering IP by multiple devices
2 parents 26ca6b4 + 505cb9c commit ebef48e

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

docs/release-notes/version-2.7.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
## Bug Fixes
1111

12+
* [#3507](https://github.com/netbox-community/netbox/issues/3507) - Fix filtering IPaddress by multiple devices
1213
* [#4089](https://github.com/netbox-community/netbox/issues/4089) - Selection of power outlet type during bulk update is optional
1314
* [#4090](https://github.com/netbox-community/netbox/issues/4090) - Render URL custom fields as links under object view
1415
* [#4091](https://github.com/netbox-community/netbox/issues/4091) - Fix filtering of objects by custom fields using UI search form

netbox/ipam/filters.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
99
from tenancy.filters import TenancyFilterSet
1010
from utilities.filters import (
11-
MultiValueCharFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
11+
MultiValueCharFilter, MultiValueNumberFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter,
1212
)
1313
from virtualization.models import VirtualMachine
1414
from .choices import *
@@ -304,12 +304,12 @@ class IPAddressFilterSet(TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedF
304304
to_field_name='rd',
305305
label='VRF (RD)',
306306
)
307-
device = django_filters.CharFilter(
307+
device = MultiValueCharFilter(
308308
method='filter_device',
309309
field_name='name',
310-
label='Device',
310+
label='Device (name)',
311311
)
312-
device_id = django_filters.NumberFilter(
312+
device_id = MultiValueNumberFilter(
313313
method='filter_device',
314314
field_name='pk',
315315
label='Device (ID)',
@@ -385,8 +385,10 @@ def filter_mask_length(self, queryset, name, value):
385385

386386
def filter_device(self, queryset, name, value):
387387
try:
388-
device = Device.objects.prefetch_related('device_type').get(**{name: value})
389-
vc_interface_ids = [i['id'] for i in device.vc_interfaces.values('id')]
388+
devices = Device.objects.prefetch_related('device_type').filter(**{'{}__in'.format(name): value})
389+
vc_interface_ids = []
390+
for device in devices:
391+
vc_interface_ids.extend([i['id'] for i in device.vc_interfaces.values('id')])
390392
return queryset.filter(interface_id__in=vc_interface_ids)
391393
except Device.DoesNotExist:
392394
return queryset.none()

netbox/ipam/tests/test_filters.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,12 @@ def test_vrf(self):
392392
params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
393393
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
394394

395-
# TODO: Test for multiple values
396395
def test_device(self):
397-
device = Device.objects.first()
398-
params = {'device_id': device.pk}
399-
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
400-
params = {'device': device.name}
401-
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
396+
devices = Device.objects.all()[:2]
397+
params = {'device_id': [devices[0].pk, devices[1].pk]}
398+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
399+
params = {'device': [devices[0].name, devices[1].name]}
400+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
402401

403402
def test_virtual_machine(self):
404403
vms = VirtualMachine.objects.all()[:2]

0 commit comments

Comments
 (0)