Change to EmptyStringMultipleChoiceFilter

This commit is contained in:
Brian Tiemann 2024-09-13 08:52:17 -04:00
parent 2c9eeb8d21
commit 05ee5a5145
4 changed files with 19 additions and 17 deletions

View File

@ -1482,6 +1482,7 @@ class CableTypeChoices(ChoiceSet):
TYPE_AOC = 'aoc' TYPE_AOC = 'aoc'
TYPE_POWER = 'power' TYPE_POWER = 'power'
TYPE_USB = 'usb' TYPE_USB = 'usb'
TYPE_EMPTY = 'EMPTY'
CHOICES = ( CHOICES = (
( (
@ -1514,8 +1515,13 @@ class CableTypeChoices(ChoiceSet):
(TYPE_AOC, 'Active Optical Cabling (AOC)'), (TYPE_AOC, 'Active Optical Cabling (AOC)'),
), ),
), ),
(
_('Other'), (
(TYPE_USB, _('USB')), (TYPE_USB, _('USB')),
(TYPE_POWER, _('Power')), (TYPE_POWER, _('Power')),
(TYPE_EMPTY, _('(unset)')),
)
)
) )

View File

@ -18,7 +18,7 @@ from tenancy.models import *
from users.models import User from users.models import User
from utilities.filters import ( from utilities.filters import (
ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter, ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter,
NumericArrayFilter, TreeNodeMultipleChoiceFilter, EmptyStringFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, EmptyStringMultipleChoiceFilter,
) )
from virtualization.models import Cluster, ClusterGroup from virtualization.models import Cluster, ClusterGroup
from vpn.models import L2VPN from vpn.models import L2VPN
@ -1980,12 +1980,9 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
method='_unterminated', method='_unterminated',
label=_('Unterminated'), label=_('Unterminated'),
) )
type = django_filters.MultipleChoiceFilter( type = EmptyStringMultipleChoiceFilter(
choices=CableTypeChoices choices=CableTypeChoices
) )
type__empty = EmptyStringFilter(
field_name='type'
)
status = django_filters.MultipleChoiceFilter( status = django_filters.MultipleChoiceFilter(
choices=LinkStatusChoices choices=LinkStatusChoices
) )

View File

@ -5240,6 +5240,7 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests):
def test_type(self): def test_type(self):
params = {'type': [CableTypeChoices.TYPE_CAT3, CableTypeChoices.TYPE_CAT5E]} params = {'type': [CableTypeChoices.TYPE_CAT3, CableTypeChoices.TYPE_CAT5E]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
params = {'type': [CableTypeChoices.TYPE_EMPTY]}
params = {'type__empty': 'true'} params = {'type__empty': 'true'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
params = {'type__empty': 'false'} params = {'type__empty': 'false'}
@ -5248,8 +5249,8 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests):
def test_type_empty(self): def test_type_empty(self):
params = {'type__empty': 'true'} params = {'type__empty': 'true'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
params = {'type__empty': 'false'} params = {'type': [CableTypeChoices.TYPE_EMPTY, CableTypeChoices.TYPE_CAT3]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 10)
def test_status(self): def test_status(self):
params = {'status': [LinkStatusChoices.STATUS_CONNECTED]} params = {'status': [LinkStatusChoices.STATUS_CONNECTED]}

View File

@ -173,12 +173,10 @@ class ContentTypeFilter(django_filters.CharFilter):
) )
class EmptyStringFilter(django_filters.BooleanFilter): class EmptyStringMultipleChoiceFilter(django_filters.MultipleChoiceFilter):
empty_value = 'EMPTY'
def filter(self, qs, value): def filter(self, qs, value):
if value in EMPTY_VALUES: if self.empty_value in value:
return qs value.append('')
return super().filter(qs, value)
exclude = self.exclude ^ (value is False)
method = qs.exclude if exclude else qs.filter
return method(**{self.field_name: ""})