diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 59ff6ca4c..e3faa6332 100644 --- a/netbox/circuits/filters.py +++ b/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) + ) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 08f0d671e..1800bf266 100644 --- a/netbox/dcim/filters.py +++ b/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() diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 70a382856..de8a240bb 100644 --- a/netbox/ipam/filters.py +++ b/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) diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index 4606b3db5..a821402cf 100644 --- a/netbox/secrets/filters.py +++ b/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) + ) diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index 7c4f6b8fa..308e9a5c5 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -15,7 +15,7 @@
- +
-
-
- Search -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/circuits/provider.html b/netbox/templates/circuits/provider.html index 333a07faf..8ee2e0055 100644 --- a/netbox/templates/circuits/provider.html +++ b/netbox/templates/circuits/provider.html @@ -6,12 +6,24 @@ {% block content %}
-
+
+
+
+
+ + + + +
+
+
-
-
- Search -
-
-
-
- - - - -
-
-
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/dcim/device_list.html b/netbox/templates/dcim/device_list.html index ee127cf48..c358ef90f 100644 --- a/netbox/templates/dcim/device_list.html +++ b/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' %}
-
-
- - Search -
-
-
-
- - - - -
-
-
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/dcim/inc/_device_header.html b/netbox/templates/dcim/inc/_device_header.html index a038b96b2..ca3c25f87 100644 --- a/netbox/templates/dcim/inc/_device_header.html +++ b/netbox/templates/dcim/inc/_device_header.html @@ -16,7 +16,7 @@
- +
-
-
- - Search -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index 28562c088..f8f110679 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -16,7 +16,7 @@
- +
-
-
- - Search -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/home.html b/netbox/templates/home.html index 9c0b69cef..1228f1e45 100644 --- a/netbox/templates/home.html +++ b/netbox/templates/home.html @@ -6,7 +6,7 @@
- +
@@ -34,7 +34,7 @@
- + + +
+ +
+
diff --git a/netbox/templates/ipam/aggregate.html b/netbox/templates/ipam/aggregate.html index 0e9f54ebc..31e9c2709 100644 --- a/netbox/templates/ipam/aggregate.html +++ b/netbox/templates/ipam/aggregate.html @@ -5,13 +5,25 @@ {% block content %}
-
+ +
+
+
+ + + + +
+
+
{% if perms.ipam.change_aggregate %} diff --git a/netbox/templates/ipam/aggregate_list.html b/netbox/templates/ipam/aggregate_list.html index af8f87893..71223f596 100644 --- a/netbox/templates/ipam/aggregate_list.html +++ b/netbox/templates/ipam/aggregate_list.html @@ -22,6 +22,7 @@

IPv6 total: {{ ipv6_total|intcomma }} /64s

+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/ipam/inc/prefix_header.html b/netbox/templates/ipam/inc/prefix_header.html index 5c3896884..e5a5ed872 100644 --- a/netbox/templates/ipam/inc/prefix_header.html +++ b/netbox/templates/ipam/inc/prefix_header.html @@ -11,7 +11,7 @@
- +
-
-
- - Search -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/ipam/prefix_list.html b/netbox/templates/ipam/prefix_list.html index 81fd7b795..7020e2eb8 100644 --- a/netbox/templates/ipam/prefix_list.html +++ b/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' %}
-
-
- - Search -
-
-
-
- - - - -
-
-
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html index 9555a6ea9..111f28eda 100644 --- a/netbox/templates/ipam/vlan.html +++ b/netbox/templates/ipam/vlan.html @@ -18,7 +18,7 @@
- +
-
-
- - Search by ID -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/ipam/vrf.html b/netbox/templates/ipam/vrf.html index 8a8f67c9b..5f357dd01 100644 --- a/netbox/templates/ipam/vrf.html +++ b/netbox/templates/ipam/vrf.html @@ -14,7 +14,7 @@
- +
-
-
- Search -
-
- -
- - - - -
- -
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/secrets/secret_list.html b/netbox/templates/secrets/secret_list.html index c9a785084..5035ef6c5 100644 --- a/netbox/templates/secrets/secret_list.html +++ b/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' %}
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/templates/tenancy/tenant_list.html b/netbox/templates/tenancy/tenant_list.html index 2d46412a3..d6fdfbc75 100644 --- a/netbox/templates/tenancy/tenant_list.html +++ b/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' %}
-
-
- Search -
-
-
-
- - - - -
-
-
-
+ {% include 'inc/search_panel.html' %} {% include 'inc/filter_panel.html' %}
diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index 8ae273c88..3493c94ea 100644 --- a/netbox/tenancy/filters.py +++ b/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) + )