1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Fixes #7070: Fix exception when filtering by prefix max length in UI

This commit is contained in:
jeremystretch
2021-08-30 16:51:07 -04:00
parent fd16c47d2e
commit deb53d771d
5 changed files with 17 additions and 8 deletions

View File

@ -1,5 +1,13 @@
# NetBox v3.0 # NetBox v3.0
## v2.11.12 (2021-08-23)
### Bug Fixes
* [#7070](https://github.com/netbox-community/netbox/issues/7070) - Fix exception when filtering by prefix max length in UI
---
## v3.0.0 (2021-08-30) ## v3.0.0 (2021-08-30)
!!! warning "Existing Deployments Must Upgrade from v2.11" !!! warning "Existing Deployments Must Upgrade from v2.11"

View File

@ -216,7 +216,7 @@ class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
children = MultiValueNumberFilter( children = MultiValueNumberFilter(
field_name='_children' field_name='_children'
) )
mask_length = django_filters.NumberFilter( mask_length = MultiValueNumberFilter(
field_name='prefix', field_name='prefix',
lookup_expr='net_mask_length' lookup_expr='net_mask_length'
) )

View File

@ -658,11 +658,11 @@ class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilter
label=_('Address family'), label=_('Address family'),
widget=StaticSelect() widget=StaticSelect()
) )
mask_length = forms.ChoiceField( mask_length = forms.MultipleChoiceField(
required=False, required=False,
choices=PREFIX_MASK_LENGTH_CHOICES, choices=PREFIX_MASK_LENGTH_CHOICES,
label=_('Mask length'), label=_('Mask length'),
widget=StaticSelect() widget=StaticSelectMultiple()
) )
vrf_id = DynamicModelMultipleChoiceField( vrf_id = DynamicModelMultipleChoiceField(
queryset=VRF.objects.all(), queryset=VRF.objects.all(),

View File

@ -119,13 +119,14 @@ def get_selected_values(form, field_name):
""" """
if not hasattr(form, 'cleaned_data'): if not hasattr(form, 'cleaned_data'):
form.is_valid() form.is_valid()
filter_data = form.cleaned_data.get(field_name)
# Selection field # Selection field
if hasattr(form.fields[field_name], 'choices'): if hasattr(form.fields[field_name], 'choices'):
try: try:
choices = dict(unpack_grouped_choices(form.fields[field_name].choices)) choices = dict(unpack_grouped_choices(form.fields[field_name].choices))
return [ return [
label for value, label in choices.items() if value in form.cleaned_data[field_name] label for value, label in choices.items() if str(value) in filter_data
] ]
except TypeError: except TypeError:
# Field uses dynamic choices. Show all that have been populated. # Field uses dynamic choices. Show all that have been populated.
@ -134,7 +135,7 @@ def get_selected_values(form, field_name):
] ]
# Non-selection field # Non-selection field
return [str(form.cleaned_data[field_name])] return [str(filter_data)]
def add_blank_choice(choices): def add_blank_choice(choices):

View File

@ -411,16 +411,16 @@ def applied_filters(form, query_params):
Display the active filters for a given filter form. Display the active filters for a given filter form.
""" """
form.is_valid() form.is_valid()
querydict = query_params.copy()
applied_filters = [] applied_filters = []
for filter_name in form.changed_data: for filter_name in form.changed_data:
if filter_name not in query_params: if filter_name not in querydict:
continue continue
bound_field = form.fields[filter_name].get_bound_field(form, filter_name) bound_field = form.fields[filter_name].get_bound_field(form, filter_name)
querydict = query_params.copy()
querydict.pop(filter_name) querydict.pop(filter_name)
display_value = ', '.join(get_selected_values(form, filter_name)) display_value = ', '.join([str(v) for v in get_selected_values(form, filter_name)])
applied_filters.append({ applied_filters.append({
'name': filter_name, 'name': filter_name,