Ver Fonte

Fixes #19110: Add filters by IP addresses to PrimaryIPFilterSet (#19160)

* Add primary ip filters by address

* Add tests for Device and VirtualDeviceContext models
Artem Kotik há 9 meses atrás
pai
commit
2c3fe9700f

+ 16 - 0
netbox/dcim/tests/test_filtersets.py

@@ -2619,15 +2619,23 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests):
         addresses = IPAddress.objects.filter(address__family=4)
         addresses = IPAddress.objects.filter(address__family=4)
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip4': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip4_id': [addresses[2].pk]}
         params = {'primary_ip4_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip4': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
     def test_primary_ip6(self):
     def test_primary_ip6(self):
         addresses = IPAddress.objects.filter(address__family=6)
         addresses = IPAddress.objects.filter(address__family=6)
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip6': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip6_id': [addresses[2].pk]}
         params = {'primary_ip6_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip6': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
     def test_virtual_chassis_id(self):
     def test_virtual_chassis_id(self):
         params = {'virtual_chassis_id': [VirtualChassis.objects.first().pk]}
         params = {'virtual_chassis_id': [VirtualChassis.objects.first().pk]}
@@ -6452,15 +6460,23 @@ class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests):
         addresses = IPAddress.objects.filter(address__family=4)
         addresses = IPAddress.objects.filter(address__family=4)
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip4': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip4_id': [addresses[2].pk]}
         params = {'primary_ip4_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip4': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
     def test_primary_ip6(self):
     def test_primary_ip6(self):
         addresses = IPAddress.objects.filter(address__family=6)
         addresses = IPAddress.objects.filter(address__family=6)
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip6': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip6_id': [addresses[2].pk]}
         params = {'primary_ip6_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip6': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
 
 
 class MACAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
 class MACAddressTestCase(TestCase, ChangeLoggedFilterSetTests):

+ 12 - 0
netbox/ipam/filtersets.py

@@ -1219,8 +1219,20 @@ class PrimaryIPFilterSet(django_filters.FilterSet):
         queryset=IPAddress.objects.all(),
         queryset=IPAddress.objects.all(),
         label=_('Primary IPv4 (ID)'),
         label=_('Primary IPv4 (ID)'),
     )
     )
+    primary_ip4 = django_filters.ModelMultipleChoiceFilter(
+        field_name='primary_ip4__address',
+        queryset=IPAddress.objects.all(),
+        to_field_name='address',
+        label=_('Primary IPv4 (address)'),
+    )
     primary_ip6_id = django_filters.ModelMultipleChoiceFilter(
     primary_ip6_id = django_filters.ModelMultipleChoiceFilter(
         field_name='primary_ip6',
         field_name='primary_ip6',
         queryset=IPAddress.objects.all(),
         queryset=IPAddress.objects.all(),
         label=_('Primary IPv6 (ID)'),
         label=_('Primary IPv6 (ID)'),
     )
     )
+    primary_ip6 = django_filters.ModelMultipleChoiceFilter(
+        field_name='primary_ip6__address',
+        queryset=IPAddress.objects.all(),
+        to_field_name='address',
+        label=_('Primary IPv6 (address)'),
+    )

+ 8 - 0
netbox/virtualization/tests/test_filtersets.py

@@ -525,15 +525,23 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests):
         addresses = IPAddress.objects.filter(address__family=4)
         addresses = IPAddress.objects.filter(address__family=4)
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip4': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip4_id': [addresses[2].pk]}
         params = {'primary_ip4_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip4': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
     def test_primary_ip6(self):
     def test_primary_ip6(self):
         addresses = IPAddress.objects.filter(address__family=6)
         addresses = IPAddress.objects.filter(address__family=6)
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'primary_ip6': [str(addresses[0].address), str(addresses[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         params = {'primary_ip6_id': [addresses[2].pk]}
         params = {'primary_ip6_id': [addresses[2].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
+        params = {'primary_ip6': [str(addresses[2].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
 
 
     def test_serial_number(self):
     def test_serial_number(self):
         params = {'serial': ['111-aaa', '222-bbb']}
         params = {'serial': ['111-aaa', '222-bbb']}