From 3ab5682e7aaaac48a2f5b917e113ed5b972febe9 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 6 Oct 2021 10:08:56 -0400 Subject: [PATCH] Fixes #7460: Fix filtering connections by site ID --- docs/release-notes/version-3.0.md | 1 + netbox/dcim/filtersets.py | 117 +++++++++++++----------------- 2 files changed, 50 insertions(+), 68 deletions(-) diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index 60ae49a8f..f315ffbf7 100644 --- a/docs/release-notes/version-3.0.md +++ b/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 --- diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 02749ba1c..71d43b279 100644 --- a/netbox/dcim/filtersets.py +++ b/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 = []