diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index a1b90da38..742fdf619 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -519,8 +519,7 @@ class PowerOutletFilter(DeviceComponentFilterSet): class InterfaceFilter(django_filters.FilterSet): """ - Not using DeviceComponentFilterSet for Interfaces because we need to glean the ordering logic from the parent - Device's DeviceType. + """ device = django_filters.CharFilter( method='filter_device', @@ -536,6 +535,16 @@ class InterfaceFilter(django_filters.FilterSet): method='filter_type', label='Interface type', ) + site_id = django_filters.ModelMultipleChoiceFilter( + queryset=Site.objects.all(), + label='Site (ID)', + ) + site = django_filters.ModelMultipleChoiceFilter( + name='site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label='Site name (slug)', + ) lag_id = django_filters.ModelMultipleChoiceFilter( name='lag', queryset=Interface.objects.all(), @@ -578,11 +587,20 @@ class InterfaceFilter(django_filters.FilterSet): class InterfaceListFilter(django_filters.FilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) device_id = django_filters.NumberFilter( method='filter_device', name='pk', label='Device (ID)', ) + device = django_filters.CharFilter( + method='filter_device', + name='name', + label='Device', + ) type = django_filters.CharFilter( method='filter_type', label='Interface type', @@ -623,10 +641,21 @@ class InterfaceListFilter(django_filters.FilterSet): if not value: return queryset try: - return queryset.filter(mac_address=value) + return queryset.filter(interfaces__mac_address=value).distinct() except AddrFormatError: return queryset.none() + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(serial__icontains=value.strip()) | + Q(inventory_items__serial__icontains=value.strip()) | + Q(asset_tag=value.strip()) | + Q(comments__icontains=value) + ).distinct() + class DeviceBayFilter(DeviceComponentFilterSet): diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 42bb25f54..99d74d2f0 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1618,7 +1618,12 @@ class InterfaceFilterForm(BootstrapMixin, forms.Form): class InterfaceListFilterForm(BootstrapMixin, forms.Form): - site = forms.ModelChoiceField(required=False, queryset=Site.objects.all(), to_field_name='slug') + model = Interface + q = forms.CharField(required=False, label='Search') + site = FilterChoiceField( + queryset=Site.objects.annotate(filter_count=Count('devices')), + 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)