diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 0afbb26b9..2fecfcb5f 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.utils.translation import gettext_lazy as _ from utilities.choices import ChoiceSet @@ -1482,7 +1483,7 @@ class CableTypeChoices(ChoiceSet): TYPE_AOC = 'aoc' TYPE_POWER = 'power' TYPE_USB = 'usb' - TYPE_EMPTY = 'EMPTY' + TYPE_EMPTY = settings.FILTERS_NULL_CHOICE_VALUE CHOICES = ( ( @@ -1519,7 +1520,7 @@ class CableTypeChoices(ChoiceSet): _('Other'), ( (TYPE_USB, _('USB')), (TYPE_POWER, _('Power')), - (TYPE_EMPTY, _('(unset)')), + (settings.FILTERS_NULL_CHOICE_VALUE, _('(unset)')), ) ) ) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index b8b05bb42..ef489711e 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, EmptyStringMultipleChoiceFilter, + NumericArrayFilter, TreeNodeMultipleChoiceFilter, NullableMultipleChoiceFilter, ) from virtualization.models import Cluster, ClusterGroup from vpn.models import L2VPN @@ -1980,7 +1980,7 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): method='_unterminated', label=_('Unterminated'), ) - type = EmptyStringMultipleChoiceFilter( + type = NullableMultipleChoiceFilter( choices=CableTypeChoices ) status = django_filters.MultipleChoiceFilter( diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index 3d8203b85..66df2e54f 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -143,6 +143,14 @@ class NullableCharFieldFilter(django_filters.CharFilter): return qs.distinct() if self.distinct else qs +class NullableMultipleChoiceFilter(django_filters.MultipleChoiceFilter): + + def filter(self, qs, value): + if settings.FILTERS_NULL_CHOICE_VALUE in value: + value.append('') + return super().filter(qs, value) + + class NumericArrayFilter(django_filters.NumberFilter): """ Filter based on the presence of an integer within an ArrayField. @@ -171,12 +179,3 @@ class ContentTypeFilter(django_filters.CharFilter): f'{self.field_name}__model': model } ) - - -class EmptyStringMultipleChoiceFilter(django_filters.MultipleChoiceFilter): - empty_value = 'EMPTY' - - def filter(self, qs, value): - if self.empty_value in value: - value.append('') - return super().filter(qs, value)