Parcourir la source

Closes #841: Merged search and filter forms on all object lists

Jeremy Stretch il y a 8 ans
Parent
commit
1317c0dd8c

+ 2 - 0
netbox/circuits/forms.py

@@ -62,6 +62,7 @@ class ProviderBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Provider
+    q = forms.CharField(required=False, label='Search')
     site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug')
 
 
@@ -126,6 +127,7 @@ class CircuitBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class CircuitFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Circuit
+    q = forms.CharField(required=False, label='Search')
     type = FilterChoiceField(queryset=CircuitType.objects.annotate(filter_count=Count('circuits')),
                              to_field_name='slug')
     provider = FilterChoiceField(queryset=Provider.objects.annotate(filter_count=Count('circuits')),

+ 4 - 0
netbox/dcim/forms.py

@@ -101,6 +101,7 @@ class SiteBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class SiteFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Site
+    q = forms.CharField(required=False, label='Search')
     tenant = FilterChoiceField(queryset=Tenant.objects.annotate(filter_count=Count('sites')), to_field_name='slug',
                                null_option=(0, 'None'))
 
@@ -232,6 +233,7 @@ class RackBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class RackFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Rack
+    q = forms.CharField(required=False, label='Search')
     site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('racks')), to_field_name='slug')
     group_id = FilterChoiceField(queryset=RackGroup.objects.select_related('site')
                                  .annotate(filter_count=Count('racks')), label='Rack group', null_option=(0, 'None'))
@@ -281,6 +283,7 @@ class DeviceTypeBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class DeviceTypeFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = DeviceType
+    q = forms.CharField(required=False, label='Search')
     manufacturer = FilterChoiceField(queryset=Manufacturer.objects.annotate(filter_count=Count('device_types')),
                                      to_field_name='slug')
 
@@ -639,6 +642,7 @@ class DeviceBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Device
+    q = forms.CharField(required=False, label='Search')
     site = FilterChoiceField(
         queryset=Site.objects.annotate(filter_count=Count('racks__devices')),
         to_field_name='slug',

+ 8 - 3
netbox/ipam/forms.py

@@ -63,6 +63,7 @@ class VRFBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class VRFFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = VRF
+    q = forms.CharField(required=False, label='Search')
     tenant = FilterChoiceField(queryset=Tenant.objects.annotate(filter_count=Count('vrfs')), to_field_name='slug',
                                null_option=(0, None))
 
@@ -128,6 +129,7 @@ class AggregateBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class AggregateFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Aggregate
+    q = forms.CharField(required=False, label='Search')
     family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address Family')
     rir = FilterChoiceField(queryset=RIR.objects.annotate(filter_count=Count('aggregates')), to_field_name='slug',
                             label='RIR')
@@ -256,8 +258,9 @@ def prefix_status_choices():
 
 class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Prefix
-    parent = forms.CharField(required=False, label='Search Within', widget=forms.TextInput(attrs={
-        'placeholder': 'Network',
+    q = forms.CharField(required=False, label='Search')
+    parent = forms.CharField(required=False, label='Parent Prefix', widget=forms.TextInput(attrs={
+        'placeholder': 'Prefix',
     }))
     family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address Family')
     vrf = FilterChoiceField(queryset=VRF.objects.annotate(filter_count=Count('prefixes')), to_field_name='rd',
@@ -446,7 +449,8 @@ def ipaddress_status_choices():
 
 class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = IPAddress
-    parent = forms.CharField(required=False, label='Search Within', widget=forms.TextInput(attrs={
+    q = forms.CharField(required=False, label='Search')
+    parent = forms.CharField(required=False, label='Parent Prefix', widget=forms.TextInput(attrs={
         'placeholder': 'Prefix',
     }))
     family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address Family')
@@ -560,6 +564,7 @@ def vlan_status_choices():
 
 class VLANFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = VLAN
+    q = forms.CharField(required=False, label='Search')
     site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('vlans')), to_field_name='slug')
     group_id = FilterChoiceField(queryset=VLANGroup.objects.annotate(filter_count=Count('vlans')), label='VLAN group',
                                  null_option=(0, 'None'))

+ 1 - 0
netbox/secrets/forms.py

@@ -100,6 +100,7 @@ class SecretBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class SecretFilterForm(BootstrapMixin, forms.Form):
+    q = forms.CharField(required=False, label='Search')
     role = FilterChoiceField(queryset=SecretRole.objects.annotate(filter_count=Count('secrets')), to_field_name='slug')
 
 

+ 0 - 1
netbox/templates/circuits/circuit_list.html

@@ -24,7 +24,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

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

@@ -23,7 +23,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/dcim/console_connections_list.html

@@ -19,7 +19,7 @@
         {% render_table table 'table.html' %}
     </div>
     <div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/dcim/device_list.html

@@ -24,7 +24,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/dcim/devicetype_list.html

@@ -19,7 +19,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/dcim/interface_connections_list.html

@@ -19,7 +19,7 @@
         {% render_table table 'table.html' %}
     </div>
     <div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/dcim/power_connections_list.html

@@ -19,7 +19,7 @@
         {% render_table table 'table.html' %}
     </div>
     <div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/dcim/rack_list.html

@@ -24,7 +24,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/dcim/rackgroup_list.html

@@ -18,7 +18,7 @@
         {% include 'utilities/obj_table.html' with bulk_delete_url='dcim:rackgroup_bulk_delete' %}
     </div>
     <div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/dcim/site_list.html

@@ -23,7 +23,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 32
netbox/templates/inc/filter_panel.html

@@ -1,32 +0,0 @@
-{% load form_helpers %}
-
-{% if filter_form %}
-    <div class="panel panel-default">
-        <div class="panel-heading">
-            <span class="fa fa-filter" aria-hidden="true"></span>
-            <strong>Filter</strong>
-        </div>
-        <div class="panel-body">
-            <form action="." method="get" class="form">
-                {% for field in filter_form %}
-                    <div class="form-group">
-                        {% if field|widget_type == 'checkboxinput' %}
-                            <label for="{{ field.id_for_label }}">{{ field }} {{ field.label }}</label>
-                        {% else %}
-                            {{ field.label_tag }}
-                            {{ field }}
-                        {% endif %}
-                    </div>
-                {% endfor %}
-                <div class="text-right">
-                    <button type="submit" class="btn btn-primary">
-                        <span class="fa fa-search" aria-hidden="true"></span> Apply
-                    </button>
-                    <a href="." class="btn btn-default">
-                        <span class="fa fa-remove" aria-hidden="true"></span> Clear
-                    </a>
-                </div>
-            </form>
-        </div>
-    </div>
-{% endif %}

+ 28 - 7
netbox/templates/inc/search_panel.html

@@ -1,18 +1,39 @@
+{% load form_helpers %}
+
 <div class="panel panel-default">
     <div class="panel-heading">
         <span class="fa fa-search" aria-hidden="true"></span>
         <strong>Search</strong>
     </div>
     <div class="panel-body">
-        <form action="." method="get">
-            <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Search" {% if request.GET.q %}value="{{ request.GET.q }}" {% endif %}/>
-                <span class="input-group-btn">
+        <form action="." method="get" class="form">
+                {% for field in filter_form %}
+                    <div class="form-group">
+                        {% if field.name == "q" %}
+                            <div class="input-group">
+                                <input type="text" name="q" class="form-control" placeholder="Search" {% if request.GET.q %}value="{{ request.GET.q }}" {% endif %}/>
+                                <span class="input-group-btn">
+                                    <button type="submit" class="btn btn-primary">
+                                        <span class="fa fa-search" aria-hidden="true"></span>
+                                    </button>
+                                </span>
+                            </div>
+                        {% elif field|widget_type == 'checkboxinput' %}
+                            <label for="{{ field.id_for_label }}">{{ field }} {{ field.label }}</label>
+                        {% else %}
+                            {{ field.label_tag }}
+                            {{ field }}
+                        {% endif %}
+                    </div>
+                {% endfor %}
+                <div class="text-right">
                     <button type="submit" class="btn btn-primary">
-                        <span class="fa fa-search" aria-hidden="true"></span>
+                        <span class="fa fa-search" aria-hidden="true"></span> Apply
                     </button>
-                </span>
-            </div>
+                    <a href="." class="btn btn-default">
+                        <span class="fa fa-remove" aria-hidden="true"></span> Clear
+                    </a>
+                </div>
         </form>
     </div>
 </div>

+ 0 - 1
netbox/templates/ipam/aggregate_list.html

@@ -27,7 +27,6 @@
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/ipam/ipaddress_list.html

@@ -25,7 +25,6 @@
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/ipam/prefix_list.html

@@ -34,7 +34,6 @@
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/ipam/rir_list.html

@@ -33,7 +33,7 @@
         {% endif %}
     </div>
 	<div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/ipam/vlan_list.html

@@ -25,7 +25,6 @@
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/ipam/vlangroup_list.html

@@ -18,7 +18,7 @@
         {% include 'utilities/obj_table.html' with bulk_delete_url='ipam:vlangroup_bulk_delete' %}
     </div>
     <div class="col-md-3">
-		{% include 'inc/filter_panel.html' %}
+		{% include 'inc/search_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/ipam/vrf_list.html

@@ -25,7 +25,6 @@
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/secrets/secret_list.html

@@ -19,7 +19,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 0 - 1
netbox/templates/tenancy/tenant_list.html

@@ -24,7 +24,6 @@
     </div>
     <div class="col-md-3">
 		{% include 'inc/search_panel.html' %}
-		{% include 'inc/filter_panel.html' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 0
netbox/tenancy/forms.py

@@ -55,5 +55,6 @@ class TenantBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class TenantFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Tenant
+    q = forms.CharField(required=False, label='Search')
     group = FilterChoiceField(queryset=TenantGroup.objects.annotate(filter_count=Count('tenants')),
                               to_field_name='slug', null_option=(0, 'None'))