Browse Source

Fixes #557: Add 'global' choice to VRF filter for prefixes and IP addresses

Jeremy Stretch 8 years ago
parent
commit
daadf7a49b
2 changed files with 10 additions and 6 deletions
  1. 2 1
      netbox/ipam/forms.py
  2. 8 5
      netbox/utilities/forms.py

+ 2 - 1
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)

+ 8 - 5
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