diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 332341b64..e4a11faf0 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -5,11 +5,12 @@ from django.db.models import Q from dcim.models import Site from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Provider, Circuit, CircuitTermination, CircuitType class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -41,6 +42,7 @@ class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 6c2431359..00b227f97 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -5,7 +5,7 @@ from django.db.models import Q from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import ( ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, IFACE_FF_LAG, Interface, InterfaceConnection, InterfaceTemplate, @@ -15,6 +15,7 @@ from .models import ( class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -82,6 +83,7 @@ class RackGroupFilter(django_filters.FilterSet): class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -158,6 +160,7 @@ class RackReservationFilter(django_filters.FilterSet): class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -248,6 +251,7 @@ class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet): class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 10a18d1b7..3c39a4308 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -7,12 +7,13 @@ from django.db.models import Q from dcim.models import Site, Device, Interface from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -44,6 +45,7 @@ class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): class RIRFilter(django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') class Meta: model = RIR @@ -51,6 +53,7 @@ class RIRFilter(django_filters.FilterSet): class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -84,6 +87,7 @@ class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -182,6 +186,7 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -283,6 +288,7 @@ class VLANGroupFilter(django_filters.FilterSet): class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index f60041032..14ebd1616 100644 --- a/netbox/secrets/filters.py +++ b/netbox/secrets/filters.py @@ -4,9 +4,11 @@ from django.db.models import Q from .models import Secret, SecretRole from dcim.models import Device +from utilities.filters import NumericInFilter class SecretFilter(django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index ed1721102..b96345980 100644 --- a/netbox/tenancy/filters.py +++ b/netbox/tenancy/filters.py @@ -3,11 +3,12 @@ import django_filters from django.db.models import Q from extras.filters import CustomFieldFilterSet -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Tenant, TenantGroup class TenantFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index d1dbf39b8..c352f0f41 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -6,6 +6,17 @@ from django.db.models import Q from django.utils.encoding import force_text +# +# Filters +# + +class NumericInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): + """ + Filters for a set of numeric values. Example: id__in=100,200,300 + """ + pass + + class NullableModelMultipleChoiceField(forms.ModelMultipleChoiceField): """ This field operates like a normal ModelMultipleChoiceField except that it allows for one additional choice which is