Skip to content

Commit

Permalink
Fixes netbox-community#557: Add 'global' choice to VRF filter for pre…
Browse files Browse the repository at this point in the history
…fixes and IP addresses
  • Loading branch information
jeremystretch committed Sep 15, 2016
1 parent b958d91 commit 1880e07
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
3 changes: 2 additions & 1 deletion netbox/ipam/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,8 @@ class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm):
'placeholder': 'Network',
}))
family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address Family')
vrf = FilterChoiceField(choices=get_filter_choices(VRF, count_field='prefixes'), label='VRF')
vrf = FilterChoiceField(choices=get_filter_choices(VRF, count_field='prefixes', null_option=(0, 'Global')),
label='VRF')
tenant = FilterChoiceField(choices=get_filter_choices(Tenant, id_field='slug', count_field='prefixes'),
label='Tenant')
status = FilterChoiceField(choices=prefix_status_choices)
Expand Down
13 changes: 8 additions & 5 deletions netbox/utilities/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,27 @@ def add_blank_choice(choices):
return ((None, '---------'),) + choices


def get_filter_choices(model, id_field='pk', select_related=[], count_field=None):
def get_filter_choices(model, id_field='pk', select_related=[], count_field=None, null_option=None):
"""
Return a list of choices suitable for a ChoiceField.
:param model: The base model to use for the queryset
:param id_field: Field to use as the object identifier
:param select_related: Any related tables to include
:param count: The field to use for a child COUNT() (optional)
:return:
:param count_field: The field to use for a child COUNT() (optional)
:param null_option: A (value, label) tuple to include at the beginning of the list serving as "null"
"""
queryset = model.objects.all()
if select_related:
queryset = queryset.select_related(*select_related)
if count_field:
queryset = queryset.annotate(child_count=Count(count_field))
return [(getattr(obj, id_field), u'{} ({})'.format(obj, obj.child_count)) for obj in queryset]
choices = [(getattr(obj, id_field), u'{} ({})'.format(obj, obj.child_count)) for obj in queryset]
else:
return [(getattr(obj, id_field), u'{}'.format(obj)) for obj in queryset]
choices = [(getattr(obj, id_field), u'{}'.format(obj)) for obj in queryset]
if null_option:
choices = [null_option] + choices
return choices



Expand Down

0 comments on commit 1880e07

Please sign in to comment.