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

Fixes #7460: Fix filtering connections by site ID

jeremystretch 4 лет назад
Родитель
Сommit
3ab5682e7a
2 измененных файлов с 50 добавлено и 68 удалено
  1. 1 0
      docs/release-notes/version-3.0.md
  2. 49 68
      netbox/dcim/filtersets.py

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

@@ -8,6 +8,7 @@
 * [#7446](https://github.com/netbox-community/netbox/issues/7446) - Fix exception when viewing a large number of child IPs within a prefix
 * [#7455](https://github.com/netbox-community/netbox/issues/7455) - Fix site/provider network validation for circuit termination API serializer
 * [#7459](https://github.com/netbox-community/netbox/issues/7459) - Pre-populate location data when adding a device to a rack
+* [#7460](https://github.com/netbox-community/netbox/issues/7460) - Fix filtering connections by site ID
 
 ---
 

+ 49 - 68
netbox/dcim/filtersets.py

@@ -17,7 +17,6 @@ from .choices import *
 from .constants import *
 from .models import *
 
-
 __all__ = (
     'CableFilterSet',
     'CableTerminationFilterSet',
@@ -1243,73 +1242,6 @@ class CableFilterSet(PrimaryModelFilterSet):
         return queryset
 
 
-class ConnectionFilterSet(BaseFilterSet):
-
-    def filter_site(self, queryset, name, value):
-        if not value.strip():
-            return queryset
-        return queryset.filter(device__site__slug=value)
-
-    def filter_device(self, queryset, name, value):
-        if not value:
-            return queryset
-        return queryset.filter(**{f'{name}__in': value})
-
-
-class ConsoleConnectionFilterSet(ConnectionFilterSet):
-    site = django_filters.CharFilter(
-        method='filter_site',
-        label='Site (slug)',
-    )
-    device_id = MultiValueNumberFilter(
-        method='filter_device'
-    )
-    device = MultiValueCharFilter(
-        method='filter_device',
-        field_name='device__name'
-    )
-
-    class Meta:
-        model = ConsolePort
-        fields = ['name']
-
-
-class PowerConnectionFilterSet(ConnectionFilterSet):
-    site = django_filters.CharFilter(
-        method='filter_site',
-        label='Site (slug)',
-    )
-    device_id = MultiValueNumberFilter(
-        method='filter_device'
-    )
-    device = MultiValueCharFilter(
-        method='filter_device',
-        field_name='device__name'
-    )
-
-    class Meta:
-        model = PowerPort
-        fields = ['name']
-
-
-class InterfaceConnectionFilterSet(ConnectionFilterSet):
-    site = django_filters.CharFilter(
-        method='filter_site',
-        label='Site (slug)',
-    )
-    device_id = MultiValueNumberFilter(
-        method='filter_device'
-    )
-    device = MultiValueCharFilter(
-        method='filter_device',
-        field_name='device__name'
-    )
-
-    class Meta:
-        model = Interface
-        fields = []
-
-
 class PowerPanelFilterSet(PrimaryModelFilterSet):
     q = django_filters.CharFilter(
         method='search',
@@ -1441,3 +1373,52 @@ class PowerFeedFilterSet(PrimaryModelFilterSet, CableTerminationFilterSet, PathE
             Q(comments__icontains=value)
         )
         return queryset.filter(qs_filter)
+
+
+#
+# Connection filter sets
+#
+
+class ConnectionFilterSet(BaseFilterSet):
+    site_id = MultiValueNumberFilter(
+        method='filter_connections',
+        field_name='device__site_id'
+    )
+    site = MultiValueCharFilter(
+        method='filter_connections',
+        field_name='device__site__slug'
+    )
+    device_id = MultiValueNumberFilter(
+        method='filter_connections',
+        field_name='device_id'
+    )
+    device = MultiValueCharFilter(
+        method='filter_connections',
+        field_name='device__name'
+    )
+
+    def filter_connections(self, queryset, name, value):
+        if not value:
+            return queryset
+        return queryset.filter(**{f'{name}__in': value})
+
+
+class ConsoleConnectionFilterSet(ConnectionFilterSet):
+
+    class Meta:
+        model = ConsolePort
+        fields = ['name']
+
+
+class PowerConnectionFilterSet(ConnectionFilterSet):
+
+    class Meta:
+        model = PowerPort
+        fields = ['name']
+
+
+class InterfaceConnectionFilterSet(ConnectionFilterSet):
+
+    class Meta:
+        model = Interface
+        fields = []