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

Fixes #3507: Filtering IP by multiple devices

kobayashi 6 лет назад
Родитель
Сommit
d5c4a9d159
3 измененных файлов с 15 добавлено и 14 удалено
  1. 1 0
      docs/release-notes/version-2.7.md
  2. 9 8
      netbox/ipam/filters.py
  3. 5 6
      netbox/ipam/tests/test_filters.py

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

@@ -26,6 +26,7 @@
 
 ## Bug Fixes
 
+* [#3507](https://github.com/netbox-community/netbox/issues/3507) - Fix filtering IPaddress by multiple devices
 * [#4030](https://github.com/netbox-community/netbox/issues/4030) - Fix exception when bulk editing interfaces (revised)
 * [#4043](https://github.com/netbox-community/netbox/issues/4043) - Fix toggling of required fields in custom scripts
 * [#4049](https://github.com/netbox-community/netbox/issues/4049) - Restore missing `tags` field in IPAM service serializer

+ 9 - 8
netbox/ipam/filters.py

@@ -304,14 +304,15 @@ class IPAddressFilterSet(TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedF
         to_field_name='rd',
         label='VRF (RD)',
     )
-    device = django_filters.CharFilter(
-        method='filter_device',
-        field_name='name',
-        label='Device',
-    )
-    device_id = django_filters.NumberFilter(
-        method='filter_device',
-        field_name='pk',
+    device = django_filters.ModelMultipleChoiceFilter(
+        field_name='interface__device__name',
+        queryset=Device.objects.all(),
+        to_field_name='name',
+        label='Device (name)',
+    )
+    device_id = django_filters.ModelMultipleChoiceFilter(
+        field_name='interface__device',
+        queryset=Device.objects.all(),
         label='Device (ID)',
     )
     virtual_machine_id = django_filters.ModelMultipleChoiceFilter(

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

@@ -392,13 +392,12 @@ class IPAddressTestCase(TestCase):
         params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
 
-    # TODO: Test for multiple values
     def test_device(self):
-        device = Device.objects.first()
-        params = {'device_id': device.pk}
-        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
-        params = {'device': device.name}
-        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+        devices = Device.objects.all()[:2]
+        params = {'device_id': [devices[0].pk, devices[1].pk]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'device': [devices[0].name, devices[1].name]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_virtual_machine(self):
         vms = VirtualMachine.objects.all()[:2]