Add filter fields and add generic search to InterfaceFilterForm

This commit is contained in:
Joseph Kennedy 2017-08-30 03:02:22 -04:00
parent d0327c8b0d
commit 0b8d251cd6
2 changed files with 38 additions and 4 deletions

View File

@ -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):

View File

@ -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)