From 088b0a4ccd694c8042afae47b1c059f8b556b0b8 Mon Sep 17 00:00:00 2001 From: Joseph Kennedy Date: Thu, 31 Aug 2017 16:37:34 -0400 Subject: [PATCH] Add rack and rack group --- netbox/dcim/filters.py | 25 ++++++++++++++++++++----- netbox/dcim/forms.py | 9 +++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index d5e8cdf5a..75519ca3e 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -586,15 +586,20 @@ class InterfaceListFilter(django_filters.FilterSet): method='filter_site', label='Site (slug)', ) - #role_id = django_filters.ModelMultipleChoiceFilter( - # method='_filter_role', - # name='device_role', - # label='Role (ID)', - #) role = django_filters.CharFilter( method='filter_role', label='Role (slug)', ) + rack_group_id = django_filters.ModelMultipleChoiceFilter( + name='rack__group', + method='filter_rack_group', + label='Rack group (ID)', + ) + rack_id = NullableModelMultipleChoiceFilter( + name='rack', + method='filter_rack', + label='Rack (ID)', + ) type = django_filters.CharFilter( method='filter_type', label='Interface type', @@ -618,6 +623,16 @@ class InterfaceListFilter(django_filters.FilterSet): return queryset return queryset.filter(device__device_role__slug=value) + def filter_rack(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter(device__rack=value) + + def filter_rack_group(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter(device__rack__group=value) + def filter_type(self, queryset, name, value): value = value.strip().lower() return { diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index c24289387..fb22f2f64 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1620,6 +1620,15 @@ class InterfaceFilterForm(BootstrapMixin, forms.Form): class InterfaceListFilterForm(BootstrapMixin, forms.Form): q = forms.CharField(required=False, label='Search') site = forms.ModelChoiceField(required=False, queryset=Site.objects.all(), to_field_name='slug') + rack_group_id = FilterChoiceField( + queryset=RackGroup.objects.select_related('site').annotate(filter_count=Count('racks__devices')), + label='Rack group', + ) + rack_id = FilterChoiceField( + queryset=Rack.objects.annotate(filter_count=Count('devices')), + label='Rack', + null_option=(0, 'None'), + ) enabled = forms.ChoiceField(choices=add_blank_choice(IFACE_ENABLED_CHOICES), required=False) role = FilterChoiceField( required=False,