From bb7fc02654f918247e9cbe34cf0154b4a704b573 Mon Sep 17 00:00:00 2001 From: Joseph Kennedy Date: Thu, 17 Aug 2017 22:10:45 -0400 Subject: [PATCH] Add InterfaceListFilter, add device as CharField instead of ModelChoiceField, and add the filter to InterfaceListView --- netbox/dcim/filters.py | 51 ++++++++++++++++++++++++++++++++++++++++++ netbox/dcim/forms.py | 1 + netbox/dcim/views.py | 2 +- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index ed6106c86..a1b90da38 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -577,6 +577,57 @@ class InterfaceFilter(django_filters.FilterSet): return queryset.none() +class InterfaceListFilter(django_filters.FilterSet): + device_id = django_filters.NumberFilter( + method='filter_device', + name='pk', + label='Device (ID)', + ) + type = django_filters.CharFilter( + method='filter_type', + label='Interface type', + ) + lag_id = django_filters.ModelMultipleChoiceFilter( + name='lag', + queryset=Interface.objects.all(), + label='LAG interface (ID)', + ) + mac_address = django_filters.CharFilter( + method='_mac_address', + label='MAC address', + ) + + class Meta: + model = Interface + fields = ['name', 'form_factor', 'enabled', 'mtu', 'mgmt_only'] + + def filter_device(self, queryset, name, value): + try: + device = Device.objects.select_related('device_type').get(**{name: value}) + ordering = device.device_type.interface_ordering + return queryset.filter(device=device).order_naturally(ordering) + except Device.DoesNotExist: + return queryset.none() + + def filter_type(self, queryset, name, value): + value = value.strip().lower() + return { + 'physical': queryset.exclude(form_factor__in=NONCONNECTABLE_IFACE_TYPES), + 'virtual': queryset.filter(form_factor__in=VIRTUAL_IFACE_TYPES), + 'wireless': queryset.filter(form_factor__in=WIRELESS_IFACE_TYPES), + 'lag': queryset.filter(form_factor=IFACE_FF_LAG), + }.get(value, queryset.none()) + + def _mac_address(self, queryset, name, value): + value = value.strip() + if not value: + return queryset + try: + return queryset.filter(mac_address=value) + except AddrFormatError: + return queryset.none() + + class DeviceBayFilter(DeviceComponentFilterSet): class Meta: diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 317738d40..aa691ff45 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1574,6 +1574,7 @@ class InterfaceFilterForm(BootstrapMixin, forms.Form): class InterfaceListFilterForm(BootstrapMixin, forms.Form): site = forms.ModelChoiceField(required=False, queryset=Site.objects.all(), to_field_name='slug') #device = forms.ModelChoiceField(required=False, queryset=Device.objects.all(), to_field_name='slug') + device = forms.CharField(required=False, label='Device name') enabled = forms.ChoiceField(choices=add_blank_choice(IFACE_ENABLED_CHOICES), required=False) role = FilterChoiceField( queryset=DeviceRole.objects.annotate(filter_count=Count('devices')), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 045154138..cfc318de8 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1557,7 +1557,7 @@ class InterfaceBulkImportView(PermissionRequiredMixin, BulkImportView): class InterfaceListView(ObjectListView): queryset = Interface.objects.all() - filter = filters.InterfaceFilter + filter = filters.InterfaceListFilter filter_form = forms.InterfaceListFilterForm table = tables.InterfaceListTable template_name = 'dcim/interface_list.html'