diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 59ff6ca4c4e..e3faa633226 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 08f0d671e94..1800bf2669d 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 70a38285616..de8a240bb4f 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 4606b3db5b9..a821402cfde 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 7c4f6b8fad5..308e9a5c52a 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 333a07fafcf..8ee2e0055ee 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 ee127cf483b..c358ef90ffa 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 a038b96b252..ca3c25f87a8 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 28562c0883d..f8f1106791e 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 9c0b69cef17..1228f1e458f 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 0e9f54ebc8a..31e9c2709f7 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 af8f87893d6..71223f5965e 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 5c389688496..e5a5ed87208 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 81fd7b795f5..7020e2eb8ea 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 9555a6ea951..111f28edaf0 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 8a8f67c9b33..5f357dd014c 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 c9a785084af..5035ef6c5f4 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 2d46412a316..d6fdfbc751b 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 8ae273c8846..3493c94ea54 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) + )