diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 49d5e1b80..fc6628e87 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -1,9 +1,40 @@ import django_filters +from django.db.models import Q + from dcim.models import Site from .models import Provider, Circuit, CircuitType +class ProviderFilter(django_filters.FilterSet): + q = django_filters.MethodFilter( + action='search', + label='Search', + ) + site_id = django_filters.ModelMultipleChoiceFilter( + name='circuits__site', + queryset=Site.objects.all(), + label='Site', + ) + site = django_filters.ModelMultipleChoiceFilter( + name='circuits__site', + queryset=Site.objects.all(), + to_field_name='slug', + label='Site (slug)', + ) + + class Meta: + model = Provider + fields = ['q', 'name', 'account', 'asn'] + + def search(self, queryset, value): + value = value.strip() + return queryset.filter( + Q(name__icontains=value) | + Q(account__icontains=value) + ) + + class CircuitFilter(django_filters.FilterSet): q = django_filters.MethodFilter( action='search', diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py index 7046b8ec3..847402c7d 100644 --- a/netbox/circuits/forms.py +++ b/netbox/circuits/forms.py @@ -59,6 +59,16 @@ class ProviderBulkDeleteForm(ConfirmationForm): pk = forms.ModelMultipleChoiceField(queryset=Provider.objects.all(), widget=forms.MultipleHiddenInput) +def provider_site_choices(): + site_choices = Site.objects.all() + return [(s.slug, s.name) for s in site_choices] + + +class ProviderFilterForm(forms.Form, BootstrapMixin): + site = forms.MultipleChoiceField(required=False, choices=provider_site_choices, + widget=forms.SelectMultiple(attrs={'size': 8})) + + # # Circuit types # diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 91be2ad54..790b8ba23 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -16,6 +16,8 @@ from .models import Circuit, CircuitType, Provider class ProviderListView(ObjectListView): queryset = Provider.objects.annotate(count_circuits=Count('circuits')) + filter = filters.ProviderFilter + filter_form = forms.ProviderFilterForm table = tables.ProviderTable edit_permissions = ['circuits.change_provider', 'circuits.delete_provider'] template_name = 'circuits/provider_list.html' diff --git a/netbox/templates/circuits/provider_list.html b/netbox/templates/circuits/provider_list.html index 2b5bfc68c..c6b81063b 100644 --- a/netbox/templates/circuits/provider_list.html +++ b/netbox/templates/circuits/provider_list.html @@ -14,8 +14,28 @@