diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 19900955d..ae68d7838 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -582,6 +582,11 @@ class InterfaceListFilter(django_filters.FilterSet): method='search', label='Search', ) + device = django_filters.CharFilter( + method='filter_device', + name='name', + label='Device', + ) site = django_filters.CharFilter( method='filter_site', label='Site (slug)', @@ -613,6 +618,14 @@ class InterfaceListFilter(django_filters.FilterSet): model = Interface fields = ['form_factor', 'enabled', 'mtu'] + 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_site(self, queryset, name, value): if not value.strip(): return queryset diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index bc9424942..f39b21ee0 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1623,7 +1623,7 @@ class InterfaceListFilterForm(BootstrapMixin, forms.Form): rack_group_id = FilterChoiceField( required=False, queryset=RackGroup.objects.select_related('site').annotate(filter_count=Count('racks__devices')), - label='Rack group', + label='Rack Group', null_option=(0, 'None') ) rack_id = FilterChoiceField( @@ -1636,8 +1636,10 @@ class InterfaceListFilterForm(BootstrapMixin, forms.Form): role = FilterChoiceField( required=False, queryset=DeviceRole.objects.annotate(filter_count=Count('devices')), - to_field_name='slug' + to_field_name='slug', + label='Device Role' ) + device = forms.CharField(required=False, label='Device Name') #