From 2c9eeb8d21ebd0bb9dc0db086be41194fb6ff27f Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 12 Sep 2024 15:41:39 -0400 Subject: [PATCH] Add EmptyStringFilter and type__empty filter on CableFilterSet --- netbox/dcim/filtersets.py | 5 ++++- netbox/dcim/tests/test_filtersets.py | 6 ++++++ netbox/utilities/filters.py | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 5a101e739..e08059b85 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -18,7 +18,7 @@ from tenancy.models import * from users.models import User from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter, - NumericArrayFilter, TreeNodeMultipleChoiceFilter, + NumericArrayFilter, TreeNodeMultipleChoiceFilter, EmptyStringFilter, ) from virtualization.models import Cluster, ClusterGroup from vpn.models import L2VPN @@ -1983,6 +1983,9 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): type = django_filters.MultipleChoiceFilter( choices=CableTypeChoices ) + type__empty = EmptyStringFilter( + field_name='type' + ) status = django_filters.MultipleChoiceFilter( choices=LinkStatusChoices ) diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 6c65cad93..56f54b249 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -5245,6 +5245,12 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'type__empty': 'false'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + def test_type_empty(self): + params = {'type__empty': 'true'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) + params = {'type__empty': 'false'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + def test_status(self): params = {'status': [LinkStatusChoices.STATUS_CONNECTED]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index 05454543e..95c615dcb 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -171,3 +171,14 @@ class ContentTypeFilter(django_filters.CharFilter): f'{self.field_name}__model': model } ) + + +class EmptyStringFilter(django_filters.BooleanFilter): + def filter(self, qs, value): + if value in EMPTY_VALUES: + return qs + + exclude = self.exclude ^ (value is False) + method = qs.exclude if exclude else qs.filter + + return method(**{self.field_name: ""})