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 @@