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

Fixes #3021: Added tenancy filter to cables

Saria Hajjar 6 лет назад
Родитель
Сommit
f4514034b8

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

@@ -7,6 +7,7 @@
 * [#2113](https://github.com/netbox-community/netbox/issues/2113) - Allow NAPALM driver settings to be changed with request headers
 * [#2589](https://github.com/netbox-community/netbox/issues/2589) - Toggle for showing available prefixes/ip addresses
 * [#3009](https://github.com/netbox-community/netbox/issues/3009) - Search by description when assigning IP address
+* [#3021](https://github.com/netbox-community/netbox/issues/3021) - Add tenant filter field for cables
 * [#3090](https://github.com/netbox-community/netbox/issues/3090) - Add filter field for device interfaces
 * [#3187](https://github.com/netbox-community/netbox/issues/3187) - Add rack selection field to rack elevations
 * [#3393](https://github.com/netbox-community/netbox/issues/3393) - Paginate the circuits at the provider details view

+ 8 - 0
netbox/dcim/filters.py

@@ -1050,6 +1050,14 @@ class CableFilter(django_filters.FilterSet):
         method='filter_device',
         field_name='device__site__slug'
     )
+    tenant_id = MultiValueNumberFilter(
+        method='filter_device',
+        field_name='device__tenant_id'
+    )
+    tenant = MultiValueNumberFilter(
+        method='filter_device',
+        field_name='device__tenant__slug'
+    )
 
     class Meta:
         model = Cable

+ 11 - 0
netbox/dcim/forms.py

@@ -3119,6 +3119,17 @@ class CableFilterForm(BootstrapMixin, forms.Form):
             }
         )
     )
+    tenant = FilterChoiceField(
+        queryset=Tenant.objects.all(),
+        to_field_name='slug',
+        widget=APISelectMultiple(
+            api_url="/api/tenancy/tenants/",
+            value_field='slug',
+            filter_for={
+                'device_id': 'tenant',
+            }
+        )
+    )
     rack_id = FilterChoiceField(
         queryset=Rack.objects.all(),
         label='Rack',

+ 17 - 3
netbox/dcim/tests/test_filters.py

@@ -11,6 +11,7 @@ from dcim.models import (
     VirtualChassis,
 )
 from ipam.models import IPAddress
+from tenancy.models import Tenant
 from virtualization.models import Cluster, ClusterType
 
 
@@ -2121,6 +2122,12 @@ class CableTestCase(TestCase):
         )
         Site.objects.bulk_create(sites)
 
+        tenants = (
+            Tenant(name='Tenant 1', slug='tenant-1'),
+            Tenant(name='Tenant 2', slug='tenant-2'),
+        )
+        Tenant.objects.bulk_create(tenants)
+
         racks = (
             Rack(name='Rack 1', site=sites[0]),
             Rack(name='Rack 2', site=sites[1]),
@@ -2133,9 +2140,9 @@ class CableTestCase(TestCase):
         device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], position=1),
-            Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], position=2),
-            Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], position=1),
+            Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], position=1, tenant=tenants[0]),
+            Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], position=2, tenant=tenants[0]),
+            Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], position=1, tenant=tenants[1]),
             Device(name='Device 4', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], position=2),
             Device(name='Device 5', device_type=device_type, device_role=device_role, site=sites[2], rack=racks[2], position=1),
             Device(name='Device 6', device_type=device_type, device_role=device_role, site=sites[2], rack=racks[2], position=2),
@@ -2216,6 +2223,13 @@ class CableTestCase(TestCase):
         params = {'site': [site[0].slug, site[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5)
 
+    def test_tenant(self):
+        tenant = Tenant.objects.all()[:2]
+        params = {'tenant_id': [tenant[0].pk, tenant[1].pk]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
+        params = {'tenant': [tenant[0].slug, tenant[1].slug]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
+
 
 class PowerPanelTestCase(TestCase):
     queryset = PowerPanel.objects.all()