diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 073c06f27..45fed46f2 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -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) diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 30989ddcf..ed1ce1533 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -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