Przeglądaj źródła

Standardize 'cabled' and 'connected' filters; complete tests

Jeremy Stretch 5 lat temu
rodzic
commit
c7c66626b6

+ 2 - 2
netbox/circuits/filters.py

@@ -1,7 +1,7 @@
 import django_filters
 from django.db.models import Q
 
-from dcim.filters import PathEndpointFilterSet
+from dcim.filters import CableTerminationFilterSet, PathEndpointFilterSet
 from dcim.models import Region, Site
 from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
 from tenancy.filters import TenancyFilterSet
@@ -145,7 +145,7 @@ class CircuitFilterSet(BaseFilterSet, CustomFieldFilterSet, TenancyFilterSet, Cr
         ).distinct()
 
 
-class CircuitTerminationFilterSet(BaseFilterSet, PathEndpointFilterSet):
+class CircuitTerminationFilterSet(BaseFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     q = django_filters.CharFilter(
         method='search',
         label='Search',

+ 8 - 2
netbox/circuits/tests/test_filters.py

@@ -316,6 +316,12 @@ class CircuitTerminationTestCase(TestCase):
         params = {'site': [sites[0].slug, sites[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_cabled(self):
+        params = {'cabled': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
+    def test_connected(self):
+        params = {'connected': True}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)

+ 36 - 48
netbox/dcim/filters.py

@@ -24,6 +24,7 @@ from .models import (
 
 __all__ = (
     'CableFilterSet',
+    'CableTerminationFilterSet',
     'ConsoleConnectionFilterSet',
     'ConsolePortFilterSet',
     'ConsolePortTemplateFilterSet',
@@ -41,6 +42,7 @@ __all__ = (
     'InterfaceTemplateFilterSet',
     'InventoryItemFilterSet',
     'ManufacturerFilterSet',
+    'PathEndpointFilterSet',
     'PlatformFilterSet',
     'PowerConnectionFilterSet',
     'PowerFeedFilterSet',
@@ -753,81 +755,76 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
         )
 
 
+class CableTerminationFilterSet(django_filters.FilterSet):
+    cabled = django_filters.BooleanFilter(
+        field_name='cable',
+        lookup_expr='isnull',
+        exclude=True
+    )
+
+
 class PathEndpointFilterSet(django_filters.FilterSet):
-    is_connected = django_filters.BooleanFilter(
-        method='filter_is_connected',
-        label='Search',
+    connected = django_filters.BooleanFilter(
+        method='filter_connected'
     )
 
-    def filter_is_connected(self, queryset, name, value):
-        return queryset.filter(_path__is_active=True)
+    def filter_connected(self, queryset, name, value):
+        if value:
+            return queryset.filter(_path__is_active=True)
+        else:
+            return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False))
 
 
-class ConsolePortFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class ConsolePortFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     type = django_filters.MultipleChoiceFilter(
         choices=ConsolePortTypeChoices,
         null_value=None
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
     class Meta:
         model = ConsolePort
         fields = ['id', 'name', 'description']
 
 
-class ConsoleServerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class ConsoleServerPortFilterSet(
+    BaseFilterSet,
+    DeviceComponentFilterSet,
+    CableTerminationFilterSet,
+    PathEndpointFilterSet
+):
     type = django_filters.MultipleChoiceFilter(
         choices=ConsolePortTypeChoices,
         null_value=None
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
     class Meta:
         model = ConsoleServerPort
         fields = ['id', 'name', 'description']
 
 
-class PowerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class PowerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     type = django_filters.MultipleChoiceFilter(
         choices=PowerPortTypeChoices,
         null_value=None
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
     class Meta:
         model = PowerPort
         fields = ['id', 'name', 'maximum_draw', 'allocated_draw', 'description']
 
 
-class PowerOutletFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class PowerOutletFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     type = django_filters.MultipleChoiceFilter(
         choices=PowerOutletTypeChoices,
         null_value=None
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
     class Meta:
         model = PowerOutlet
         fields = ['id', 'name', 'feed_leg', 'description']
 
 
-class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     q = django_filters.CharFilter(
         method='search',
         label='Search',
@@ -844,11 +841,6 @@ class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFi
         field_name='pk',
         label='Device (ID)',
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
     kind = django_filters.CharFilter(
         method='filter_kind',
         label='Kind of interface',
@@ -925,24 +917,14 @@ class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFi
         }.get(value, queryset.none())
 
 
-class FrontPortFilterSet(BaseFilterSet, DeviceComponentFilterSet):
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
+class FrontPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet):
 
     class Meta:
         model = FrontPort
         fields = ['id', 'name', 'type', 'description']
 
 
-class RearPortFilterSet(BaseFilterSet, DeviceComponentFilterSet):
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
+class RearPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet):
 
     class Meta:
         model = RearPort
@@ -1266,7 +1248,13 @@ class PowerPanelFilterSet(BaseFilterSet):
         return queryset.filter(qs_filter)
 
 
-class PowerFeedFilterSet(BaseFilterSet, PathEndpointFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet):
+class PowerFeedFilterSet(
+    BaseFilterSet,
+    CableTerminationFilterSet,
+    PathEndpointFilterSet,
+    CustomFieldFilterSet,
+    CreatedUpdatedFilterSet
+):
     q = django_filters.CharFilter(
         method='search',
         label='Search',

+ 44 - 10
netbox/dcim/tests/test_filters.py

@@ -1514,9 +1514,11 @@ class ConsolePortTestCase(TestCase):
         params = {'description': ['First', 'Second']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_connected(self):
+        params = {'connected': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
 
     def test_region(self):
         regions = Region.objects.all()[:2]
@@ -1608,9 +1610,11 @@ class ConsoleServerPortTestCase(TestCase):
         params = {'description': ['First', 'Second']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_connected(self):
+        params = {'connected': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
 
     def test_region(self):
         regions = Region.objects.all()[:2]
@@ -1710,9 +1714,11 @@ class PowerPortTestCase(TestCase):
         params = {'allocated_draw': [50, 100]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_connected(self):
+        params = {'connected': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
 
     def test_region(self):
         regions = Region.objects.all()[:2]
@@ -1809,9 +1815,11 @@ class PowerOutletTestCase(TestCase):
         params = {'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_A}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_connected(self):
+        params = {'connected': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
 
     def test_region(self):
         regions = Region.objects.all()[:2]
@@ -1896,9 +1904,11 @@ class InterfaceTestCase(TestCase):
         params = {'name': ['Interface 1', 'Interface 2']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
-    def test_is_connected(self):
-        params = {'is_connected': True}
+    def test_connected(self):
+        params = {'connected': True}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_enabled(self):
         params = {'enabled': 'true'}
@@ -2657,6 +2667,18 @@ class PowerFeedTestCase(TestCase):
         )
         PowerFeed.objects.bulk_create(power_feeds)
 
+        manufacturer = Manufacturer.objects.create(name='Manufacturer', slug='manufacturer')
+        device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model', slug='model')
+        device_role = DeviceRole.objects.create(name='Device Role', slug='device-role')
+        device = Device.objects.create(name='Device', device_type=device_type, device_role=device_role, site=sites[0])
+        power_ports = [
+            PowerPort(device=device, name='Power Port 1'),
+            PowerPort(device=device, name='Power Port 2'),
+        ]
+        PowerPort.objects.bulk_create(power_ports)
+        Cable(termination_a=power_feeds[0], termination_b=power_ports[0]).save()
+        Cable(termination_a=power_feeds[1], termination_b=power_ports[1]).save()
+
     def test_id(self):
         params = {'id': self.queryset.values_list('pk', flat=True)[:2]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -2718,5 +2740,17 @@ class PowerFeedTestCase(TestCase):
         params = {'rack_id': [racks[0].pk, racks[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
+    def test_cabled(self):
+        params = {'cabled': 'true'}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'cabled': 'false'}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+
+    def test_connected(self):
+        params = {'connected': True}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'connected': False}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+
 
 # TODO: Connection filters