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

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

Jeremy Stretch 5 лет назад
Родитель
Сommit
c7c66626b6
4 измененных файлов с 90 добавлено и 62 удалено
  1. 2 2
      netbox/circuits/filters.py
  2. 8 2
      netbox/circuits/tests/test_filters.py
  3. 36 48
      netbox/dcim/filters.py
  4. 44 10
      netbox/dcim/tests/test_filters.py

+ 2 - 2
netbox/circuits/filters.py

@@ -1,7 +1,7 @@
 import django_filters
 import django_filters
 from django.db.models import Q
 from django.db.models import Q
 
 
-from dcim.filters import PathEndpointFilterSet
+from dcim.filters import CableTerminationFilterSet, PathEndpointFilterSet
 from dcim.models import Region, Site
 from dcim.models import Region, Site
 from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
 from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
 from tenancy.filters import TenancyFilterSet
 from tenancy.filters import TenancyFilterSet
@@ -145,7 +145,7 @@ class CircuitFilterSet(BaseFilterSet, CustomFieldFilterSet, TenancyFilterSet, Cr
         ).distinct()
         ).distinct()
 
 
 
 
-class CircuitTerminationFilterSet(BaseFilterSet, PathEndpointFilterSet):
+class CircuitTerminationFilterSet(BaseFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     q = django_filters.CharFilter(
     q = django_filters.CharFilter(
         method='search',
         method='search',
         label='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]}
         params = {'site': [sites[0].slug, sites[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
         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)
         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__ = (
 __all__ = (
     'CableFilterSet',
     'CableFilterSet',
+    'CableTerminationFilterSet',
     'ConsoleConnectionFilterSet',
     'ConsoleConnectionFilterSet',
     'ConsolePortFilterSet',
     'ConsolePortFilterSet',
     'ConsolePortTemplateFilterSet',
     'ConsolePortTemplateFilterSet',
@@ -41,6 +42,7 @@ __all__ = (
     'InterfaceTemplateFilterSet',
     'InterfaceTemplateFilterSet',
     'InventoryItemFilterSet',
     'InventoryItemFilterSet',
     'ManufacturerFilterSet',
     'ManufacturerFilterSet',
+    'PathEndpointFilterSet',
     'PlatformFilterSet',
     'PlatformFilterSet',
     'PowerConnectionFilterSet',
     'PowerConnectionFilterSet',
     'PowerFeedFilterSet',
     '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):
 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(
     type = django_filters.MultipleChoiceFilter(
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
         null_value=None
         null_value=None
     )
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
 
     class Meta:
     class Meta:
         model = ConsolePort
         model = ConsolePort
         fields = ['id', 'name', 'description']
         fields = ['id', 'name', 'description']
 
 
 
 
-class ConsoleServerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class ConsoleServerPortFilterSet(
+    BaseFilterSet,
+    DeviceComponentFilterSet,
+    CableTerminationFilterSet,
+    PathEndpointFilterSet
+):
     type = django_filters.MultipleChoiceFilter(
     type = django_filters.MultipleChoiceFilter(
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
         null_value=None
         null_value=None
     )
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
 
     class Meta:
     class Meta:
         model = ConsoleServerPort
         model = ConsoleServerPort
         fields = ['id', 'name', 'description']
         fields = ['id', 'name', 'description']
 
 
 
 
-class PowerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class PowerPortFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     type = django_filters.MultipleChoiceFilter(
     type = django_filters.MultipleChoiceFilter(
         choices=PowerPortTypeChoices,
         choices=PowerPortTypeChoices,
         null_value=None
         null_value=None
     )
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
 
     class Meta:
     class Meta:
         model = PowerPort
         model = PowerPort
         fields = ['id', 'name', 'maximum_draw', 'allocated_draw', 'description']
         fields = ['id', 'name', 'maximum_draw', 'allocated_draw', 'description']
 
 
 
 
-class PowerOutletFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class PowerOutletFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     type = django_filters.MultipleChoiceFilter(
     type = django_filters.MultipleChoiceFilter(
         choices=PowerOutletTypeChoices,
         choices=PowerOutletTypeChoices,
         null_value=None
         null_value=None
     )
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
 
 
     class Meta:
     class Meta:
         model = PowerOutlet
         model = PowerOutlet
         fields = ['id', 'name', 'feed_leg', 'description']
         fields = ['id', 'name', 'feed_leg', 'description']
 
 
 
 
-class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFilterSet):
+class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, CableTerminationFilterSet, PathEndpointFilterSet):
     q = django_filters.CharFilter(
     q = django_filters.CharFilter(
         method='search',
         method='search',
         label='Search',
         label='Search',
@@ -844,11 +841,6 @@ class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFi
         field_name='pk',
         field_name='pk',
         label='Device (ID)',
         label='Device (ID)',
     )
     )
-    cabled = django_filters.BooleanFilter(
-        field_name='cable',
-        lookup_expr='isnull',
-        exclude=True
-    )
     kind = django_filters.CharFilter(
     kind = django_filters.CharFilter(
         method='filter_kind',
         method='filter_kind',
         label='Kind of interface',
         label='Kind of interface',
@@ -925,24 +917,14 @@ class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet, PathEndpointFi
         }.get(value, queryset.none())
         }.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:
     class Meta:
         model = FrontPort
         model = FrontPort
         fields = ['id', 'name', 'type', 'description']
         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:
     class Meta:
         model = RearPort
         model = RearPort
@@ -1266,7 +1248,13 @@ class PowerPanelFilterSet(BaseFilterSet):
         return queryset.filter(qs_filter)
         return queryset.filter(qs_filter)
 
 
 
 
-class PowerFeedFilterSet(BaseFilterSet, PathEndpointFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet):
+class PowerFeedFilterSet(
+    BaseFilterSet,
+    CableTerminationFilterSet,
+    PathEndpointFilterSet,
+    CustomFieldFilterSet,
+    CreatedUpdatedFilterSet
+):
     q = django_filters.CharFilter(
     q = django_filters.CharFilter(
         method='search',
         method='search',
         label='Search',
         label='Search',

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

@@ -1514,9 +1514,11 @@ class ConsolePortTestCase(TestCase):
         params = {'description': ['First', 'Second']}
         params = {'description': ['First', 'Second']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 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(), 2)
         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):
     def test_region(self):
         regions = Region.objects.all()[:2]
         regions = Region.objects.all()[:2]
@@ -1608,9 +1610,11 @@ class ConsoleServerPortTestCase(TestCase):
         params = {'description': ['First', 'Second']}
         params = {'description': ['First', 'Second']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 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(), 2)
         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):
     def test_region(self):
         regions = Region.objects.all()[:2]
         regions = Region.objects.all()[:2]
@@ -1710,9 +1714,11 @@ class PowerPortTestCase(TestCase):
         params = {'allocated_draw': [50, 100]}
         params = {'allocated_draw': [50, 100]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 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(), 2)
         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):
     def test_region(self):
         regions = Region.objects.all()[:2]
         regions = Region.objects.all()[:2]
@@ -1809,9 +1815,11 @@ class PowerOutletTestCase(TestCase):
         params = {'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_A}
         params = {'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_A}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
         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)
         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):
     def test_region(self):
         regions = Region.objects.all()[:2]
         regions = Region.objects.all()[:2]
@@ -1896,9 +1904,11 @@ class InterfaceTestCase(TestCase):
         params = {'name': ['Interface 1', 'Interface 2']}
         params = {'name': ['Interface 1', 'Interface 2']}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 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)
         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):
     def test_enabled(self):
         params = {'enabled': 'true'}
         params = {'enabled': 'true'}
@@ -2657,6 +2667,18 @@ class PowerFeedTestCase(TestCase):
         )
         )
         PowerFeed.objects.bulk_create(power_feeds)
         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):
     def test_id(self):
         params = {'id': self.queryset.values_list('pk', flat=True)[:2]}
         params = {'id': self.queryset.values_list('pk', flat=True)[:2]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 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]}
         params = {'rack_id': [racks[0].pk, racks[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
         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
 # TODO: Connection filters