diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 6709adf4b..6d3a7e739 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -11,9 +11,8 @@ 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 +from utilities.forms import add_blank_choice, register_filterset from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DatePicker, NumberWithOptions @@ -34,6 +33,7 @@ __all__ = ( ) +@register_filterset(ProviderFilterSet) class ProviderFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Provider fieldsets = ( @@ -69,6 +69,7 @@ class ProviderFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryMod tag = TagFilterField(model) +@register_filterset(ProviderAccountFilterSet) class ProviderAccountFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryModelFilterSetForm): model = ProviderAccount fieldsets = ( @@ -88,6 +89,7 @@ class ProviderAccountFilterForm(FilterModifierMixin, ContactModelFilterForm, Pri tag = TagFilterField(model) +@register_filterset(ProviderNetworkFilterSet) class ProviderNetworkFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = ProviderNetwork fieldsets = ( @@ -107,6 +109,7 @@ class ProviderNetworkFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(CircuitTypeFilterSet) class CircuitTypeFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = CircuitType fieldsets = ( @@ -121,6 +124,7 @@ class CircuitTypeFilterForm(FilterModifierMixin, OrganizationalModelFilterSetFor ) +@register_filterset(CircuitFilterSet) class CircuitFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Circuit fieldsets = ( @@ -220,6 +224,7 @@ class CircuitFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilt tag = TagFilterField(model) +@register_filterset(CircuitTerminationFilterSet) class CircuitTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = CircuitTermination fieldsets = ( @@ -274,6 +279,7 @@ class CircuitTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm tag = TagFilterField(model) +@register_filterset(CircuitGroupFilterSet) class CircuitGroupFilterForm(FilterModifierMixin, TenancyFilterForm, OrganizationalModelFilterSetForm): model = CircuitGroup fieldsets = ( @@ -283,6 +289,7 @@ class CircuitGroupFilterForm(FilterModifierMixin, TenancyFilterForm, Organizatio tag = TagFilterField(model) +@register_filterset(CircuitGroupAssignmentFilterSet) class CircuitGroupAssignmentFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = CircuitGroupAssignment fieldsets = ( @@ -312,6 +319,7 @@ class CircuitGroupAssignmentFilterForm(FilterModifierMixin, NetBoxModelFilterSet tag = TagFilterField(model) +@register_filterset(VirtualCircuitTypeFilterSet) class VirtualCircuitTypeFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = VirtualCircuitType fieldsets = ( @@ -326,6 +334,7 @@ class VirtualCircuitTypeFilterForm(FilterModifierMixin, OrganizationalModelFilte ) +@register_filterset(VirtualCircuitFilterSet) class VirtualCircuitFilterForm( FilterModifierMixin, TenancyFilterForm, @@ -374,6 +383,7 @@ class VirtualCircuitFilterForm( tag = TagFilterField(model) +@register_filterset(VirtualCircuitTerminationFilterSet) class VirtualCircuitTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = VirtualCircuitTermination fieldsets = ( @@ -405,17 +415,3 @@ class VirtualCircuitTerminationFilterForm(FilterModifierMixin, NetBoxModelFilter label=_('Provider') ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[ProviderFilterForm] = ProviderFilterSet -FILTERSET_MAPPINGS[ProviderAccountFilterForm] = ProviderAccountFilterSet -FILTERSET_MAPPINGS[ProviderNetworkFilterForm] = ProviderNetworkFilterSet -FILTERSET_MAPPINGS[CircuitTypeFilterForm] = CircuitTypeFilterSet -FILTERSET_MAPPINGS[CircuitFilterForm] = CircuitFilterSet -FILTERSET_MAPPINGS[CircuitTerminationFilterForm] = CircuitTerminationFilterSet -FILTERSET_MAPPINGS[CircuitGroupFilterForm] = CircuitGroupFilterSet -FILTERSET_MAPPINGS[CircuitGroupAssignmentFilterForm] = CircuitGroupAssignmentFilterSet -FILTERSET_MAPPINGS[VirtualCircuitTypeFilterForm] = VirtualCircuitTypeFilterSet -FILTERSET_MAPPINGS[VirtualCircuitFilterForm] = VirtualCircuitFilterSet -FILTERSET_MAPPINGS[VirtualCircuitTerminationFilterForm] = VirtualCircuitTerminationFilterSet diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index ff4401f4d..d479064d7 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -7,11 +7,10 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset from utilities.forms.fields import ( ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DateTimePicker @@ -26,6 +25,7 @@ __all__ = ( ) +@register_filterset(DataSourceFilterSet) class DataSourceFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = DataSource fieldsets = ( @@ -57,6 +57,7 @@ class DataSourceFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(DataFileFilterSet) class DataFileFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = DataFile fieldsets = ( @@ -70,6 +71,7 @@ class DataFileFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): ) +@register_filterset(JobFilterSet) class JobFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = Job fieldsets = ( @@ -137,6 +139,7 @@ class JobFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(ObjectChangeFilterSet) class ObjectChangeFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ObjectChange fieldsets = ( @@ -171,16 +174,9 @@ class ObjectChangeFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm) ) +@register_filterset(ConfigRevisionFilterSet) class ConfigRevisionFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ConfigRevision fieldsets = ( FieldSet('q', 'filter_id'), ) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[DataSourceFilterForm] = DataSourceFilterSet -FILTERSET_MAPPINGS[DataFileFilterForm] = DataFileFilterSet -FILTERSET_MAPPINGS[JobFilterForm] = JobFilterSet -FILTERSET_MAPPINGS[ObjectChangeFilterForm] = ObjectChangeFilterSet -FILTERSET_MAPPINGS[ConfigRevisionFilterForm] = ConfigRevisionFilterSet diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 32445a71d..2cc8e16e9 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -15,9 +15,8 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset from utilities.forms.fields import ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.widgets import NumberWithOptions @@ -150,6 +149,7 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm): ) +@register_filterset(RegionFilterSet) class RegionFilterForm(FilterModifierMixin, ContactModelFilterForm, NestedGroupModelFilterSetForm): model = Region fieldsets = ( @@ -165,6 +165,7 @@ class RegionFilterForm(FilterModifierMixin, ContactModelFilterForm, NestedGroupM tag = TagFilterField(model) +@register_filterset(SiteGroupFilterSet) class SiteGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, NestedGroupModelFilterSetForm): model = SiteGroup fieldsets = ( @@ -180,6 +181,7 @@ class SiteGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, NestedGro tag = TagFilterField(model) +@register_filterset(SiteFilterSet) class SiteFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Site fieldsets = ( @@ -212,6 +214,7 @@ class SiteFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterF tag = TagFilterField(model) +@register_filterset(LocationFilterSet) class LocationFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterForm, NestedGroupModelFilterSetForm): model = Location fieldsets = ( @@ -260,6 +263,7 @@ class LocationFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFil tag = TagFilterField(model) +@register_filterset(RackRoleFilterSet) class RackRoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = RackRole fieldsets = ( @@ -311,6 +315,7 @@ class RackBaseFilterForm(PrimaryModelFilterSetForm): ) +@register_filterset(RackTypeFilterSet) class RackTypeFilterForm(FilterModifierMixin, RackBaseFilterForm): model = RackType fieldsets = ( @@ -333,6 +338,7 @@ class RackTypeFilterForm(FilterModifierMixin, RackBaseFilterForm): tag = TagFilterField(model) +@register_filterset(RackFilterSet) class RackFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterForm, RackBaseFilterForm): model = Rack fieldsets = ( @@ -434,6 +440,7 @@ class RackElevationFilterForm(RackFilterForm): ) +@register_filterset(RackReservationFilterSet) class RackReservationFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = RackReservation fieldsets = ( @@ -492,6 +499,7 @@ class RackReservationFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryM tag = TagFilterField(model) +@register_filterset(ManufacturerFilterSet) class ManufacturerFilterForm(FilterModifierMixin, ContactModelFilterForm, OrganizationalModelFilterSetForm): model = Manufacturer fieldsets = ( @@ -501,6 +509,7 @@ class ManufacturerFilterForm(FilterModifierMixin, ContactModelFilterForm, Organi tag = TagFilterField(model) +@register_filterset(DeviceTypeFilterSet) class DeviceTypeFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = DeviceType fieldsets = ( @@ -635,6 +644,7 @@ class DeviceTypeFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): ) +@register_filterset(ModuleTypeProfileFilterSet) class ModuleTypeProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = ModuleTypeProfile fieldsets = ( @@ -644,6 +654,7 @@ class ModuleTypeProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm tag = TagFilterField(model) +@register_filterset(ModuleTypeFilterSet) class ModuleTypeFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = ModuleType fieldsets = ( @@ -737,6 +748,7 @@ class ModuleTypeFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): ) +@register_filterset(DeviceRoleFilterSet) class DeviceRoleFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): model = DeviceRole fieldsets = ( @@ -756,6 +768,7 @@ class DeviceRoleFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(PlatformFilterSet) class PlatformFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): model = Platform fieldsets = ( @@ -781,6 +794,7 @@ class PlatformFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(DeviceFilterSet) class DeviceFilterForm( FilterModifierMixin, LocalConfigContextFilterForm, @@ -980,6 +994,7 @@ class DeviceFilterForm( tag = TagFilterField(model) +@register_filterset(VirtualDeviceContextFilterSet) class VirtualDeviceContextFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = VirtualDeviceContext fieldsets = ( @@ -1007,6 +1022,7 @@ class VirtualDeviceContextFilterForm(FilterModifierMixin, TenancyFilterForm, Pri tag = TagFilterField(model) +@register_filterset(ModuleFilterSet) class ModuleFilterForm(FilterModifierMixin, LocalConfigContextFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Module fieldsets = ( @@ -1090,6 +1106,7 @@ class ModuleFilterForm(FilterModifierMixin, LocalConfigContextFilterForm, Tenanc tag = TagFilterField(model) +@register_filterset(VirtualChassisFilterSet) class VirtualChassisFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = VirtualChassis fieldsets = ( @@ -1119,6 +1136,7 @@ class VirtualChassisFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryMo tag = TagFilterField(model) +@register_filterset(CableFilterSet) class CableFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = Cable fieldsets = ( @@ -1208,6 +1226,7 @@ class CableFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilter tag = TagFilterField(model) +@register_filterset(PowerPanelFilterSet) class PowerPanelFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryModelFilterSetForm): model = PowerPanel fieldsets = ( @@ -1247,6 +1266,7 @@ class PowerPanelFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryM tag = TagFilterField(model) +@register_filterset(PowerFeedFilterSet) class PowerFeedFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = PowerFeed fieldsets = ( @@ -1357,6 +1377,7 @@ class PathEndpointFilterForm(CabledFilterForm): ) +@register_filterset(ConsolePortFilterSet) class ConsolePortFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceComponentFilterForm): model = ConsolePort fieldsets = ( @@ -1381,6 +1402,7 @@ class ConsolePortFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceC tag = TagFilterField(model) +@register_filterset(ConsoleServerPortFilterSet) class ConsoleServerPortFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceComponentFilterForm): model = ConsoleServerPort fieldsets = ( @@ -1406,6 +1428,7 @@ class ConsoleServerPortFilterForm(FilterModifierMixin, PathEndpointFilterForm, D tag = TagFilterField(model) +@register_filterset(PowerPortFilterSet) class PowerPortFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerPort fieldsets = ( @@ -1425,6 +1448,7 @@ class PowerPortFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceCom tag = TagFilterField(model) +@register_filterset(PowerOutletFilterSet) class PowerOutletFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceComponentFilterForm): model = PowerOutlet fieldsets = ( @@ -1454,6 +1478,7 @@ class PowerOutletFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceC ) +@register_filterset(InterfaceFilterSet) class InterfaceFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceComponentFilterForm): model = Interface fieldsets = ( @@ -1580,6 +1605,7 @@ class InterfaceFilterForm(FilterModifierMixin, PathEndpointFilterForm, DeviceCom tag = TagFilterField(model) +@register_filterset(FrontPortFilterSet) class FrontPortFilterForm(FilterModifierMixin, CabledFilterForm, DeviceComponentFilterForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -1603,6 +1629,7 @@ class FrontPortFilterForm(FilterModifierMixin, CabledFilterForm, DeviceComponent tag = TagFilterField(model) +@register_filterset(RearPortFilterSet) class RearPortFilterForm(FilterModifierMixin, CabledFilterForm, DeviceComponentFilterForm): model = RearPort fieldsets = ( @@ -1627,6 +1654,7 @@ class RearPortFilterForm(FilterModifierMixin, CabledFilterForm, DeviceComponentF tag = TagFilterField(model) +@register_filterset(ModuleBayFilterSet) class ModuleBayFilterForm(FilterModifierMixin, DeviceComponentFilterForm): model = ModuleBay fieldsets = ( @@ -1645,6 +1673,7 @@ class ModuleBayFilterForm(FilterModifierMixin, DeviceComponentFilterForm): ) +@register_filterset(DeviceBayFilterSet) class DeviceBayFilterForm(FilterModifierMixin, DeviceComponentFilterForm): model = DeviceBay fieldsets = ( @@ -1659,6 +1688,7 @@ class DeviceBayFilterForm(FilterModifierMixin, DeviceComponentFilterForm): tag = TagFilterField(model) +@register_filterset(InventoryItemFilterSet) class InventoryItemFilterForm(FilterModifierMixin, DeviceComponentFilterForm): model = InventoryItem fieldsets = ( @@ -1710,6 +1740,7 @@ class InventoryItemFilterForm(FilterModifierMixin, DeviceComponentFilterForm): # Device component roles # +@register_filterset(InventoryItemRoleFilterSet) class InventoryItemRoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = InventoryItemRole fieldsets = ( @@ -1722,6 +1753,7 @@ class InventoryItemRoleFilterForm(FilterModifierMixin, OrganizationalModelFilter # Addressing # +@register_filterset(MACAddressFilterSet) class MACAddressFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = MACAddress fieldsets = ( @@ -1835,39 +1867,3 @@ class InterfaceConnectionFilterForm(FilterForm): }, label=_('Device') ) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[CableFilterForm] = CableFilterSet -FILTERSET_MAPPINGS[ConsolePortFilterForm] = ConsolePortFilterSet -FILTERSET_MAPPINGS[ConsoleServerPortFilterForm] = ConsoleServerPortFilterSet -FILTERSET_MAPPINGS[DeviceBayFilterForm] = DeviceBayFilterSet -FILTERSET_MAPPINGS[DeviceFilterForm] = DeviceFilterSet -FILTERSET_MAPPINGS[DeviceRoleFilterForm] = DeviceRoleFilterSet -FILTERSET_MAPPINGS[DeviceTypeFilterForm] = DeviceTypeFilterSet -FILTERSET_MAPPINGS[FrontPortFilterForm] = FrontPortFilterSet -FILTERSET_MAPPINGS[InterfaceFilterForm] = InterfaceFilterSet -FILTERSET_MAPPINGS[InventoryItemFilterForm] = InventoryItemFilterSet -FILTERSET_MAPPINGS[InventoryItemRoleFilterForm] = InventoryItemRoleFilterSet -FILTERSET_MAPPINGS[LocationFilterForm] = LocationFilterSet -FILTERSET_MAPPINGS[MACAddressFilterForm] = MACAddressFilterSet -FILTERSET_MAPPINGS[ManufacturerFilterForm] = ManufacturerFilterSet -FILTERSET_MAPPINGS[ModuleBayFilterForm] = ModuleBayFilterSet -FILTERSET_MAPPINGS[ModuleFilterForm] = ModuleFilterSet -FILTERSET_MAPPINGS[ModuleTypeFilterForm] = ModuleTypeFilterSet -FILTERSET_MAPPINGS[ModuleTypeProfileFilterForm] = ModuleTypeProfileFilterSet -FILTERSET_MAPPINGS[PlatformFilterForm] = PlatformFilterSet -FILTERSET_MAPPINGS[PowerFeedFilterForm] = PowerFeedFilterSet -FILTERSET_MAPPINGS[PowerOutletFilterForm] = PowerOutletFilterSet -FILTERSET_MAPPINGS[PowerPanelFilterForm] = PowerPanelFilterSet -FILTERSET_MAPPINGS[PowerPortFilterForm] = PowerPortFilterSet -FILTERSET_MAPPINGS[RackFilterForm] = RackFilterSet -FILTERSET_MAPPINGS[RackReservationFilterForm] = RackReservationFilterSet -FILTERSET_MAPPINGS[RackRoleFilterForm] = RackRoleFilterSet -FILTERSET_MAPPINGS[RackTypeFilterForm] = RackTypeFilterSet -FILTERSET_MAPPINGS[RearPortFilterForm] = RearPortFilterSet -FILTERSET_MAPPINGS[RegionFilterForm] = RegionFilterSet -FILTERSET_MAPPINGS[SiteFilterForm] = SiteFilterSet -FILTERSET_MAPPINGS[SiteGroupFilterForm] = SiteGroupFilterSet -FILTERSET_MAPPINGS[VirtualChassisFilterForm] = VirtualChassisFilterSet -FILTERSET_MAPPINGS[VirtualDeviceContextFilterForm] = VirtualDeviceContextFilterSet diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 96ae41714..772eb39be 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -10,12 +10,11 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice, register_filterset from utilities.forms.fields import ( ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DateTimePicker @@ -42,6 +41,7 @@ __all__ = ( ) +@register_filterset(CustomFieldFilterSet) class CustomFieldFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = CustomField fieldsets = ( @@ -129,6 +129,7 @@ class CustomFieldFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(CustomFieldChoiceSetFilterSet) class CustomFieldChoiceSetFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = CustomFieldChoiceSet fieldsets = ( @@ -149,6 +150,7 @@ class CustomFieldChoiceSetFilterForm(FilterModifierMixin, SavedFiltersMixin, Fil ) +@register_filterset(CustomLinkFilterSet) class CustomLinkFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = CustomLink fieldsets = ( @@ -185,6 +187,7 @@ class CustomLinkFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(ExportTemplateFilterSet) class ExportTemplateFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ExportTemplate fieldsets = ( @@ -236,6 +239,7 @@ class ExportTemplateFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterFor ) +@register_filterset(ImageAttachmentFilterSet) class ImageAttachmentFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ImageAttachment fieldsets = ( @@ -253,6 +257,7 @@ class ImageAttachmentFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterFo ) +@register_filterset(SavedFilterFilterSet) class SavedFilterFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = SavedFilter fieldsets = ( @@ -289,6 +294,7 @@ class SavedFilterFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(TableConfigFilterSet) class TableConfigFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): fieldsets = ( FieldSet('q', 'filter_id'), @@ -319,6 +325,7 @@ class TableConfigFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(WebhookFilterSet) class WebhookFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = Webhook fieldsets = ( @@ -346,6 +353,7 @@ class WebhookFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(EventRuleFilterSet) class EventRuleFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = EventRule fieldsets = ( @@ -382,6 +390,7 @@ class EventRuleFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(TagFilterSet) class TagFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = Tag content_type_id = ContentTypeMultipleChoiceField( @@ -401,6 +410,7 @@ class TagFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(ConfigContextProfileFilterSet) class ConfigContextProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = ConfigContextProfile fieldsets = ( @@ -422,6 +432,7 @@ class ConfigContextProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetF ) +@register_filterset(ConfigContextFilterSet) class ConfigContextFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ConfigContext fieldsets = ( @@ -523,6 +534,7 @@ class ConfigContextFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm ) +@register_filterset(ConfigTemplateFilterSet) class ConfigTemplateFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = ConfigTemplate fieldsets = ( @@ -587,6 +599,7 @@ class LocalConfigContextFilterForm(forms.Form): ) +@register_filterset(JournalEntryFilterSet) class JournalEntryFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = JournalEntry fieldsets = ( @@ -622,6 +635,7 @@ class JournalEntryFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(NotificationGroupFilterSet) class NotificationGroupFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = NotificationGroup user_id = DynamicModelMultipleChoiceField( @@ -634,21 +648,3 @@ class NotificationGroupFilterForm(FilterModifierMixin, SavedFiltersMixin, Filter required=False, label=_('Group') ) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[CustomFieldFilterForm] = CustomFieldFilterSet -FILTERSET_MAPPINGS[CustomFieldChoiceSetFilterForm] = CustomFieldChoiceSetFilterSet -FILTERSET_MAPPINGS[CustomLinkFilterForm] = CustomLinkFilterSet -FILTERSET_MAPPINGS[ExportTemplateFilterForm] = ExportTemplateFilterSet -FILTERSET_MAPPINGS[ImageAttachmentFilterForm] = ImageAttachmentFilterSet -FILTERSET_MAPPINGS[SavedFilterFilterForm] = SavedFilterFilterSet -FILTERSET_MAPPINGS[TableConfigFilterForm] = TableConfigFilterSet -FILTERSET_MAPPINGS[WebhookFilterForm] = WebhookFilterSet -FILTERSET_MAPPINGS[EventRuleFilterForm] = EventRuleFilterSet -FILTERSET_MAPPINGS[TagFilterForm] = TagFilterSet -FILTERSET_MAPPINGS[ConfigContextProfileFilterForm] = ConfigContextProfileFilterSet -FILTERSET_MAPPINGS[ConfigContextFilterForm] = ConfigContextFilterSet -FILTERSET_MAPPINGS[ConfigTemplateFilterForm] = ConfigTemplateFilterSet -FILTERSET_MAPPINGS[JournalEntryFilterForm] = JournalEntryFilterSet -FILTERSET_MAPPINGS[NotificationGroupFilterForm] = NotificationGroupFilterSet diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index d154d41c7..cbc2dc2b0 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -8,9 +8,8 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice, register_filterset from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from virtualization.models import VirtualMachine, ClusterGroup, Cluster @@ -45,6 +44,7 @@ IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ ]) +@register_filterset(VRFFilterSet) class VRFFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = VRF fieldsets = ( @@ -65,6 +65,7 @@ class VRFFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSe tag = TagFilterField(model) +@register_filterset(RouteTargetFilterSet) class RouteTargetFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = RouteTarget fieldsets = ( @@ -85,6 +86,7 @@ class RouteTargetFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModel tag = TagFilterField(model) +@register_filterset(RIRFilterSet) class RIRFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = RIR fieldsets = ( @@ -101,6 +103,7 @@ class RIRFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(AggregateFilterSet) class AggregateFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Aggregate fieldsets = ( @@ -122,6 +125,7 @@ class AggregateFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFi tag = TagFilterField(model) +@register_filterset(ASNRangeFilterSet) class ASNRangeFilterForm(FilterModifierMixin, TenancyFilterForm, OrganizationalModelFilterSetForm): model = ASNRange fieldsets = ( @@ -145,6 +149,7 @@ class ASNRangeFilterForm(FilterModifierMixin, TenancyFilterForm, OrganizationalM tag = TagFilterField(model) +@register_filterset(ASNFilterSet) class ASNFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = ASN fieldsets = ( @@ -170,6 +175,7 @@ class ASNFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSe tag = TagFilterField(model) +@register_filterset(RoleFilterSet) class RoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = Role fieldsets = ( @@ -178,6 +184,7 @@ class RoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(PrefixFilterSet) class PrefixFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Prefix fieldsets = ( @@ -284,6 +291,7 @@ class PrefixFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilte tag = TagFilterField(model) +@register_filterset(IPRangeFilterSet) class IPRangeFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = IPRange fieldsets = ( @@ -331,6 +339,7 @@ class IPRangeFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilt tag = TagFilterField(model) +@register_filterset(IPAddressFilterSet) class IPAddressFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = IPAddress fieldsets = ( @@ -409,6 +418,7 @@ class IPAddressFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFi tag = TagFilterField(model) +@register_filterset(FHRPGroupFilterSet) class FHRPGroupFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = FHRPGroup fieldsets = ( @@ -442,6 +452,7 @@ class FHRPGroupFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(VLANGroupFilterSet) class VLANGroupFilterForm(FilterModifierMixin, TenancyFilterForm, OrganizationalModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -495,6 +506,7 @@ class VLANGroupFilterForm(FilterModifierMixin, TenancyFilterForm, Organizational tag = TagFilterField(model) +@register_filterset(VLANTranslationPolicyFilterSet) class VLANTranslationPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = VLANTranslationPolicy fieldsets = ( @@ -508,6 +520,7 @@ class VLANTranslationPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSet tag = TagFilterField(model) +@register_filterset(VLANTranslationRuleFilterSet) class VLANTranslationRuleFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = VLANTranslationRule fieldsets = ( @@ -532,6 +545,7 @@ class VLANTranslationRuleFilterForm(FilterModifierMixin, NetBoxModelFilterSetFor ) +@register_filterset(VLANFilterSet) class VLANFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = VLAN fieldsets = ( @@ -604,6 +618,7 @@ class VLANFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterS tag = TagFilterField(model) +@register_filterset(ServiceTemplateFilterSet) class ServiceTemplateFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = ServiceTemplate fieldsets = ( @@ -622,6 +637,7 @@ class ServiceTemplateFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(ServiceFilterSet) class ServiceFilterForm(ContactModelFilterForm, ServiceTemplateFilterForm): model = Service fieldsets = ( @@ -646,23 +662,3 @@ class ServiceFilterForm(ContactModelFilterForm, ServiceTemplateFilterForm): label=_('FHRP Group'), ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[AggregateFilterForm] = AggregateFilterSet -FILTERSET_MAPPINGS[ASNFilterForm] = ASNFilterSet -FILTERSET_MAPPINGS[ASNRangeFilterForm] = ASNRangeFilterSet -FILTERSET_MAPPINGS[FHRPGroupFilterForm] = FHRPGroupFilterSet -FILTERSET_MAPPINGS[IPAddressFilterForm] = IPAddressFilterSet -FILTERSET_MAPPINGS[IPRangeFilterForm] = IPRangeFilterSet -FILTERSET_MAPPINGS[PrefixFilterForm] = PrefixFilterSet -FILTERSET_MAPPINGS[RIRFilterForm] = RIRFilterSet -FILTERSET_MAPPINGS[RoleFilterForm] = RoleFilterSet -FILTERSET_MAPPINGS[RouteTargetFilterForm] = RouteTargetFilterSet -FILTERSET_MAPPINGS[ServiceFilterForm] = ServiceFilterSet -FILTERSET_MAPPINGS[ServiceTemplateFilterForm] = ServiceTemplateFilterSet -FILTERSET_MAPPINGS[VLANFilterForm] = VLANFilterSet -FILTERSET_MAPPINGS[VLANGroupFilterForm] = VLANGroupFilterSet -FILTERSET_MAPPINGS[VLANTranslationPolicyFilterForm] = VLANTranslationPolicyFilterSet -FILTERSET_MAPPINGS[VLANTranslationRuleFilterForm] = VLANTranslationRuleFilterSet -FILTERSET_MAPPINGS[VRFFilterForm] = VRFFilterSet diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index fe5ce4301..a28fd17e7 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -26,6 +26,7 @@ registry = Registry({ 'data_backends': dict(), 'denormalized_fields': collections.defaultdict(list), 'event_types': dict(), + 'filtersets': dict(), 'model_features': dict(), 'models': collections.defaultdict(set), 'plugins': dict(), diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 19d15b180..812e1282d 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -13,7 +13,7 @@ from tenancy.forms import ContactModelFilterForm from utilities.forms.fields import ( ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS +from utilities.forms import register_filterset from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet @@ -31,6 +31,7 @@ __all__ = ( # Tenants # +@register_filterset(TenantGroupFilterSet) class TenantGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): model = TenantGroup fieldsets = ( @@ -45,6 +46,7 @@ class TenantGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(TenantFilterSet) class TenantFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Tenant fieldsets = ( @@ -65,6 +67,7 @@ class TenantFilterForm(FilterModifierMixin, ContactModelFilterForm, PrimaryModel # Contacts # +@register_filterset(ContactGroupFilterSet) class ContactGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): model = ContactGroup fieldsets = ( @@ -79,6 +82,7 @@ class ContactGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm) tag = TagFilterField(model) +@register_filterset(ContactRoleFilterSet) class ContactRoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = ContactRole fieldsets = ( @@ -87,6 +91,7 @@ class ContactRoleFilterForm(FilterModifierMixin, OrganizationalModelFilterSetFor tag = TagFilterField(model) +@register_filterset(ContactFilterSet) class ContactFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = Contact fieldsets = ( @@ -102,6 +107,7 @@ class ContactFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(ContactAssignmentFilterSet) class ContactAssignmentFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = ContactAssignment fieldsets = ( @@ -134,12 +140,3 @@ class ContactAssignmentFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm) required=False ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[ContactAssignmentFilterForm] = ContactAssignmentFilterSet -FILTERSET_MAPPINGS[ContactFilterForm] = ContactFilterSet -FILTERSET_MAPPINGS[ContactGroupFilterForm] = ContactGroupFilterSet -FILTERSET_MAPPINGS[ContactRoleFilterForm] = ContactRoleFilterSet -FILTERSET_MAPPINGS[TenantFilterForm] = TenantFilterSet -FILTERSET_MAPPINGS[TenantGroupFilterForm] = TenantGroupFilterSet diff --git a/netbox/users/forms/filtersets.py b/netbox/users/forms/filtersets.py index 6bcc57eb5..42c3417f8 100644 --- a/netbox/users/forms/filtersets.py +++ b/netbox/users/forms/filtersets.py @@ -5,9 +5,8 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, register_filterset from utilities.forms.fields import DynamicModelMultipleChoiceField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.utils import add_blank_choice @@ -24,6 +23,7 @@ __all__ = ( ) +@register_filterset(GroupFilterSet) class GroupFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = Group fieldsets = ( @@ -31,6 +31,7 @@ class GroupFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): ) +@register_filterset(UserFilterSet) class UserFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = User fieldsets = ( @@ -59,6 +60,7 @@ class UserFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): ) +@register_filterset(ObjectPermissionFilterSet) class ObjectPermissionFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = ObjectPermission fieldsets = ( @@ -113,6 +115,7 @@ class ObjectPermissionFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): ) +@register_filterset(TokenFilterSet) class TokenFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): model = Token fieldsets = ( @@ -154,6 +157,7 @@ class TokenFilterForm(FilterModifierMixin, SavedFiltersMixin, FilterForm): ) +@register_filterset(OwnerGroupFilterSet) class OwnerGroupFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = OwnerGroup fieldsets = ( @@ -161,6 +165,7 @@ class OwnerGroupFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): ) +@register_filterset(OwnerFilterSet) class OwnerFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = Owner fieldsets = ( @@ -183,12 +188,3 @@ class OwnerFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): required=False, label=_('Users') ) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[GroupFilterForm] = GroupFilterSet -FILTERSET_MAPPINGS[UserFilterForm] = UserFilterSet -FILTERSET_MAPPINGS[ObjectPermissionFilterForm] = ObjectPermissionFilterSet -FILTERSET_MAPPINGS[TokenFilterForm] = TokenFilterSet -FILTERSET_MAPPINGS[OwnerGroupFilterForm] = OwnerGroupFilterSet -FILTERSET_MAPPINGS[OwnerFilterForm] = OwnerFilterSet diff --git a/netbox/utilities/forms/__init__.py b/netbox/utilities/forms/__init__.py index 94f7d48c9..535481e09 100644 --- a/netbox/utilities/forms/__init__.py +++ b/netbox/utilities/forms/__init__.py @@ -2,3 +2,22 @@ from .constants import * from .forms import * from .mixins import * from .utils import * + + +def register_filterset(filterset_class): + """ + Decorator for registering a FilterForm -> FilterSet mapping. + + Usage: + @register_filterset(DeviceFilterSet) + class DeviceFilterForm(NetBoxModelFilterSetForm): + ... + + Args: + filterset_class: The corresponding filterset class + """ + def decorator(form_class): + from netbox.registry import registry + registry['filtersets'][form_class] = filterset_class + return form_class + return decorator diff --git a/netbox/utilities/forms/filterset_mappings.py b/netbox/utilities/forms/filterset_mappings.py deleted file mode 100644 index dc009a7f2..000000000 --- a/netbox/utilities/forms/filterset_mappings.py +++ /dev/null @@ -1,11 +0,0 @@ -# Mapping of filter form classes to their corresponding FilterSet classes -# This enables the FilterModifierMixin to verify which lookups are actually supported -# by checking the FilterSet's auto-generated lookup filters. -# -# Usage: -# from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS -# from .forms.filtersets import XFilterForm -# from .filtersets import XFilterSet -# FILTERSET_MAPPINGS[XFilterForm] = XFilterSet - -FILTERSET_MAPPINGS = {} diff --git a/netbox/utilities/forms/mixins.py b/netbox/utilities/forms/mixins.py index a9ba8385b..3cb4547e2 100644 --- a/netbox/utilities/forms/mixins.py +++ b/netbox/utilities/forms/mixins.py @@ -172,10 +172,10 @@ class FilterModifierMixin: def _enhance_fields_with_modifiers(self): """Wrap compatible field widgets with FilterModifierWidget.""" from utilities.forms.widgets import FilterModifierWidget - from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS + from netbox.registry import registry # Get the corresponding FilterSet if registered - filterset_class = FILTERSET_MAPPINGS.get(self.__class__) + filterset_class = registry['filtersets'].get(self.__class__) filterset = filterset_class() if filterset_class else None for field_name, field in self.fields.items(): diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 02677d67d..eacf91305 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -9,9 +9,8 @@ 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 +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, register_filterset from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from virtualization.choices import * @@ -29,6 +28,7 @@ __all__ = ( ) +@register_filterset(ClusterTypeFilterSet) class ClusterTypeFilterForm(FilterModifierMixin, OrganizationalModelFilterSetForm): model = ClusterType fieldsets = ( @@ -37,6 +37,7 @@ class ClusterTypeFilterForm(FilterModifierMixin, OrganizationalModelFilterSetFor tag = TagFilterField(model) +@register_filterset(ClusterGroupFilterSet) class ClusterGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, OrganizationalModelFilterSetForm): model = ClusterGroup tag = TagFilterField(model) @@ -46,6 +47,7 @@ class ClusterGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, Organi ) +@register_filterset(ClusterFilterSet) class ClusterFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): model = Cluster fieldsets = ( @@ -100,6 +102,7 @@ class ClusterFilterForm(FilterModifierMixin, TenancyFilterForm, ContactModelFilt tag = TagFilterField(model) +@register_filterset(VirtualMachineFilterSet) class VirtualMachineFilterForm( FilterModifierMixin, LocalConfigContextFilterForm, @@ -209,6 +212,7 @@ class VirtualMachineFilterForm( tag = TagFilterField(model) +@register_filterset(VMInterfaceFilterSet) class VMInterfaceFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = VMInterface fieldsets = ( @@ -271,6 +275,7 @@ class VMInterfaceFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(VirtualDiskFilterSet) class VirtualDiskFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = VirtualDisk fieldsets = ( @@ -294,12 +299,3 @@ class VirtualDiskFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): label=_('Owner'), ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[ClusterFilterForm] = ClusterFilterSet -FILTERSET_MAPPINGS[ClusterGroupFilterForm] = ClusterGroupFilterSet -FILTERSET_MAPPINGS[ClusterTypeFilterForm] = ClusterTypeFilterSet -FILTERSET_MAPPINGS[VirtualDiskFilterForm] = VirtualDiskFilterSet -FILTERSET_MAPPINGS[VirtualMachineFilterForm] = VirtualMachineFilterSet -FILTERSET_MAPPINGS[VMInterfaceFilterForm] = VMInterfaceFilterSet diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index 2fc0339e9..92998c60a 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -9,7 +9,7 @@ from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms.fields import ( ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS +from utilities.forms import register_filterset from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from utilities.forms.utils import add_blank_choice @@ -33,6 +33,7 @@ __all__ = ( ) +@register_filterset(TunnelGroupFilterSet) class TunnelGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, OrganizationalModelFilterSetForm): model = TunnelGroup fieldsets = ( @@ -42,6 +43,7 @@ class TunnelGroupFilterForm(FilterModifierMixin, ContactModelFilterForm, Organiz tag = TagFilterField(model) +@register_filterset(TunnelFilterSet) class TunnelFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = Tunnel fieldsets = ( @@ -78,6 +80,7 @@ class TunnelFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilte tag = TagFilterField(model) +@register_filterset(TunnelTerminationFilterSet) class TunnelTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = TunnelTermination fieldsets = ( @@ -97,6 +100,7 @@ class TunnelTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm) tag = TagFilterField(model) +@register_filterset(IKEProposalFilterSet) class IKEProposalFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = IKEProposal fieldsets = ( @@ -128,6 +132,7 @@ class IKEProposalFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(IKEPolicyFilterSet) class IKEPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = IKEPolicy fieldsets = ( @@ -152,6 +157,7 @@ class IKEPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(IPSecProposalFilterSet) class IPSecProposalFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = IPSecProposal fieldsets = ( @@ -171,6 +177,7 @@ class IPSecProposalFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(IPSecPolicyFilterSet) class IPSecPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = IPSecPolicy fieldsets = ( @@ -190,6 +197,7 @@ class IPSecPolicyFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(IPSecProfileFilterSet) class IPSecProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): model = IPSecProfile fieldsets = ( @@ -214,6 +222,7 @@ class IPSecProfileFilterForm(FilterModifierMixin, PrimaryModelFilterSetForm): tag = TagFilterField(model) +@register_filterset(L2VPNFilterSet) class L2VPNFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): model = L2VPN fieldsets = ( @@ -245,6 +254,7 @@ class L2VPNFilterForm(FilterModifierMixin, ContactModelFilterForm, TenancyFilter tag = TagFilterField(model) +@register_filterset(L2VPNTerminationFilterSet) class L2VPNTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): model = L2VPNTermination fieldsets = ( @@ -307,16 +317,3 @@ class L2VPNTerminationFilterForm(FilterModifierMixin, NetBoxModelFilterSetForm): label=_('Virtual Machine') ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[IKEPolicyFilterForm] = IKEPolicyFilterSet -FILTERSET_MAPPINGS[IKEProposalFilterForm] = IKEProposalFilterSet -FILTERSET_MAPPINGS[IPSecPolicyFilterForm] = IPSecPolicyFilterSet -FILTERSET_MAPPINGS[IPSecProfileFilterForm] = IPSecProfileFilterSet -FILTERSET_MAPPINGS[IPSecProposalFilterForm] = IPSecProposalFilterSet -FILTERSET_MAPPINGS[L2VPNFilterForm] = L2VPNFilterSet -FILTERSET_MAPPINGS[L2VPNTerminationFilterForm] = L2VPNTerminationFilterSet -FILTERSET_MAPPINGS[TunnelFilterForm] = TunnelFilterSet -FILTERSET_MAPPINGS[TunnelGroupFilterForm] = TunnelGroupFilterSet -FILTERSET_MAPPINGS[TunnelTerminationFilterForm] = TunnelTerminationFilterSet diff --git a/netbox/wireless/forms/filtersets.py b/netbox/wireless/forms/filtersets.py index 5ec348371..d38696941 100644 --- a/netbox/wireless/forms/filtersets.py +++ b/netbox/wireless/forms/filtersets.py @@ -6,9 +6,8 @@ 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 +from utilities.forms import add_blank_choice, register_filterset from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField -from utilities.forms.filterset_mappings import FILTERSET_MAPPINGS from utilities.forms.mixins import FilterModifierMixin from utilities.forms.rendering import FieldSet from wireless.choices import * @@ -22,6 +21,7 @@ __all__ = ( ) +@register_filterset(WirelessLANGroupFilterSet) class WirelessLANGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetForm): model = WirelessLANGroup fieldsets = ( @@ -36,6 +36,7 @@ class WirelessLANGroupFilterForm(FilterModifierMixin, NestedGroupModelFilterSetF tag = TagFilterField(model) +@register_filterset(WirelessLANFilterSet) class WirelessLANFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = WirelessLAN fieldsets = ( @@ -102,6 +103,7 @@ class WirelessLANFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModel tag = TagFilterField(model) +@register_filterset(WirelessLinkFilterSet) class WirelessLinkFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryModelFilterSetForm): model = WirelessLink fieldsets = ( @@ -143,9 +145,3 @@ class WirelessLinkFilterForm(FilterModifierMixin, TenancyFilterForm, PrimaryMode required=False ) tag = TagFilterField(model) - - -# Register FilterSet mappings for FilterModifierMixin lookup verification -FILTERSET_MAPPINGS[WirelessLANFilterForm] = WirelessLANFilterSet -FILTERSET_MAPPINGS[WirelessLANGroupFilterForm] = WirelessLANGroupFilterSet -FILTERSET_MAPPINGS[WirelessLinkFilterForm] = WirelessLinkFilterSet