diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 77f713899..faf29584f 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -11,6 +11,7 @@ from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, TreeNodeMultipleChoiceFilter, ) +from utilities.filtersets import register_filterset from .choices import * from .models import * @@ -29,6 +30,7 @@ __all__ = ( ) +@register_filterset class ProviderFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -93,6 +95,7 @@ class ProviderFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): ) +@register_filterset class ProviderAccountFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( queryset=Provider.objects.all(), @@ -120,6 +123,7 @@ class ProviderAccountFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): ).distinct() +@register_filterset class ProviderNetworkFilterSet(PrimaryModelFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( queryset=Provider.objects.all(), @@ -147,6 +151,7 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): ).distinct() +@register_filterset class CircuitTypeFilterSet(OrganizationalModelFilterSet): class Meta: @@ -154,6 +159,7 @@ class CircuitTypeFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'color', 'description') +@register_filterset class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( queryset=Provider.objects.all(), @@ -265,6 +271,7 @@ class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilt ).distinct() +@register_filterset class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet): q = django_filters.CharFilter( method='search', @@ -360,6 +367,7 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet): ).distinct() +@register_filterset class CircuitGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): class Meta: @@ -367,6 +375,7 @@ class CircuitGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', @@ -466,6 +475,7 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): ) +@register_filterset class VirtualCircuitTypeFilterSet(OrganizationalModelFilterSet): class Meta: @@ -473,6 +483,7 @@ class VirtualCircuitTypeFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'color', 'description') +@register_filterset class VirtualCircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( field_name='provider_network__provider', @@ -529,6 +540,7 @@ class VirtualCircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ).distinct() +@register_filterset class VirtualCircuitTerminationFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index a5b037d89..0be94a8f9 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -11,7 +11,7 @@ from ipam.models import ASN from netbox.choices import DistanceUnitChoices from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm from tenancy.forms import TenancyFilterForm, ContactModelFilterForm -from utilities.forms import add_blank_choice, register_filterset +from utilities.forms import add_blank_choice from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DatePicker, NumberWithOptions @@ -32,7 +32,6 @@ __all__ = ( ) -@register_filterset(ProviderFilterSet) class ProviderFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): model = Provider fieldsets = ( @@ -68,7 +67,6 @@ class ProviderFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ProviderAccountFilterSet) class ProviderAccountFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): model = ProviderAccount fieldsets = ( @@ -88,7 +86,6 @@ class ProviderAccountFilterForm(ContactModelFilterForm, PrimaryModelFilterSetFor tag = TagFilterField(model) -@register_filterset(ProviderNetworkFilterSet) class ProviderNetworkFilterForm(PrimaryModelFilterSetForm): model = ProviderNetwork fieldsets = ( @@ -108,7 +105,6 @@ class ProviderNetworkFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(CircuitTypeFilterSet) class CircuitTypeFilterForm(OrganizationalModelFilterSetForm): model = CircuitType fieldsets = ( @@ -123,7 +119,6 @@ class CircuitTypeFilterForm(OrganizationalModelFilterSetForm): ) -@register_filterset(CircuitFilterSet) class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Circuit fieldsets = ( @@ -223,7 +218,6 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelF tag = TagFilterField(model) -@register_filterset(CircuitTerminationFilterSet) class CircuitTerminationFilterForm(NetBoxModelFilterSetForm): model = CircuitTermination fieldsets = ( @@ -278,7 +272,6 @@ class CircuitTerminationFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(CircuitGroupFilterSet) class CircuitGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): model = CircuitGroup fieldsets = ( @@ -288,7 +281,6 @@ class CircuitGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm tag = TagFilterField(model) -@register_filterset(CircuitGroupAssignmentFilterSet) class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): model = CircuitGroupAssignment fieldsets = ( @@ -318,7 +310,6 @@ class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(VirtualCircuitTypeFilterSet) class VirtualCircuitTypeFilterForm(OrganizationalModelFilterSetForm): model = VirtualCircuitType fieldsets = ( @@ -333,7 +324,6 @@ class VirtualCircuitTypeFilterForm(OrganizationalModelFilterSetForm): ) -@register_filterset(VirtualCircuitFilterSet) class VirtualCircuitFilterForm( TenancyFilterForm, ContactModelFilterForm, @@ -381,7 +371,6 @@ class VirtualCircuitFilterForm( tag = TagFilterField(model) -@register_filterset(VirtualCircuitTerminationFilterSet) class VirtualCircuitTerminationFilterForm(NetBoxModelFilterSetForm): model = VirtualCircuitTermination fieldsets = ( diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index ca9089b66..a531c051e 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -7,6 +7,7 @@ from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, Primary from netbox.utils import get_data_backend_choices from users.models import User from utilities.filters import ContentTypeFilter +from utilities.filtersets import register_filterset from .choices import * from .models import * @@ -20,6 +21,7 @@ __all__ = ( ) +@register_filterset class DataSourceFilterSet(PrimaryModelFilterSet): type = django_filters.MultipleChoiceFilter( choices=get_data_backend_choices, @@ -48,6 +50,7 @@ class DataSourceFilterSet(PrimaryModelFilterSet): ) +@register_filterset class DataFileFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search' @@ -75,6 +78,7 @@ class DataFileFilterSet(ChangeLoggedModelFilterSet): ) +@register_filterset class JobFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -139,6 +143,7 @@ class JobFilterSet(BaseFilterSet): ) +@register_filterset class ObjectTypeFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -164,6 +169,7 @@ class ObjectTypeFilterSet(BaseFilterSet): return queryset.filter(features__icontains=value) +@register_filterset class ObjectChangeFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -203,6 +209,7 @@ class ObjectChangeFilterSet(BaseFilterSet): ) +@register_filterset class ConfigRevisionFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index 7580884d9..4e413cf63 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -7,7 +7,7 @@ from netbox.forms import NetBoxModelFilterSetForm, PrimaryModelFilterSetForm from netbox.forms.mixins import SavedFiltersMixin from netbox.utils import get_data_backend_choices from users.models import User -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ( ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) @@ -24,7 +24,6 @@ __all__ = ( ) -@register_filterset(DataSourceFilterSet) class DataSourceFilterForm(PrimaryModelFilterSetForm): model = DataSource fieldsets = ( @@ -56,7 +55,6 @@ class DataSourceFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(DataFileFilterSet) class DataFileFilterForm(NetBoxModelFilterSetForm): model = DataFile fieldsets = ( @@ -70,7 +68,6 @@ class DataFileFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(JobFilterSet) class JobFilterForm(SavedFiltersMixin, FilterForm): model = Job fieldsets = ( @@ -138,7 +135,6 @@ class JobFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ObjectChangeFilterSet) class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm): model = ObjectChange fieldsets = ( @@ -173,7 +169,6 @@ class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ConfigRevisionFilterSet) class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm): model = ConfigRevision fieldsets = ( diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 9c161aa54..3e7a0e6e3 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -22,6 +22,7 @@ from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) +from utilities.filtersets import register_filterset from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface from vpn.models import L2VPN from wireless.choices import WirelessChannelChoices, WirelessRoleChoices @@ -84,6 +85,7 @@ __all__ = ( ) +@register_filterset class RegionFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=Region.objects.all(), @@ -114,6 +116,7 @@ class RegionFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class SiteGroupFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=SiteGroup.objects.all(), @@ -144,6 +147,7 @@ class SiteGroupFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): status = django_filters.MultipleChoiceFilter( choices=SiteStatusChoices, @@ -208,6 +212,7 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterS return queryset.filter(qs_filter).distinct() +@register_filterset class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, NestedGroupModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -287,6 +292,7 @@ class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, NestedGroupMode return queryset +@register_filterset class RackRoleFilterSet(OrganizationalModelFilterSet): class Meta: @@ -294,6 +300,7 @@ class RackRoleFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'color', 'description') +@register_filterset class RackTypeFilterSet(PrimaryModelFilterSet): manufacturer_id = django_filters.ModelMultipleChoiceFilter( queryset=Manufacturer.objects.all(), @@ -332,6 +339,7 @@ class RackTypeFilterSet(PrimaryModelFilterSet): ) +@register_filterset class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -448,6 +456,7 @@ class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterS ) +@register_filterset class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): rack_id = django_filters.ModelMultipleChoiceFilter( queryset=Rack.objects.all(), @@ -537,6 +546,7 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ) +@register_filterset class ManufacturerFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): class Meta: @@ -544,6 +554,7 @@ class ManufacturerFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet) fields = ('id', 'name', 'slug', 'description') +@register_filterset class DeviceTypeFilterSet(PrimaryModelFilterSet): manufacturer_id = django_filters.ModelMultipleChoiceFilter( queryset=Manufacturer.objects.all(), @@ -687,6 +698,7 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): return queryset.exclude(inventoryitemtemplates__isnull=value) +@register_filterset class ModuleTypeProfileFilterSet(PrimaryModelFilterSet): class Meta: @@ -703,6 +715,7 @@ class ModuleTypeProfileFilterSet(PrimaryModelFilterSet): ) +@register_filterset class ModuleTypeFilterSet(AttributeFiltersMixin, PrimaryModelFilterSet): profile_id = django_filters.ModelMultipleChoiceFilter( queryset=ModuleTypeProfile.objects.all(), @@ -819,6 +832,7 @@ class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet): ) +@register_filterset class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: @@ -826,6 +840,7 @@ class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType fields = ('id', 'name', 'label', 'type', 'description') +@register_filterset class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: @@ -833,6 +848,7 @@ class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDevi fields = ('id', 'name', 'label', 'type', 'description') +@register_filterset class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: @@ -840,6 +856,7 @@ class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo fields = ('id', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description') +@register_filterset class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): feed_leg = django_filters.MultipleChoiceFilter( choices=PowerOutletFeedLegChoices, @@ -855,6 +872,7 @@ class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType fields = ('id', 'name', 'label', 'type', 'color', 'feed_leg', 'description') +@register_filterset class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): type = django_filters.MultipleChoiceFilter( choices=InterfaceTypeChoices, @@ -879,6 +897,7 @@ class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo fields = ('id', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description') +@register_filterset class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, @@ -893,6 +912,7 @@ class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo fields = ('id', 'name', 'label', 'type', 'color', 'rear_port_position', 'description') +@register_filterset class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, @@ -904,6 +924,7 @@ class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCom fields = ('id', 'name', 'label', 'type', 'color', 'positions', 'description') +@register_filterset class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: @@ -911,6 +932,7 @@ class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo fields = ('id', 'name', 'label', 'position', 'description') +@register_filterset class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class Meta: @@ -918,6 +940,7 @@ class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponent fields = ('id', 'name', 'label', 'description') +@register_filterset class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=InventoryItemTemplate.objects.all(), @@ -961,6 +984,7 @@ class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeCompo return queryset.filter(qs_filter) +@register_filterset class DeviceRoleFilterSet(NestedGroupModelFilterSet): config_template_id = django_filters.ModelMultipleChoiceFilter( queryset=ConfigTemplate.objects.all(), @@ -995,6 +1019,7 @@ class DeviceRoleFilterSet(NestedGroupModelFilterSet): fields = ('id', 'name', 'slug', 'color', 'vm_role', 'description') +@register_filterset class PlatformFilterSet(NestedGroupModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=Platform.objects.all(), @@ -1052,6 +1077,7 @@ class PlatformFilterSet(NestedGroupModelFilterSet): return queryset.filter(Q(manufacturer=None) | Q(manufacturer__device_types=value)) +@register_filterset class DeviceFilterSet( PrimaryModelFilterSet, TenancyFilterSet, @@ -1354,6 +1380,7 @@ class DeviceFilterSet( return queryset.exclude(params) +@register_filterset class VirtualDeviceContextFilterSet(PrimaryModelFilterSet, TenancyFilterSet, PrimaryIPFilterSet): device_id = django_filters.ModelMultipleChoiceFilter( field_name='device', @@ -1403,6 +1430,7 @@ class VirtualDeviceContextFilterSet(PrimaryModelFilterSet, TenancyFilterSet, Pri return queryset.exclude(params) +@register_filterset class ModuleFilterSet(PrimaryModelFilterSet): manufacturer_id = django_filters.ModelMultipleChoiceFilter( field_name='module_type__manufacturer', @@ -1691,6 +1719,7 @@ class PathEndpointFilterSet(django_filters.FilterSet): return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False)) +@register_filterset class ConsolePortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=ConsolePortTypeChoices, @@ -1702,6 +1731,7 @@ class ConsolePortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSe fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'cable_position') +@register_filterset class ConsoleServerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=ConsolePortTypeChoices, @@ -1713,6 +1743,7 @@ class ConsoleServerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFi fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'cable_position') +@register_filterset class PowerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=PowerPortTypeChoices, @@ -1727,6 +1758,7 @@ class PowerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, ) +@register_filterset class PowerOutletFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet): type = django_filters.MultipleChoiceFilter( choices=PowerOutletTypeChoices, @@ -1753,6 +1785,7 @@ class PowerOutletFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSe ) +@register_filterset class MACAddressFilterSet(PrimaryModelFilterSet): mac_address = MultiValueMACAddressFilter() assigned_object_type = ContentTypeFilter() @@ -1934,6 +1967,7 @@ class CommonInterfaceFilterSet(django_filters.FilterSet): ) +@register_filterset class InterfaceFilterSet( ModularDeviceComponentFilterSet, CabledObjectFilterSet, @@ -2096,6 +2130,7 @@ class InterfaceFilterSet( ) +@register_filterset class FrontPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, @@ -2113,6 +2148,7 @@ class FrontPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet) ) +@register_filterset class RearPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet): type = django_filters.MultipleChoiceFilter( choices=PortTypeChoices, @@ -2127,6 +2163,7 @@ class RearPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet): ) +@register_filterset class ModuleBayFilterSet(ModularDeviceComponentFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=ModuleBay.objects.all(), @@ -2143,6 +2180,7 @@ class ModuleBayFilterSet(ModularDeviceComponentFilterSet): fields = ('id', 'name', 'label', 'position', 'description') +@register_filterset class DeviceBayFilterSet(DeviceComponentFilterSet): installed_device_id = django_filters.ModelMultipleChoiceFilter( queryset=Device.objects.all(), @@ -2160,6 +2198,7 @@ class DeviceBayFilterSet(DeviceComponentFilterSet): fields = ('id', 'name', 'label', 'description') +@register_filterset class InventoryItemFilterSet(DeviceComponentFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=InventoryItem.objects.all(), @@ -2212,6 +2251,7 @@ class InventoryItemFilterSet(DeviceComponentFilterSet): return queryset.filter(qs_filter) +@register_filterset class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): class Meta: @@ -2219,6 +2259,7 @@ class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'color', 'description') +@register_filterset class VirtualChassisFilterSet(PrimaryModelFilterSet): master_id = django_filters.ModelMultipleChoiceFilter( queryset=Device.objects.all(), @@ -2295,6 +2336,7 @@ class VirtualChassisFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter).distinct() +@register_filterset class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): termination_a_type = ContentTypeFilter( field_name='terminations__termination_type' @@ -2467,6 +2509,7 @@ class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): return self.filter_by_termination_object(queryset, CircuitTermination, value) +@register_filterset class CableTerminationFilterSet(ChangeLoggedModelFilterSet): termination_type = ContentTypeFilter() @@ -2475,6 +2518,7 @@ class CableTerminationFilterSet(ChangeLoggedModelFilterSet): fields = ('id', 'cable', 'cable_end', 'position', 'termination_type', 'termination_id') +@register_filterset class PowerPanelFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -2533,6 +2577,7 @@ class PowerPanelFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): return queryset.filter(qs_filter) +@register_filterset class PowerFeedFilterSet(PrimaryModelFilterSet, CabledObjectFilterSet, PathEndpointFilterSet, TenancyFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -2645,6 +2690,7 @@ class ConnectionFilterSet(BaseFilterSet): return queryset.filter(qs_filter) +@register_filterset class ConsoleConnectionFilterSet(ConnectionFilterSet): class Meta: @@ -2652,6 +2698,7 @@ class ConsoleConnectionFilterSet(ConnectionFilterSet): fields = ('name',) +@register_filterset class PowerConnectionFilterSet(ConnectionFilterSet): class Meta: @@ -2659,6 +2706,7 @@ class PowerConnectionFilterSet(ConnectionFilterSet): fields = ('name',) +@register_filterset class InterfaceConnectionFilterSet(ConnectionFilterSet): class Meta: diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index afa26b48d..859fce99b 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -15,7 +15,7 @@ from netbox.forms import ( ) from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from users.models import Owner, User -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import NumberWithOptions @@ -148,7 +148,6 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(RegionFilterSet) class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): model = Region fieldsets = ( @@ -164,7 +163,6 @@ class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(SiteGroupFilterSet) class SiteGroupFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): model = SiteGroup fieldsets = ( @@ -180,7 +178,6 @@ class SiteGroupFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm) tag = TagFilterField(model) -@register_filterset(SiteFilterSet) class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Site fieldsets = ( @@ -213,7 +210,6 @@ class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilt tag = TagFilterField(model) -@register_filterset(LocationFilterSet) class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NestedGroupModelFilterSetForm): model = Location fieldsets = ( @@ -262,7 +258,6 @@ class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NestedGroupM tag = TagFilterField(model) -@register_filterset(RackRoleFilterSet) class RackRoleFilterForm(OrganizationalModelFilterSetForm): model = RackRole fieldsets = ( @@ -314,7 +309,6 @@ class RackBaseFilterForm(PrimaryModelFilterSetForm): ) -@register_filterset(RackTypeFilterSet) class RackTypeFilterForm(RackBaseFilterForm): model = RackType fieldsets = ( @@ -337,7 +331,6 @@ class RackTypeFilterForm(RackBaseFilterForm): tag = TagFilterField(model) -@register_filterset(RackFilterSet) class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterForm): model = Rack fieldsets = ( @@ -439,7 +432,6 @@ class RackElevationFilterForm(RackFilterForm): ) -@register_filterset(RackReservationFilterSet) class RackReservationFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = RackReservation fieldsets = ( @@ -498,7 +490,6 @@ class RackReservationFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ManufacturerFilterSet) class ManufacturerFilterForm(ContactModelFilterForm, OrganizationalModelFilterSetForm): model = Manufacturer fieldsets = ( @@ -508,7 +499,6 @@ class ManufacturerFilterForm(ContactModelFilterForm, OrganizationalModelFilterSe tag = TagFilterField(model) -@register_filterset(DeviceTypeFilterSet) class DeviceTypeFilterForm(PrimaryModelFilterSetForm): model = DeviceType fieldsets = ( @@ -643,7 +633,6 @@ class DeviceTypeFilterForm(PrimaryModelFilterSetForm): ) -@register_filterset(ModuleTypeProfileFilterSet) class ModuleTypeProfileFilterForm(PrimaryModelFilterSetForm): model = ModuleTypeProfile fieldsets = ( @@ -653,7 +642,6 @@ class ModuleTypeProfileFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ModuleTypeFilterSet) class ModuleTypeFilterForm(PrimaryModelFilterSetForm): model = ModuleType fieldsets = ( @@ -747,7 +735,6 @@ class ModuleTypeFilterForm(PrimaryModelFilterSetForm): ) -@register_filterset(DeviceRoleFilterSet) class DeviceRoleFilterForm(NestedGroupModelFilterSetForm): model = DeviceRole fieldsets = ( @@ -767,7 +754,6 @@ class DeviceRoleFilterForm(NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(PlatformFilterSet) class PlatformFilterForm(NestedGroupModelFilterSetForm): model = Platform fieldsets = ( @@ -793,7 +779,6 @@ class PlatformFilterForm(NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(DeviceFilterSet) class DeviceFilterForm( LocalConfigContextFilterForm, TenancyFilterForm, @@ -992,7 +977,6 @@ class DeviceFilterForm( tag = TagFilterField(model) -@register_filterset(VirtualDeviceContextFilterSet) class VirtualDeviceContextFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = VirtualDeviceContext fieldsets = ( @@ -1020,7 +1004,6 @@ class VirtualDeviceContextFilterForm(TenancyFilterForm, PrimaryModelFilterSetFor tag = TagFilterField(model) -@register_filterset(ModuleFilterSet) class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Module fieldsets = ( @@ -1104,7 +1087,6 @@ class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, PrimaryM tag = TagFilterField(model) -@register_filterset(VirtualChassisFilterSet) class VirtualChassisFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = VirtualChassis fieldsets = ( @@ -1134,7 +1116,6 @@ class VirtualChassisFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(CableFilterSet) class CableFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = Cable fieldsets = ( @@ -1224,7 +1205,6 @@ class CableFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(PowerPanelFilterSet) class PowerPanelFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): model = PowerPanel fieldsets = ( @@ -1264,7 +1244,6 @@ class PowerPanelFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(PowerFeedFilterSet) class PowerFeedFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = PowerFeed fieldsets = ( @@ -1375,7 +1354,6 @@ class PathEndpointFilterForm(CabledFilterForm): ) -@register_filterset(ConsolePortFilterSet) class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = ConsolePort fieldsets = ( @@ -1400,7 +1378,6 @@ class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(ConsoleServerPortFilterSet) class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = ConsoleServerPort fieldsets = ( @@ -1426,7 +1403,6 @@ class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterF tag = TagFilterField(model) -@register_filterset(PowerPortFilterSet) class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerPort fieldsets = ( @@ -1446,7 +1422,6 @@ class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(PowerOutletFilterSet) class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerOutlet fieldsets = ( @@ -1476,7 +1451,6 @@ class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): ) -@register_filterset(InterfaceFilterSet) class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): model = Interface fieldsets = ( @@ -1603,7 +1577,6 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(FrontPortFilterSet) class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -1627,7 +1600,6 @@ class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(RearPortFilterSet) class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): model = RearPort fieldsets = ( @@ -1652,7 +1624,6 @@ class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(ModuleBayFilterSet) class ModuleBayFilterForm(DeviceComponentFilterForm): model = ModuleBay fieldsets = ( @@ -1671,7 +1642,6 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): ) -@register_filterset(DeviceBayFilterSet) class DeviceBayFilterForm(DeviceComponentFilterForm): model = DeviceBay fieldsets = ( @@ -1686,7 +1656,6 @@ class DeviceBayFilterForm(DeviceComponentFilterForm): tag = TagFilterField(model) -@register_filterset(InventoryItemFilterSet) class InventoryItemFilterForm(DeviceComponentFilterForm): model = InventoryItem fieldsets = ( @@ -1738,7 +1707,6 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): # Device component roles # -@register_filterset(InventoryItemRoleFilterSet) class InventoryItemRoleFilterForm(OrganizationalModelFilterSetForm): model = InventoryItemRole fieldsets = ( @@ -1751,7 +1719,6 @@ class InventoryItemRoleFilterForm(OrganizationalModelFilterSetForm): # Addressing # -@register_filterset(MACAddressFilterSet) class MACAddressFilterForm(PrimaryModelFilterSetForm): model = MACAddress fieldsets = ( diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index e2058d9ad..cdc0c75c5 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -12,6 +12,7 @@ from users.models import Group, User from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter ) +from utilities.filtersets import register_filterset from virtualization.models import Cluster, ClusterGroup, ClusterType from .choices import * from .filters import TagFilter, TagIDFilter @@ -40,6 +41,7 @@ __all__ = ( ) +@register_filterset class ScriptFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -62,6 +64,7 @@ class ScriptFilterSet(BaseFilterSet): ) +@register_filterset class WebhookFilterSet(OwnerFilterMixin, NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', @@ -91,6 +94,7 @@ class WebhookFilterSet(OwnerFilterMixin, NetBoxModelFilterSet): ) +@register_filterset class EventRuleFilterSet(OwnerFilterMixin, NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', @@ -131,6 +135,7 @@ class EventRuleFilterSet(OwnerFilterMixin, NetBoxModelFilterSet): return queryset.filter(event_types__overlap=value) +@register_filterset class CustomFieldFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -180,6 +185,7 @@ class CustomFieldFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): ) +@register_filterset class CustomFieldChoiceSetFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -208,6 +214,7 @@ class CustomFieldChoiceSetFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet return queryset.filter(extra_choices__overlap=value) +@register_filterset class CustomLinkFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -238,6 +245,7 @@ class CustomLinkFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): ) +@register_filterset class ExportTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -276,6 +284,7 @@ class ExportTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): ) +@register_filterset class SavedFilterFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -328,6 +337,7 @@ class SavedFilterFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user))) +@register_filterset class TableConfigFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -381,6 +391,7 @@ class TableConfigFilterSet(ChangeLoggedModelFilterSet): return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user))) +@register_filterset class BookmarkFilterSet(BaseFilterSet): created = django_filters.DateTimeFilter() object_type_id = MultiValueNumberFilter() @@ -401,6 +412,7 @@ class BookmarkFilterSet(BaseFilterSet): fields = ('id', 'object_id') +@register_filterset class NotificationGroupFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -444,6 +456,7 @@ class NotificationGroupFilterSet(ChangeLoggedModelFilterSet): ) +@register_filterset class ImageAttachmentFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -465,6 +478,7 @@ class ImageAttachmentFilterSet(ChangeLoggedModelFilterSet): ) +@register_filterset class JournalEntryFilterSet(NetBoxModelFilterSet): created = django_filters.DateTimeFromToRangeFilter() assigned_object_type = ContentTypeFilter() @@ -495,6 +509,7 @@ class JournalEntryFilterSet(NetBoxModelFilterSet): return queryset.filter(comments__icontains=value) +@register_filterset class TagFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -555,6 +570,7 @@ class TagFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): ) +@register_filterset class TaggedItemFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -590,6 +606,7 @@ class TaggedItemFilterSet(BaseFilterSet): ) +@register_filterset class ConfigContextProfileFilterSet(PrimaryModelFilterSet): q = django_filters.CharFilter( method='search', @@ -620,6 +637,7 @@ class ConfigContextProfileFilterSet(PrimaryModelFilterSet): ) +@register_filterset class ConfigContextFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -789,6 +807,7 @@ class ConfigContextFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): ) +@register_filterset class ConfigTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index ee01bd6eb..b037d54b0 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -10,7 +10,7 @@ from netbox.forms import NetBoxModelFilterSetForm, PrimaryModelFilterSetForm from netbox.forms.mixins import SavedFiltersMixin from tenancy.models import Tenant, TenantGroup from users.models import Group, Owner, User -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ( ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, @@ -40,7 +40,6 @@ __all__ = ( ) -@register_filterset(CustomFieldFilterSet) class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): model = CustomField fieldsets = ( @@ -128,7 +127,6 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(CustomFieldChoiceSetFilterSet) class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm): model = CustomFieldChoiceSet fieldsets = ( @@ -149,7 +147,6 @@ class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(CustomLinkFilterSet) class CustomLinkFilterForm(SavedFiltersMixin, FilterForm): model = CustomLink fieldsets = ( @@ -186,7 +183,6 @@ class CustomLinkFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ExportTemplateFilterSet) class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): model = ExportTemplate fieldsets = ( @@ -238,7 +234,6 @@ class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ImageAttachmentFilterSet) class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): model = ImageAttachment fieldsets = ( @@ -256,7 +251,6 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(SavedFilterFilterSet) class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): model = SavedFilter fieldsets = ( @@ -293,7 +287,6 @@ class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(TableConfigFilterSet) class TableConfigFilterForm(SavedFiltersMixin, FilterForm): model = TableConfig fieldsets = ( @@ -325,7 +318,6 @@ class TableConfigFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(WebhookFilterSet) class WebhookFilterForm(NetBoxModelFilterSetForm): model = Webhook fieldsets = ( @@ -353,7 +345,6 @@ class WebhookFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(EventRuleFilterSet) class EventRuleFilterForm(NetBoxModelFilterSetForm): model = EventRule fieldsets = ( @@ -390,7 +381,6 @@ class EventRuleFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(TagFilterSet) class TagFilterForm(SavedFiltersMixin, FilterForm): model = Tag content_type_id = ContentTypeMultipleChoiceField( @@ -410,7 +400,6 @@ class TagFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ConfigContextProfileFilterSet) class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm): model = ConfigContextProfile fieldsets = ( @@ -432,7 +421,6 @@ class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm): ) -@register_filterset(ConfigContextFilterSet) class ConfigContextFilterForm(SavedFiltersMixin, FilterForm): model = ConfigContext fieldsets = ( @@ -534,7 +522,6 @@ class ConfigContextFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(ConfigTemplateFilterSet) class ConfigTemplateFilterForm(SavedFiltersMixin, FilterForm): model = ConfigTemplate fieldsets = ( @@ -599,7 +586,6 @@ class LocalConfigContextFilterForm(forms.Form): ) -@register_filterset(JournalEntryFilterSet) class JournalEntryFilterForm(NetBoxModelFilterSetForm): model = JournalEntry fieldsets = ( @@ -635,7 +621,6 @@ class JournalEntryFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(NotificationGroupFilterSet) class NotificationGroupFilterForm(SavedFiltersMixin, FilterForm): model = NotificationGroup user_id = DynamicModelMultipleChoiceField( diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 3b738e5a7..ad2e032e2 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -19,6 +19,7 @@ from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) +from utilities.filtersets import register_filterset from virtualization.models import VirtualMachine, VMInterface from vpn.models import L2VPN from .choices import * @@ -47,6 +48,7 @@ __all__ = ( ) +@register_filterset class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): import_target_id = django_filters.ModelMultipleChoiceFilter( field_name='import_targets', @@ -85,6 +87,7 @@ class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): fields = ('id', 'name', 'rd', 'enforce_unique', 'description') +@register_filterset class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): importing_vrf_id = django_filters.ModelMultipleChoiceFilter( field_name='importing_vrfs', @@ -144,6 +147,7 @@ class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): fields = ('id', 'name', 'description') +@register_filterset class RIRFilterSet(OrganizationalModelFilterSet): class Meta: @@ -151,6 +155,7 @@ class RIRFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'is_private', 'description') +@register_filterset class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='prefix', @@ -198,6 +203,7 @@ class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi return queryset.none() +@register_filterset class ASNRangeFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): rir_id = django_filters.ModelMultipleChoiceFilter( queryset=RIR.objects.all(), @@ -223,6 +229,7 @@ class ASNRangeFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): ) +@register_filterset class ASNFilterSet(PrimaryModelFilterSet, TenancyFilterSet): rir_id = django_filters.ModelMultipleChoiceFilter( queryset=RIR.objects.all(), @@ -285,6 +292,7 @@ class ASNFilterSet(PrimaryModelFilterSet, TenancyFilterSet): return queryset.filter(qs_filter) +@register_filterset class RoleFilterSet(OrganizationalModelFilterSet): class Meta: @@ -292,6 +300,7 @@ class RoleFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'description', 'weight') +@register_filterset class PrefixFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='prefix', @@ -458,6 +467,7 @@ class PrefixFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet, ).distinct() +@register_filterset class IPRangeFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='start_address', @@ -550,6 +560,7 @@ class IPRangeFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilt return queryset.filter(q) +@register_filterset class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='address', @@ -786,6 +797,7 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFi ) +@register_filterset class FHRPGroupFilterSet(PrimaryModelFilterSet): protocol = django_filters.MultipleChoiceFilter( choices=FHRPGroupProtocolChoices @@ -833,6 +845,7 @@ class FHRPGroupFilterSet(PrimaryModelFilterSet): return queryset.filter(ip_filter) +@register_filterset class FHRPGroupAssignmentFilterSet(ChangeLoggedModelFilterSet): interface_type = ContentTypeFilter() group_id = django_filters.ModelMultipleChoiceFilter( @@ -887,6 +900,7 @@ class FHRPGroupAssignmentFilterSet(ChangeLoggedModelFilterSet): ) +@register_filterset class VLANGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): scope_type = ContentTypeFilter() region = django_filters.NumberFilter( @@ -936,6 +950,7 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): ) +@register_filterset class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -1087,6 +1102,7 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): ).distinct() +@register_filterset class VLANTranslationPolicyFilterSet(PrimaryModelFilterSet): class Meta: @@ -1103,6 +1119,7 @@ class VLANTranslationPolicyFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter) +@register_filterset class VLANTranslationRuleFilterSet(NetBoxModelFilterSet): policy_id = django_filters.ModelMultipleChoiceFilter( queryset=VLANTranslationPolicy.objects.all(), @@ -1134,6 +1151,7 @@ class VLANTranslationRuleFilterSet(NetBoxModelFilterSet): return queryset.filter(qs_filter) +@register_filterset class ServiceTemplateFilterSet(PrimaryModelFilterSet): port = NumericArrayFilter( field_name='ports', @@ -1154,6 +1172,7 @@ class ServiceTemplateFilterSet(PrimaryModelFilterSet): return queryset.filter(qs_filter) +@register_filterset class ServiceFilterSet(ContactModelFilterSet, PrimaryModelFilterSet): parent_object_type = ContentTypeFilter() device = MultiValueCharFilter( diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 8471f8822..9618f1c6e 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -8,7 +8,7 @@ from ipam.filtersets import * from ipam.models import * from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from virtualization.models import VirtualMachine, ClusterGroup, Cluster @@ -43,7 +43,6 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ ]) -@register_filterset(VRFFilterSet) class VRFFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = VRF fieldsets = ( @@ -64,7 +63,6 @@ class VRFFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(RouteTargetFilterSet) class RouteTargetFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = RouteTarget fieldsets = ( @@ -85,7 +83,6 @@ class RouteTargetFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(RIRFilterSet) class RIRFilterForm(OrganizationalModelFilterSetForm): model = RIR fieldsets = ( @@ -102,7 +99,6 @@ class RIRFilterForm(OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(AggregateFilterSet) class AggregateFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Aggregate fieldsets = ( @@ -124,7 +120,6 @@ class AggregateFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryMode tag = TagFilterField(model) -@register_filterset(ASNRangeFilterSet) class ASNRangeFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): model = ASNRange fieldsets = ( @@ -148,7 +143,6 @@ class ASNRangeFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ASNFilterSet) class ASNFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = ASN fieldsets = ( @@ -174,7 +168,6 @@ class ASNFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(RoleFilterSet) class RoleFilterForm(OrganizationalModelFilterSetForm): model = Role fieldsets = ( @@ -183,7 +176,6 @@ class RoleFilterForm(OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(PrefixFilterSet) class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Prefix fieldsets = ( @@ -290,7 +282,6 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFi tag = TagFilterField(model) -@register_filterset(IPRangeFilterSet) class IPRangeFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = IPRange fieldsets = ( @@ -338,7 +329,6 @@ class IPRangeFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelF tag = TagFilterField(model) -@register_filterset(IPAddressFilterSet) class IPAddressFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = IPAddress fieldsets = ( @@ -417,7 +407,6 @@ class IPAddressFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryMode tag = TagFilterField(model) -@register_filterset(FHRPGroupFilterSet) class FHRPGroupFilterForm(PrimaryModelFilterSetForm): model = FHRPGroup fieldsets = ( @@ -451,7 +440,6 @@ class FHRPGroupFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(VLANGroupFilterSet) class VLANGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -505,7 +493,6 @@ class VLANGroupFilterForm(TenancyFilterForm, OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(VLANTranslationPolicyFilterSet) class VLANTranslationPolicyFilterForm(PrimaryModelFilterSetForm): model = VLANTranslationPolicy fieldsets = ( @@ -519,7 +506,6 @@ class VLANTranslationPolicyFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(VLANTranslationRuleFilterSet) class VLANTranslationRuleFilterForm(NetBoxModelFilterSetForm): model = VLANTranslationRule fieldsets = ( @@ -544,7 +530,6 @@ class VLANTranslationRuleFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(VLANFilterSet) class VLANFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = VLAN fieldsets = ( @@ -617,7 +602,6 @@ class VLANFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ServiceTemplateFilterSet) class ServiceTemplateFilterForm(PrimaryModelFilterSetForm): model = ServiceTemplate fieldsets = ( @@ -636,7 +620,6 @@ class ServiceTemplateFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ServiceFilterSet) class ServiceFilterForm(ContactModelFilterForm, ServiceTemplateFilterForm): model = Service fieldsets = ( diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index b650ea882..aa463ef50 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -6,6 +6,7 @@ from netbox.filtersets import ( NestedGroupModelFilterSet, NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, ) from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter +from utilities.filtersets import register_filterset from .models import * __all__ = ( @@ -24,6 +25,7 @@ __all__ = ( # Contacts # +@register_filterset class ContactGroupFilterSet(NestedGroupModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=ContactGroup.objects.all(), @@ -59,6 +61,7 @@ class ContactGroupFilterSet(NestedGroupModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class ContactRoleFilterSet(OrganizationalModelFilterSet): class Meta: @@ -66,6 +69,7 @@ class ContactRoleFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class ContactFilterSet(PrimaryModelFilterSet): group_id = TreeNodeMultipleChoiceFilter( queryset=ContactGroup.objects.all(), @@ -100,6 +104,7 @@ class ContactFilterSet(PrimaryModelFilterSet): ) +@register_filterset class ContactAssignmentFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', @@ -170,6 +175,7 @@ class ContactModelFilterSet(django_filters.FilterSet): # Tenancy # +@register_filterset class TenantGroupFilterSet(NestedGroupModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=TenantGroup.objects.all(), @@ -200,6 +206,7 @@ class TenantGroupFilterSet(NestedGroupModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class TenantFilterSet(PrimaryModelFilterSet, ContactModelFilterSet): group_id = TreeNodeMultipleChoiceFilter( queryset=TenantGroup.objects.all(), diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 1fbd50109..58bcdf0ca 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -13,7 +13,6 @@ from tenancy.forms import ContactModelFilterForm from utilities.forms.fields import ( ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms import register_filterset from utilities.forms.rendering import FieldSet __all__ = ( @@ -30,7 +29,6 @@ __all__ = ( # Tenants # -@register_filterset(TenantGroupFilterSet) class TenantGroupFilterForm(NestedGroupModelFilterSetForm): model = TenantGroup fieldsets = ( @@ -45,7 +43,6 @@ class TenantGroupFilterForm(NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(TenantFilterSet) class TenantFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): model = Tenant fieldsets = ( @@ -66,7 +63,6 @@ class TenantFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): # Contacts # -@register_filterset(ContactGroupFilterSet) class ContactGroupFilterForm(NestedGroupModelFilterSetForm): model = ContactGroup fieldsets = ( @@ -81,7 +77,6 @@ class ContactGroupFilterForm(NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ContactRoleFilterSet) class ContactRoleFilterForm(OrganizationalModelFilterSetForm): model = ContactRole fieldsets = ( @@ -90,7 +85,6 @@ class ContactRoleFilterForm(OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ContactFilterSet) class ContactFilterForm(PrimaryModelFilterSetForm): model = Contact fieldsets = ( @@ -106,7 +100,6 @@ class ContactFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ContactAssignmentFilterSet) class ContactAssignmentFilterForm(NetBoxModelFilterSetForm): model = ContactAssignment fieldsets = ( diff --git a/netbox/users/filtersets.py b/netbox/users/filtersets.py index 1bc1b6d86..b72ed257a 100644 --- a/netbox/users/filtersets.py +++ b/netbox/users/filtersets.py @@ -8,6 +8,7 @@ from extras.models import NotificationGroup from netbox.filtersets import BaseFilterSet from users.models import Group, ObjectPermission, Owner, OwnerGroup, Token, User from utilities.filters import ContentTypeFilter +from utilities.filtersets import register_filterset __all__ = ( 'GroupFilterSet', @@ -19,6 +20,7 @@ __all__ = ( ) +@register_filterset class GroupFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -64,6 +66,7 @@ class GroupFilterSet(BaseFilterSet): ) +@register_filterset class UserFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -120,6 +123,7 @@ class UserFilterSet(BaseFilterSet): ) +@register_filterset class TokenFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -181,6 +185,7 @@ class TokenFilterSet(BaseFilterSet): ) +@register_filterset class ObjectPermissionFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -248,6 +253,7 @@ class ObjectPermissionFilterSet(BaseFilterSet): return queryset.exclude(actions__contains=[action]) +@register_filterset class OwnerGroupFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', @@ -267,6 +273,7 @@ class OwnerGroupFilterSet(BaseFilterSet): ) +@register_filterset class OwnerFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/users/forms/filtersets.py b/netbox/users/forms/filtersets.py index 2e3e99ffc..f167a1a06 100644 --- a/netbox/users/forms/filtersets.py +++ b/netbox/users/forms/filtersets.py @@ -5,7 +5,7 @@ from netbox.forms import NetBoxModelFilterSetForm from netbox.forms.mixins import SavedFiltersMixin from users.choices import TokenVersionChoices from users.models import Group, ObjectPermission, Owner, OwnerGroup, Token, User -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm from utilities.forms.fields import DynamicModelMultipleChoiceField from utilities.forms.rendering import FieldSet from utilities.forms.utils import add_blank_choice @@ -22,7 +22,6 @@ __all__ = ( ) -@register_filterset(GroupFilterSet) class GroupFilterForm(NetBoxModelFilterSetForm): model = Group fieldsets = ( @@ -30,7 +29,6 @@ class GroupFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(UserFilterSet) class UserFilterForm(NetBoxModelFilterSetForm): model = User fieldsets = ( @@ -59,7 +57,6 @@ class UserFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(ObjectPermissionFilterSet) class ObjectPermissionFilterForm(NetBoxModelFilterSetForm): model = ObjectPermission fieldsets = ( @@ -114,7 +111,6 @@ class ObjectPermissionFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(TokenFilterSet) class TokenFilterForm(SavedFiltersMixin, FilterForm): model = Token fieldsets = ( @@ -156,7 +152,6 @@ class TokenFilterForm(SavedFiltersMixin, FilterForm): ) -@register_filterset(OwnerGroupFilterSet) class OwnerGroupFilterForm(NetBoxModelFilterSetForm): model = OwnerGroup fieldsets = ( @@ -164,7 +159,6 @@ class OwnerGroupFilterForm(NetBoxModelFilterSetForm): ) -@register_filterset(OwnerFilterSet) class OwnerFilterForm(NetBoxModelFilterSetForm): model = Owner fieldsets = ( diff --git a/netbox/utilities/filtersets.py b/netbox/utilities/filtersets.py new file mode 100644 index 000000000..b5a0005f6 --- /dev/null +++ b/netbox/utilities/filtersets.py @@ -0,0 +1,13 @@ +from netbox.registry import registry + + +def register_filterset(filterset_class): + """ + Decorator for registering a FilterSet with the application registry. + + Uses model identifier as key to match search index pattern. + """ + model = filterset_class._meta.model + label = f'{model._meta.app_label}.{model._meta.model_name}' + registry['filtersets'][label] = filterset_class + return filterset_class diff --git a/netbox/utilities/forms/__init__.py b/netbox/utilities/forms/__init__.py index d60bfa083..94f7d48c9 100644 --- a/netbox/utilities/forms/__init__.py +++ b/netbox/utilities/forms/__init__.py @@ -2,18 +2,3 @@ from .constants import * from .forms import * from .mixins import * from .utils import * - - -def register_filterset(filterset_class): - """ - Decorator for registering a FilterSet with the application registry. - - Uses model identifier as key to match search index pattern. - """ - def decorator(form_class): - from netbox.registry import registry - model = filterset_class._meta.model - key = f'{model._meta.app_label}.{model._meta.model_name}' - registry['filtersets'][key] = filterset_class - return form_class - return decorator diff --git a/netbox/utilities/forms/mixins.py b/netbox/utilities/forms/mixins.py index 1ea09f7da..779199fc8 100644 --- a/netbox/utilities/forms/mixins.py +++ b/netbox/utilities/forms/mixins.py @@ -5,7 +5,9 @@ from django import forms from django.core.validators import MaxValueValidator, MinValueValidator from django.utils.translation import gettext_lazy as _ +from netbox.registry import registry from utilities.forms.fields import ColorField, QueryField, TagFilterField +from utilities.forms.widgets import FilterModifierWidget from utilities.forms.widgets.apiselect import APISelect from utilities.forms.widgets.modifiers import MODIFIER_EMPTY_FALSE, MODIFIER_EMPTY_TRUE @@ -174,8 +176,6 @@ class FilterModifierMixin: def _enhance_fields_with_modifiers(self): """Wrap compatible field widgets with FilterModifierWidget.""" - from utilities.forms.widgets import FilterModifierWidget - from netbox.registry import registry model = getattr(self, 'model', None) if model is None and hasattr(self, '_meta'): @@ -237,7 +237,7 @@ class FilterModifierMixin: def _is_api_widget_field(self, field): """Check if a field uses an API-based widget.""" - if field.widget is APISelect: + if isinstance(field.widget, APISelect): return True if hasattr(field.widget, 'attrs') and field.widget.attrs: diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index b96f1dc24..4f7b28066 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -14,6 +14,7 @@ from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from users.filterset_mixins import OwnerFilterMixin from utilities.filters import MultiValueCharFilter, MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter +from utilities.filtersets import register_filterset from .choices import * from .models import * @@ -27,6 +28,7 @@ __all__ = ( ) +@register_filterset class ClusterTypeFilterSet(OrganizationalModelFilterSet): class Meta: @@ -34,6 +36,7 @@ class ClusterTypeFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class ClusterGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): class Meta: @@ -41,6 +44,7 @@ class ClusterGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet) fields = ('id', 'name', 'slug', 'description') +@register_filterset class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ScopedFilterSet, ContactModelFilterSet): group_id = django_filters.ModelMultipleChoiceFilter( queryset=ClusterGroup.objects.all(), @@ -81,6 +85,7 @@ class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ScopedFilterSet, ) +@register_filterset class VirtualMachineFilterSet( PrimaryModelFilterSet, TenancyFilterSet, @@ -241,6 +246,7 @@ class VirtualMachineFilterSet( return queryset.exclude(params) +@register_filterset class VMInterfaceFilterSet(CommonInterfaceFilterSet, OwnerFilterMixin, NetBoxModelFilterSet): cluster_id = django_filters.ModelMultipleChoiceFilter( field_name='virtual_machine__cluster', @@ -303,6 +309,7 @@ class VMInterfaceFilterSet(CommonInterfaceFilterSet, OwnerFilterMixin, NetBoxMod ) +@register_filterset class VirtualDiskFilterSet(OwnerFilterMixin, NetBoxModelFilterSet): virtual_machine_id = django_filters.ModelMultipleChoiceFilter( field_name='virtual_machine', diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 38e4e7797..30e78cc58 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -9,7 +9,7 @@ from ipam.models import VRF, VLANTranslationPolicy from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from users.models import Owner -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, register_filterset +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from virtualization.choices import * @@ -27,7 +27,6 @@ __all__ = ( ) -@register_filterset(ClusterTypeFilterSet) class ClusterTypeFilterForm(OrganizationalModelFilterSetForm): model = ClusterType fieldsets = ( @@ -36,7 +35,6 @@ class ClusterTypeFilterForm(OrganizationalModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(ClusterGroupFilterSet) class ClusterGroupFilterForm(ContactModelFilterForm, OrganizationalModelFilterSetForm): model = ClusterGroup tag = TagFilterField(model) @@ -46,7 +44,6 @@ class ClusterGroupFilterForm(ContactModelFilterForm, OrganizationalModelFilterSe ) -@register_filterset(ClusterFilterSet) class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Cluster fieldsets = ( @@ -101,7 +98,6 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelF tag = TagFilterField(model) -@register_filterset(VirtualMachineFilterSet) class VirtualMachineFilterForm( LocalConfigContextFilterForm, TenancyFilterForm, @@ -210,7 +206,6 @@ class VirtualMachineFilterForm( tag = TagFilterField(model) -@register_filterset(VMInterfaceFilterSet) class VMInterfaceFilterForm(NetBoxModelFilterSetForm): model = VMInterface fieldsets = ( @@ -273,7 +268,6 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(VirtualDiskFilterSet) class VirtualDiskFilterForm(NetBoxModelFilterSetForm): model = VirtualDisk fieldsets = ( diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 59a38159e..e6fcd87fc 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -8,6 +8,7 @@ from ipam.models import IPAddress, RouteTarget, VLAN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter +from utilities.filtersets import register_filterset from virtualization.models import VirtualMachine, VMInterface from .choices import * from .models import * @@ -26,6 +27,7 @@ __all__ = ( ) +@register_filterset class TunnelGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): class Meta: @@ -33,6 +35,7 @@ class TunnelGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class TunnelFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): status = django_filters.MultipleChoiceFilter( choices=TunnelStatusChoices @@ -75,6 +78,7 @@ class TunnelFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilte ) +@register_filterset class TunnelTerminationFilterSet(NetBoxModelFilterSet): tunnel_id = django_filters.ModelMultipleChoiceFilter( field_name='tunnel', @@ -124,6 +128,7 @@ class TunnelTerminationFilterSet(NetBoxModelFilterSet): fields = ('id', 'termination_id') +@register_filterset class IKEProposalFilterSet(PrimaryModelFilterSet): ike_policy_id = django_filters.ModelMultipleChoiceFilter( field_name='ike_policies', @@ -163,6 +168,7 @@ class IKEProposalFilterSet(PrimaryModelFilterSet): ) +@register_filterset class IKEPolicyFilterSet(PrimaryModelFilterSet): version = django_filters.MultipleChoiceFilter( choices=IKEVersionChoices @@ -194,6 +200,7 @@ class IKEPolicyFilterSet(PrimaryModelFilterSet): ) +@register_filterset class IPSecProposalFilterSet(PrimaryModelFilterSet): ipsec_policy_id = django_filters.ModelMultipleChoiceFilter( field_name='ipsec_policies', @@ -227,6 +234,7 @@ class IPSecProposalFilterSet(PrimaryModelFilterSet): ) +@register_filterset class IPSecPolicyFilterSet(PrimaryModelFilterSet): pfs_group = django_filters.MultipleChoiceFilter( choices=DHGroupChoices @@ -255,6 +263,7 @@ class IPSecPolicyFilterSet(PrimaryModelFilterSet): ) +@register_filterset class IPSecProfileFilterSet(PrimaryModelFilterSet): mode = django_filters.MultipleChoiceFilter( choices=IPSecModeChoices @@ -294,6 +303,7 @@ class IPSecProfileFilterSet(PrimaryModelFilterSet): ) +@register_filterset class L2VPNFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet): type = django_filters.MultipleChoiceFilter( choices=L2VPNTypeChoices, @@ -340,6 +350,7 @@ class L2VPNFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilter return queryset.filter(qs_filter) +@register_filterset class L2VPNTerminationFilterSet(NetBoxModelFilterSet): l2vpn_id = django_filters.ModelMultipleChoiceFilter( queryset=L2VPN.objects.all(), diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index 0c90e0c06..687144a50 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -9,7 +9,6 @@ from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms.fields import ( ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms import register_filterset from utilities.forms.rendering import FieldSet from utilities.forms.utils import add_blank_choice from virtualization.models import VirtualMachine @@ -32,7 +31,6 @@ __all__ = ( ) -@register_filterset(TunnelGroupFilterSet) class TunnelGroupFilterForm(ContactModelFilterForm, OrganizationalModelFilterSetForm): model = TunnelGroup fieldsets = ( @@ -42,7 +40,6 @@ class TunnelGroupFilterForm(ContactModelFilterForm, OrganizationalModelFilterSet tag = TagFilterField(model) -@register_filterset(TunnelFilterSet) class TunnelFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Tunnel fieldsets = ( @@ -79,7 +76,6 @@ class TunnelFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFi tag = TagFilterField(model) -@register_filterset(TunnelTerminationFilterSet) class TunnelTerminationFilterForm(NetBoxModelFilterSetForm): model = TunnelTermination fieldsets = ( @@ -99,7 +95,6 @@ class TunnelTerminationFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(IKEProposalFilterSet) class IKEProposalFilterForm(PrimaryModelFilterSetForm): model = IKEProposal fieldsets = ( @@ -131,7 +126,6 @@ class IKEProposalFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(IKEPolicyFilterSet) class IKEPolicyFilterForm(PrimaryModelFilterSetForm): model = IKEPolicy fieldsets = ( @@ -156,7 +150,6 @@ class IKEPolicyFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(IPSecProposalFilterSet) class IPSecProposalFilterForm(PrimaryModelFilterSetForm): model = IPSecProposal fieldsets = ( @@ -176,7 +169,6 @@ class IPSecProposalFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(IPSecPolicyFilterSet) class IPSecPolicyFilterForm(PrimaryModelFilterSetForm): model = IPSecPolicy fieldsets = ( @@ -196,7 +188,6 @@ class IPSecPolicyFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(IPSecProfileFilterSet) class IPSecProfileFilterForm(PrimaryModelFilterSetForm): model = IPSecProfile fieldsets = ( @@ -221,7 +212,6 @@ class IPSecProfileFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(L2VPNFilterSet) class L2VPNFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = L2VPN fieldsets = ( @@ -253,7 +243,6 @@ class L2VPNFilterForm(ContactModelFilterForm, TenancyFilterForm, PrimaryModelFil tag = TagFilterField(model) -@register_filterset(L2VPNTerminationFilterSet) class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm): model = L2VPNTermination fieldsets = ( diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index afd963a5a..288a99ce5 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -8,6 +8,7 @@ from ipam.models import VLAN from netbox.filtersets import NestedGroupModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import TreeNodeMultipleChoiceFilter +from utilities.filtersets import register_filterset from .choices import * from .models import * @@ -18,6 +19,7 @@ __all__ = ( ) +@register_filterset class WirelessLANGroupFilterSet(NestedGroupModelFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=WirelessLANGroup.objects.all() @@ -44,6 +46,7 @@ class WirelessLANGroupFilterSet(NestedGroupModelFilterSet): fields = ('id', 'name', 'slug', 'description') +@register_filterset class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilterSet): group_id = TreeNodeMultipleChoiceFilter( queryset=WirelessLANGroup.objects.all(), @@ -87,6 +90,7 @@ class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilter return queryset.filter(qs_filter) +@register_filterset class WirelessLinkFilterSet(PrimaryModelFilterSet, TenancyFilterSet): interface_a_id = django_filters.ModelMultipleChoiceFilter( queryset=Interface.objects.all() diff --git a/netbox/wireless/forms/filtersets.py b/netbox/wireless/forms/filtersets.py index c5fb2e8f1..1635c251c 100644 --- a/netbox/wireless/forms/filtersets.py +++ b/netbox/wireless/forms/filtersets.py @@ -6,7 +6,7 @@ from dcim.models import Location, Region, Site, SiteGroup from netbox.choices import * from netbox.forms import NestedGroupModelFilterSetForm, PrimaryModelFilterSetForm from tenancy.forms import TenancyFilterForm -from utilities.forms import add_blank_choice, register_filterset +from utilities.forms import add_blank_choice from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from wireless.choices import * @@ -20,7 +20,6 @@ __all__ = ( ) -@register_filterset(WirelessLANGroupFilterSet) class WirelessLANGroupFilterForm(NestedGroupModelFilterSetForm): model = WirelessLANGroup fieldsets = ( @@ -35,7 +34,6 @@ class WirelessLANGroupFilterForm(NestedGroupModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(WirelessLANFilterSet) class WirelessLANFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = WirelessLAN fieldsets = ( @@ -102,7 +100,6 @@ class WirelessLANFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): tag = TagFilterField(model) -@register_filterset(WirelessLinkFilterSet) class WirelessLinkFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): model = WirelessLink fieldsets = (