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

Clean up unneeded code relevant to FilterChoiceField

This commit is contained in:
Jeremy Stretch
2020-02-10 09:40:34 -05:00
parent 885ea8a4d5
commit 5ddfde2214
5 changed files with 8 additions and 68 deletions

View File

@@ -582,47 +582,24 @@ class TagFilterField(forms.MultipleChoiceField):
super().__init__(label='Tags', choices=get_choices, required=False, *args, **kwargs)
class FilterChoiceIterator(forms.models.ModelChoiceIterator):
def __iter__(self):
# Filter on "empty" choice using FILTERS_NULL_CHOICE_VALUE (instead of an empty string)
if self.field.null_label is not None:
yield (settings.FILTERS_NULL_CHOICE_VALUE, self.field.null_label)
queryset = self.queryset.all()
# Can't use iterator() when queryset uses prefetch_related()
if not queryset._prefetch_related_lookups:
queryset = queryset.iterator()
for obj in queryset:
yield self.choice(obj)
class FilterChoiceFieldMixin(object):
iterator = FilterChoiceIterator
def __init__(self, null_label=None, count_attr='filter_count', *args, **kwargs):
self.null_label = null_label
self.count_attr = count_attr
class FilterChoiceField(forms.ModelMultipleChoiceField):
"""
Override get_bound_field() to avoid pre-populating field choices with a SQL query. The field will be
rendered only with choices set via bound data. Choices are populated on-demand via the APISelect widget.
"""
def __init__(self, *args, **kwargs):
# Filter fields are not required by default
if 'required' not in kwargs:
kwargs['required'] = False
if 'widget' not in kwargs:
kwargs['widget'] = forms.SelectMultiple(attrs={'size': 6})
super().__init__(*args, **kwargs)
# def label_from_instance(self, obj):
# label = super().label_from_instance(obj)
# obj_count = getattr(obj, self.count_attr, None)
# if obj_count is not None:
# return '{} ({})'.format(label, obj_count)
# return label
def get_bound_field(self, form, field_name):
bound_field = BoundField(form, self, field_name)
# Modify the QuerySet of the field before we return it. Limit choices to any data already bound: Options
# will be populated on-demand via the APISelect widget.
if bound_field.data:
kwargs = {'{}__in'.format(self.to_field_name or 'pk'): bound_field.data}
kwargs = {'{}__in'.format(self.to_field_name): bound_field.data}
self.queryset = self.queryset.filter(**kwargs)
else:
self.queryset = self.queryset.none()
@@ -630,14 +607,6 @@ class FilterChoiceFieldMixin(object):
return bound_field
class FilterChoiceField(FilterChoiceFieldMixin, forms.ModelMultipleChoiceField):
pass
class FilterTreeNodeMultipleChoiceField(FilterChoiceFieldMixin, TreeNodeMultipleChoiceField):
pass
class LaxURLField(forms.URLField):
"""
Modifies Django's built-in URLField in two ways: