Browse Source

Fixes #174: Added search and site filter to provider list

Jeremy Stretch 8 years ago
parent
commit
e5a6a4f05e

+ 31 - 0
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',

+ 10 - 0
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
 #

+ 2 - 0
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'

+ 21 - 1
netbox/templates/circuits/provider_list.html

@@ -14,8 +14,28 @@
 </div>
 <h1>Providers</h1>
 <div class="row">
-    <div class="col-md-12">
+    <div class="col-md-9">
         {% include 'utilities/obj_table.html' with bulk_edit_url='circuits:provider_bulk_edit' bulk_delete_url='circuits:provider_bulk_delete' %}
     </div>
+    <div class="col-md-3">
+		<div class="panel panel-default">
+			<div class="panel-heading">
+				<strong>Search</strong>
+			</div>
+			<div class="panel-body">
+				<form action="{% url 'circuits:provider_list' %}" method="get">
+					<div class="input-group">
+						<input type="text" name="q" class="form-control" placeholder="Name" {% if request.GET.q %}value="{{ request.GET.q }}" {% endif %}/>
+						<span class="input-group-btn">
+							<button type="submit" class="btn btn-primary">
+								<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
+							</button>
+						</span>
+					</div>
+				</form>
+			</div>
+		</div>
+		{% include 'inc/filter_panel.html' %}
+    </div>
 </div>
 {% endblock %}