From 6d70c17d7861eaf32fe6bdc0bee830c76bffe328 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 18 Sep 2024 16:14:04 -0400 Subject: [PATCH] Add add_empty_filtering_choice util for empty-value filtering --- netbox/dcim/choices.py | 2 -- netbox/dcim/forms/filtersets.py | 4 ++-- netbox/utilities/forms/utils.py | 10 ++++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 53c3bced9..c68889154 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -1473,7 +1473,6 @@ class CableTypeChoices(ChoiceSet): TYPE_AOC = 'aoc' TYPE_POWER = 'power' TYPE_USB = 'usb' - TYPE_EMPTY = settings.FILTERS_NULL_CHOICE_VALUE CHOICES = ( ( @@ -1510,7 +1509,6 @@ class CableTypeChoices(ChoiceSet): _('Other'), ( (TYPE_USB, _('USB')), (TYPE_POWER, _('Power')), - (settings.FILTERS_NULL_CHOICE_VALUE, _('(unset)')), ) ) ) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index e2b6fda07..64814cf8b 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -10,7 +10,7 @@ from ipam.models import ASN, VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from users.models import User -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, add_empty_filtering_choice from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import NumberWithOptions @@ -1052,7 +1052,7 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): ) type = forms.MultipleChoiceField( label=_('Type'), - choices=add_blank_choice(CableTypeChoices), + choices=add_empty_filtering_choice(add_blank_choice(CableTypeChoices)), required=False ) status = forms.MultipleChoiceField( diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 0429fe571..56d13b058 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -1,6 +1,7 @@ import re from django import forms +from django.conf import settings from django.forms.models import fields_for_model from django.utils.translation import gettext as _ @@ -10,6 +11,7 @@ from .constants import * __all__ = ( 'add_blank_choice', + 'add_empty_filtering_choice', 'expand_alphanumeric_pattern', 'expand_ipaddress_pattern', 'form_from_model', @@ -189,6 +191,14 @@ def add_blank_choice(choices): return ((None, '---------'),) + tuple(choices) +def add_empty_filtering_choice(choices): + """ + Add an empty (null) choice to the end of a choices list, to be used in filtering classes + such as NullableMultipleChoiceFilter to match on an empty value. + """ + return tuple(choices) + ((settings.FILTERS_NULL_CHOICE_VALUE, '(unset)'),) + + def form_from_model(model, fields): """ Return a Form class with the specified fields derived from a model. This is useful when we need a form to be used