Browse Source

Closes #358: Improved search of all objects

Jeremy Stretch 8 years ago
parent
commit
38aee33df0

+ 8 - 4
netbox/circuits/filters.py

@@ -29,10 +29,10 @@ class ProviderFilter(django_filters.FilterSet):
         fields = ['q', 'name', 'account', 'asn']
 
     def search(self, queryset, value):
-        value = value.strip()
         return queryset.filter(
             Q(name__icontains=value) |
-            Q(account__icontains=value)
+            Q(account__icontains=value) |
+            Q(comments__icontains=value)
         )
 
 
@@ -91,5 +91,9 @@ class CircuitFilter(django_filters.FilterSet):
         fields = ['q', 'provider_id', 'provider', 'type_id', 'type', 'site_id', 'site', 'interface', 'install_date']
 
     def search(self, queryset, value):
-        value = value.strip()
-        return queryset.filter(cid__icontains=value)
+        return queryset.filter(
+            Q(cid__icontains=value) |
+            Q(xconnect_id__icontains=value) |
+            Q(pp_info__icontains=value) |
+            Q(comments__icontains=value)
+        )

+ 6 - 7
netbox/dcim/filters.py

@@ -31,11 +31,10 @@ class SiteFilter(django_filters.FilterSet):
         fields = ['q', 'name', 'facility', 'asn']
 
     def search(self, queryset, value):
-        value = value.strip()
         qs_filter = Q(name__icontains=value) | Q(facility__icontains=value) | Q(physical_address__icontains=value) | \
-            Q(shipping_address__icontains=value)
+            Q(shipping_address__icontains=value) | Q(comments__icontains=value)
         try:
-            qs_filter |= Q(asn=int(value))
+            qs_filter |= Q(asn=int(value.strip()))
         except ValueError:
             pass
         return queryset.filter(qs_filter)
@@ -103,10 +102,10 @@ class RackFilter(django_filters.FilterSet):
         fields = ['q', 'site_id', 'site', 'u_height']
 
     def search(self, queryset, value):
-        value = value.strip()
         return queryset.filter(
             Q(name__icontains=value) |
-            Q(facility_id__icontains=value)
+            Q(facility_id__icontains=value) |
+            Q(comments__icontains=value)
         )
 
 
@@ -234,11 +233,11 @@ class DeviceFilter(django_filters.FilterSet):
                   'is_network_device']
 
     def search(self, queryset, value):
-        value = value.strip()
         return queryset.filter(
             Q(name__icontains=value) |
             Q(serial__icontains=value) |
-            Q(modules__serial__icontains=value)
+            Q(modules__serial__icontains=value) |
+            Q(comments__icontains=value)
         ).distinct()
 
 

+ 46 - 8
netbox/ipam/filters.py

@@ -11,6 +11,10 @@ from .models import RIR, Aggregate, VRF, Prefix, IPAddress, VLAN, VLANGroup, Rol
 
 
 class VRFFilter(django_filters.FilterSet):
+    q = django_filters.MethodFilter(
+        action='search',
+        label='Search',
+    )
     name = django_filters.CharFilter(
         name='name',
         lookup_type='icontains',
@@ -28,12 +32,23 @@ class VRFFilter(django_filters.FilterSet):
         label='Tenant (slug)',
     )
 
+    def search(self, queryset, value):
+        return queryset.filter(
+            Q(name__icontains=value) |
+            Q(rd__icontains=value) |
+            Q(description__icontains=value)
+        )
+
     class Meta:
         model = VRF
         fields = ['name', 'rd']
 
 
 class AggregateFilter(django_filters.FilterSet):
+    q = django_filters.MethodFilter(
+        action='search',
+        label='Search',
+    )
     rir_id = django_filters.ModelMultipleChoiceFilter(
         name='rir',
         queryset=RIR.objects.all(),
@@ -50,6 +65,15 @@ class AggregateFilter(django_filters.FilterSet):
         model = Aggregate
         fields = ['family', 'rir_id', 'rir', 'date_added']
 
+    def search(self, queryset, value):
+        qs_filter = Q(description__icontains=value)
+        try:
+            prefix = str(IPNetwork(value.strip()).cidr)
+            qs_filter |= Q(prefix__net_contains_or_equals=prefix)
+        except AddrFormatError:
+            pass
+        return queryset.filter(qs_filter)
+
 
 class PrefixFilter(django_filters.FilterSet):
     q = django_filters.MethodFilter(
@@ -114,12 +138,13 @@ class PrefixFilter(django_filters.FilterSet):
         fields = ['family', 'site_id', 'site', 'vrf', 'vrf_id', 'vlan_id', 'vlan_vid', 'status', 'role_id', 'role']
 
     def search(self, queryset, value):
-        value = value.strip()
+        qs_filter = Q(description__icontains=value)
         try:
-            query = str(IPNetwork(value).cidr)
-            return queryset.filter(prefix__net_contains_or_equals=query)
+            prefix = str(IPNetwork(value.strip()).cidr)
+            qs_filter |= Q(prefix__net_contains_or_equals=prefix)
         except AddrFormatError:
-            return queryset.none()
+            pass
+        return queryset.filter(qs_filter)
 
     def search_by_parent(self, queryset, value):
         value = value.strip()
@@ -205,12 +230,13 @@ class IPAddressFilter(django_filters.FilterSet):
         fields = ['q', 'family', 'vrf_id', 'vrf', 'device_id', 'device', 'interface_id']
 
     def search(self, queryset, value):
-        value = value.strip()
+        qs_filter = Q(description__icontains=value)
         try:
-            query = str(IPNetwork(value))
-            return queryset.filter(address__net_host=query)
+            ipaddress = str(IPNetwork(value.strip()))
+            qs_filter |= Q(address__net_host=ipaddress)
         except AddrFormatError:
-            return queryset.none()
+            pass
+        return queryset.filter(qs_filter)
 
     def _vrf(self, queryset, value):
         if str(value) == '':
@@ -261,6 +287,10 @@ class VLANGroupFilter(django_filters.FilterSet):
 
 
 class VLANFilter(django_filters.FilterSet):
+    q = django_filters.MethodFilter(
+        action='search',
+        label='Search',
+    )
     site_id = django_filters.ModelMultipleChoiceFilter(
         name='site',
         queryset=Site.objects.all(),
@@ -318,3 +348,11 @@ class VLANFilter(django_filters.FilterSet):
     class Meta:
         model = VLAN
         fields = ['site_id', 'site', 'vid', 'name', 'status', 'role_id', 'role']
+
+    def search(self, queryset, value):
+        qs_filter = Q(name__icontains=value) | Q(description__icontains=value)
+        try:
+            qs_filter |= Q(vid=int(value))
+        except ValueError:
+            pass
+        return queryset.filter(qs_filter)

+ 12 - 0
netbox/secrets/filters.py

@@ -1,10 +1,16 @@
 import django_filters
 
+from django.db.models import Q
+
 from .models import Secret, SecretRole
 from dcim.models import Device
 
 
 class SecretFilter(django_filters.FilterSet):
+    q = django_filters.MethodFilter(
+        action='search',
+        label='Search',
+    )
     role_id = django_filters.ModelMultipleChoiceFilter(
         name='role',
         queryset=SecretRole.objects.all(),
@@ -26,3 +32,9 @@ class SecretFilter(django_filters.FilterSet):
     class Meta:
         model = Secret
         fields = ['name', 'role_id', 'role', 'device']
+
+    def search(self, queryset, value):
+        return queryset.filter(
+            Q(name__icontains=value) |
+            Q(device__name__icontains=value)
+        )

+ 1 - 1
netbox/templates/circuits/circuit.html

@@ -15,7 +15,7 @@
     <div class="col-md-3">
         <form action="{% url 'circuits:circuit_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Circuit ID" />
+                <input type="text" name="q" class="form-control" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -19,23 +19,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='circuits:circuit_bulk_edit' bulk_delete_url='circuits:circuit_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:circuit_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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

+ 13 - 1
netbox/templates/circuits/provider.html

@@ -6,12 +6,24 @@
 
 {% block content %}
 <div class="row">
-    <div class="col-md-12">
+    <div class="col-md-9">
         <ol class="breadcrumb">
             <li><a href="{% url 'circuits:provider_list' %}">Providers</a></li>
             <li>{{ provider }}</li>
         </ol>
     </div>
+    <div class="col-md-3">
+        <form action="{% url 'circuits:provider_list' %}" method="get">
+            <div class="input-group">
+                <input type="text" name="q" class="form-control" />
+                <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>
 <div class="pull-right">
     <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ provider.name }}" data-url="{% url 'circuits-api:provider_graphs' pk=provider.pk %}" title="Show graphs">

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

@@ -18,23 +18,7 @@
         {% 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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

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

@@ -23,24 +23,7 @@
         {% include 'dcim/inc/device_table.html' with bulk_edit_url='dcim:device_bulk_edit' bulk_delete_url='dcim:device_bulk_delete' %}
     </div>
     <div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'dcim:device_list' %}" method="get">
-					<div class="input-group">
-						<input type="text" name="q" class="form-control" placeholder="Name or serial" {% 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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

+ 1 - 1
netbox/templates/dcim/inc/_device_header.html

@@ -16,7 +16,7 @@
     <div class="col-md-3">
         <form action="{% url 'dcim:device_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Device name or serial" />
+                <input type="text" name="q" class="form-control" placeholder="Search devices" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -16,7 +16,7 @@
     <div class="col-md-3">
         <form action="{% url 'dcim:rack_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Rack name or ID" />
+                <input type="text" name="q" class="form-control" placeholder="Search racks" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -23,24 +23,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:rack_bulk_edit' bulk_delete_url='dcim:rack_bulk_delete' %}
     </div>
     <div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'dcim:rack_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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

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

@@ -16,7 +16,7 @@
     <div class="col-md-3">
         <form action="{% url 'dcim:site_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Search" />
+                <input type="text" name="q" class="form-control" placeholder="Search sites" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -22,24 +22,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:site_bulk_edit' %}
     </div>
     <div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'dcim:site_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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

+ 4 - 4
netbox/templates/home.html

@@ -6,7 +6,7 @@
 	<div class="col-md-4">
 		<form action="{% url 'dcim:device_list' %}" method="get">
 			<div class="input-group input-group-lg">
-				<input type="text" name="q" placeholder="Device name or serial" class="form-control" />
+				<input type="text" name="q" placeholder="Search devices" class="form-control" />
 				<span class="input-group-btn">
 					<button type="submit" class="btn btn-primary">
 						<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
@@ -20,11 +20,11 @@
 	<div class="col-md-4">
 		<form action="{% url 'ipam:prefix_list' %}" method="get">
 			<div class="input-group input-group-lg">
-				<input type="text" name="q" placeholder="IP or network" class="form-control" />
+				<input type="text" name="q" placeholder="Search prefixes" class="form-control" />
 				<span class="input-group-btn">
 					<button type="submit" class="btn btn-primary">
 						<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
-						IP
+						Prefixes
 					</button>
 				</span>
 			</div>
@@ -34,7 +34,7 @@
 	<div class="col-md-4">
 		<form action="{% url 'circuits:circuit_list' %}" method="get">
 			<div class="input-group input-group-lg">
-				<input type="text" name="q" placeholder="Circuit ID" class="form-control" />
+				<input type="text" name="q" placeholder="Search circuits" class="form-control" />
 				<span class="input-group-btn">
 					<button type="submit" class="btn btn-primary">
 						<span class="glyphicon glyphicon-search" aria-hidden="true"></span>

+ 18 - 0
netbox/templates/inc/search_panel.html

@@ -0,0 +1,18 @@
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <span class="glyphicon glyphicon-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">
+                    <button type="submit" class="btn btn-primary">
+                        <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
+                    </button>
+                </span>
+            </div>
+        </form>
+    </div>
+</div>

+ 13 - 1
netbox/templates/ipam/aggregate.html

@@ -5,13 +5,25 @@
 
 {% block content %}
 <div class="row">
-    <div class="col-md-12">
+    <div class="col-md-9">
         <ol class="breadcrumb">
             <li><a href="{% url 'ipam:aggregate_list' %}">Aggregates</a></li>
             <li><a href="{% url 'ipam:aggregate_list' %}?rir={{ aggregate.rir.slug }}">{{ aggregate.rir }}</a></li>
             <li>{{ aggregate }}</li>
         </ol>
     </div>
+    <div class="col-md-3">
+        <form action="{% url 'ipam:aggregate_list' %}" method="get">
+            <div class="input-group">
+                <input type="text" name="q" class="form-control" placeholder="Search aggregates" />
+                <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>
 <div class="pull-right">
     {% if perms.ipam.change_aggregate %}

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

@@ -22,6 +22,7 @@
         <p class="text-right">IPv6 total: <strong>{{ ipv6_total|intcomma }} /64s</strong></p>
 	</div>
 	<div class="col-md-3">
+		{% include 'inc/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>

+ 1 - 1
netbox/templates/ipam/inc/prefix_header.html

@@ -11,7 +11,7 @@
     <div class="col-md-3">
         <form action="{% url 'ipam:prefix_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="Network or IP" />
+                <input type="text" name="q" class="form-control" placeholder="Search prefixes" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -17,7 +17,7 @@
     <div class="col-md-3">
         <form action="{% url 'ipam:ipaddress_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="q" class="form-control" placeholder="IP address" />
+                <input type="text" name="q" class="form-control" placeholder="Search IPs" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -24,24 +24,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:ipaddress_bulk_edit' bulk_delete_url='ipam:ipaddress_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'ipam:ipaddress_list' %}" method="get">
-					<div class="input-group">
-						<input type="text" name="q" class="form-control" placeholder="IP address" {%  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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>

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

@@ -24,24 +24,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'ipam:prefix_list' %}" method="get">
-					<div class="input-group">
-						<input type="text" name="q" class="form-control" placeholder="Network" {% 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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>

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

@@ -18,7 +18,7 @@
     <div class="col-md-3">
     <form action="{% url 'ipam:vlan_list' %}" method="get">
         <div class="input-group">
-            <input type="text" name="vid" class="form-control" placeholder="VLAN ID search" />
+            <input type="text" name="q" class="form-control" placeholder="Search VLANs" />
             <span class="input-group-btn">
                 <button type="submit" class="btn btn-primary">
                     <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -24,24 +24,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vlan_bulk_edit' bulk_delete_url='ipam:vlan_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
-		<div class="panel panel-default">
-			<div class="panel-heading">
-				<span class="glyphicon glyphicon-search" aria-hidden="true"></span> 
-				<strong>Search by ID</strong>
-			</div>
-			<div class="panel-body">
-				<form action="{% url 'ipam:vlan_list' %}" method="get">
-					<div class="input-group">
-						<input type="text" name="vid" class="form-control" placeholder="VLAN ID" {%  if request.GET.vid %}value="{{ request.GET.vid }}" {% 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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>

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

@@ -14,7 +14,7 @@
     <div class="col-md-3">
         <form action="{% url 'ipam:vrf_list' %}" method="get">
             <div class="input-group">
-                <input type="text" name="name" class="form-control" placeholder="VRF name" />
+                <input type="text" name="q" class="form-control" placeholder="Search VRFs" />
                 <span class="input-group-btn">
                     <button type="submit" class="btn btn-primary">
                         <span class="glyphicon glyphicon-search" aria-hidden="true"></span>

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

@@ -24,23 +24,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vrf_bulk_edit' bulk_delete_url='ipam:vrf_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 'ipam:vrf_list' %}" method="get">
-					<div class="input-group">
-						<input type="text" name="name" 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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
 	</div>
 </div>

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

@@ -18,6 +18,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='secrets:secret_bulk_edit' bulk_delete_url='secrets:secret_bulk_delete' %}
     </div>
     <div class="col-md-3">
+		{% include 'inc/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

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

@@ -19,23 +19,7 @@
         {% include 'utilities/obj_table.html' with bulk_edit_url='tenancy:tenant_bulk_edit' bulk_delete_url='tenancy:tenant_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 'tenancy:tenant_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/search_panel.html' %}
 		{% include 'inc/filter_panel.html' %}
     </div>
 </div>

+ 7 - 2
netbox/tenancy/filters.py

@@ -1,5 +1,7 @@
 import django_filters
 
+from django.db.models import Q
+
 from .models import Tenant, TenantGroup
 
 
@@ -25,5 +27,8 @@ class TenantFilter(django_filters.FilterSet):
         fields = ['q', 'group_id', 'group', 'name']
 
     def search(self, queryset, value):
-        value = value.strip()
-        return queryset.filter(name__icontains=value)
+        return queryset.filter(
+            Q(name__icontains=value) |
+            Q(description__icontains=value) |
+            Q(comments__icontains=value)
+        )