Skip to content

Commit

Permalink
Closes netbox-community#358: Improved search of all objects
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremystretch committed Jul 29, 2016
1 parent f4fec5c commit dc581e5
Show file tree
Hide file tree
Showing 29 changed files with 147 additions and 211 deletions.
12 changes: 8 additions & 4 deletions netbox/circuits/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ class Meta:
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)
)


Expand Down Expand Up @@ -91,5 +91,9 @@ class Meta:
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)
)
13 changes: 6 additions & 7 deletions netbox/dcim/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,10 @@ class Meta:
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)
Expand Down Expand Up @@ -103,10 +102,10 @@ class Meta:
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)
)


Expand Down Expand Up @@ -234,11 +233,11 @@ class Meta:
'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()


Expand Down
54 changes: 46 additions & 8 deletions netbox/ipam/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@


class VRFFilter(django_filters.FilterSet):
q = django_filters.MethodFilter(
action='search',
label='Search',
)
name = django_filters.CharFilter(
name='name',
lookup_type='icontains',
Expand All @@ -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(),
Expand All @@ -50,6 +65,15 @@ class Meta:
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(
Expand Down Expand Up @@ -114,12 +138,13 @@ class Meta:
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()
Expand Down Expand Up @@ -205,12 +230,13 @@ class Meta:
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) == '':
Expand Down Expand Up @@ -261,6 +287,10 @@ class Meta:


class VLANFilter(django_filters.FilterSet):
q = django_filters.MethodFilter(
action='search',
label='Search',
)
site_id = django_filters.ModelMultipleChoiceFilter(
name='site',
queryset=Site.objects.all(),
Expand Down Expand Up @@ -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 changes: 12 additions & 0 deletions netbox/secrets/filters.py
Original file line number Diff line number Diff line change
@@ -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(),
Expand 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)
)
2 changes: 1 addition & 1 deletion netbox/templates/circuits/circuit.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
18 changes: 1 addition & 17 deletions netbox/templates/circuits/circuit_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,7 @@ <h1>Circuits</h1>
{% 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>
Expand Down
14 changes: 13 additions & 1 deletion netbox/templates/circuits/provider.html
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand Down
18 changes: 1 addition & 17 deletions netbox/templates/circuits/provider_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,7 @@ <h1>Providers</h1>
{% 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>
Expand Down
19 changes: 1 addition & 18 deletions netbox/templates/dcim/device_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,7 @@ <h1>Devices</h1>
{% 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>
Expand Down
2 changes: 1 addition & 1 deletion netbox/templates/dcim/inc/_device_header.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
2 changes: 1 addition & 1 deletion netbox/templates/dcim/rack.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
19 changes: 1 addition & 18 deletions netbox/templates/dcim/rack_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,7 @@ <h1>Racks</h1>
{% 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>
Expand Down
2 changes: 1 addition & 1 deletion netbox/templates/dcim/site.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
19 changes: 1 addition & 18 deletions netbox/templates/dcim/site_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,7 @@ <h1>Sites</h1>
{% 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>
Expand Down
Loading

0 comments on commit dc581e5

Please sign in to comment.