From 69057dd02c92a2ec5f29351a0e33f9ccb461c133 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 5 Dec 2025 16:31:31 -0500 Subject: [PATCH] Refactor filter mixins --- netbox/circuits/graphql/filter_mixins.py | 11 +-- netbox/circuits/graphql/filters.py | 6 +- netbox/dcim/graphql/filter_mixins.py | 22 +++--- netbox/dcim/graphql/filters.py | 70 +++++++++++-------- netbox/extras/graphql/filter_mixins.py | 8 --- netbox/extras/graphql/filters.py | 6 +- netbox/ipam/graphql/filter_mixins.py | 4 +- netbox/ipam/graphql/filters.py | 6 +- .../virtualization/graphql/filter_mixins.py | 8 +-- netbox/virtualization/graphql/filters.py | 8 +-- netbox/wireless/graphql/filter_mixins.py | 4 +- netbox/wireless/graphql/filters.py | 6 +- 12 files changed, 82 insertions(+), 77 deletions(-) diff --git a/netbox/circuits/graphql/filter_mixins.py b/netbox/circuits/graphql/filter_mixins.py index 0781288cc..f7795f10a 100644 --- a/netbox/circuits/graphql/filter_mixins.py +++ b/netbox/circuits/graphql/filter_mixins.py @@ -3,17 +3,18 @@ from typing import Annotated, TYPE_CHECKING import strawberry import strawberry_django - -from netbox.graphql.filters import OrganizationalModelFilter +from strawberry_django import BaseFilterLookup if TYPE_CHECKING: from netbox.graphql.enums import ColorEnum __all__ = ( - 'BaseCircuitTypeFilter', + 'CircuitTypeFilterMixin', ) @dataclass -class BaseCircuitTypeFilter(OrganizationalModelFilter): - color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field() +class CircuitTypeFilterMixin: + color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = ( + strawberry_django.filter_field() + ) diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index 25e267a5f..160dd9c2b 100644 --- a/netbox/circuits/graphql/filters.py +++ b/netbox/circuits/graphql/filters.py @@ -7,12 +7,12 @@ from strawberry.scalars import ID from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup from circuits import models +from circuits.graphql.filter_mixins import CircuitTypeFilterMixin from dcim.graphql.filter_mixins import CabledObjectModelFilterMixin from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin from netbox.graphql.filter_mixins import DistanceFilterMixin, ImageAttachmentFilterMixin from netbox.graphql.filters import ChangeLoggedModelFilter, OrganizationalModelFilter, PrimaryModelFilter from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin -from .filter_mixins import BaseCircuitTypeFilter if TYPE_CHECKING: from core.graphql.filters import ContentTypeFilter @@ -118,7 +118,7 @@ class CircuitFilter( @strawberry_django.filter_type(models.CircuitType, lookups=True) -class CircuitTypeFilter(BaseCircuitTypeFilter): +class CircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter): pass @@ -173,7 +173,7 @@ class ProviderNetworkFilter(PrimaryModelFilter): @strawberry_django.filter_type(models.VirtualCircuitType, lookups=True) -class VirtualCircuitTypeFilter(BaseCircuitTypeFilter): +class VirtualCircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter): pass diff --git a/netbox/dcim/graphql/filter_mixins.py b/netbox/dcim/graphql/filter_mixins.py index 2f5f6016c..e0f6bbc1d 100644 --- a/netbox/dcim/graphql/filter_mixins.py +++ b/netbox/dcim/graphql/filter_mixins.py @@ -7,8 +7,6 @@ from strawberry import ID from strawberry_django import BaseFilterLookup, FilterLookup from core.graphql.filters import ContentTypeFilter -from netbox.graphql.filter_mixins import WeightFilterMixin -from netbox.graphql.filters import ChangeLoggedModelFilter, NetBoxModelFilter, PrimaryModelFilter from .enums import * if TYPE_CHECKING: @@ -19,12 +17,12 @@ if TYPE_CHECKING: __all__ = ( 'CabledObjectModelFilterMixin', - 'ComponentModelFilter', - 'ComponentTemplateFilter', + 'ComponentModelFilterMixin', + 'ComponentTemplateFilterMixin', 'InterfaceBaseFilterMixin', - 'ModularComponentModelFilter', - 'ModularComponentTemplateFilter', - 'RackBaseFilter', + 'ModularComponentModelFilterMixin', + 'ModularComponentTemplateFilterMixin', + 'RackFilterMixin', 'RenderConfigFilterMixin', 'ScopedFilterMixin', ) @@ -39,7 +37,7 @@ class ScopedFilterMixin: @dataclass -class ComponentModelFilter(NetBoxModelFilter): +class ComponentModelFilterMixin: device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field() device_id: ID | None = strawberry_django.filter_field() name: FilterLookup[str] | None = strawberry_django.filter_field() @@ -48,7 +46,7 @@ class ComponentModelFilter(NetBoxModelFilter): @dataclass -class ModularComponentModelFilter(ComponentModelFilter): +class ModularComponentModelFilterMixin(ComponentModelFilterMixin): module: Annotated['ModuleFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field() module_id: ID | None = strawberry_django.filter_field() inventory_items: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( @@ -67,7 +65,7 @@ class CabledObjectModelFilterMixin: @dataclass -class ComponentTemplateFilter(ChangeLoggedModelFilter): +class ComponentTemplateFilterMixin: device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -78,7 +76,7 @@ class ComponentTemplateFilter(ChangeLoggedModelFilter): @dataclass -class ModularComponentTemplateFilter(ComponentTemplateFilter): +class ModularComponentTemplateFilterMixin(ComponentTemplateFilterMixin): module_type: Annotated['ModuleTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -124,7 +122,7 @@ class InterfaceBaseFilterMixin: @dataclass -class RackBaseFilter(WeightFilterMixin, PrimaryModelFilter): +class RackFilterMixin: width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index c54673fa8..49fd9f817 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -9,22 +9,21 @@ from strawberry_django import BaseFilterLookup, ComparisonFilterLookup, FilterLo from dcim import models from dcim.constants import * from dcim.graphql.enums import InterfaceKindEnum +from dcim.graphql.filter_mixins import ( + ComponentModelFilterMixin, ComponentTemplateFilterMixin, ModularComponentModelFilterMixin, + ModularComponentTemplateFilterMixin, RackFilterMixin, +) from extras.graphql.filter_mixins import ConfigContextFilterMixin from netbox.graphql.filter_mixins import ImageAttachmentFilterMixin, WeightFilterMixin from netbox.graphql.filters import ( - ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter, + ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter, NetBoxModelFilter, ) from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin from virtualization.models import VMInterface from .filter_mixins import ( CabledObjectModelFilterMixin, - ComponentModelFilter, - ComponentTemplateFilter, InterfaceBaseFilterMixin, - ModularComponentModelFilter, - ModularComponentTemplateFilter, - RackBaseFilter, RenderConfigFilterMixin, ) @@ -128,7 +127,7 @@ class CableTerminationFilter(ChangeLoggedModelFilter): @strawberry_django.filter_type(models.ConsolePort, lookups=True) -class ConsolePortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class ConsolePortFilter(ModularComponentTemplateFilterMixin, CabledObjectModelFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -138,14 +137,18 @@ class ConsolePortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixi @strawberry_django.filter_type(models.ConsolePortTemplate, lookups=True) -class ConsolePortTemplateFilter(ModularComponentTemplateFilter): +class ConsolePortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @strawberry_django.filter_type(models.ConsoleServerPort, lookups=True) -class ConsoleServerPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class ConsoleServerPortFilter( + ModularComponentTemplateFilterMixin, + CabledObjectModelFilterMixin, + ChangeLoggedModelFilter +): type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -155,7 +158,7 @@ class ConsoleServerPortFilter(ModularComponentModelFilter, CabledObjectModelFilt @strawberry_django.filter_type(models.ConsoleServerPortTemplate, lookups=True) -class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilter): +class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -281,7 +284,7 @@ class DeviceFilter( @strawberry_django.filter_type(models.DeviceBay, lookups=True) -class DeviceBayFilter(ComponentModelFilter): +class DeviceBayFilter(ComponentModelFilterMixin, NetBoxModelFilter): installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -289,12 +292,12 @@ class DeviceBayFilter(ComponentModelFilter): @strawberry_django.filter_type(models.DeviceBayTemplate, lookups=True) -class DeviceBayTemplateFilter(ComponentTemplateFilter): +class DeviceBayTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedModelFilter): pass @strawberry_django.filter_type(models.InventoryItemTemplate, lookups=True) -class InventoryItemTemplateFilter(ComponentTemplateFilter): +class InventoryItemTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedModelFilter): parent: Annotated['InventoryItemTemplateFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -398,7 +401,7 @@ class DeviceTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilter, WeightFil @strawberry_django.filter_type(models.FrontPort, lookups=True) -class FrontPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class FrontPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter): type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -415,7 +418,7 @@ class FrontPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin) @strawberry_django.filter_type(models.FrontPortTemplate, lookups=True) -class FrontPortTemplateFilter(ModularComponentTemplateFilter): +class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -459,7 +462,12 @@ class MACAddressFilter(PrimaryModelFilter): @strawberry_django.filter_type(models.Interface, lookups=True) -class InterfaceFilter(ModularComponentModelFilter, InterfaceBaseFilterMixin, CabledObjectModelFilterMixin): +class InterfaceFilter( + ModularComponentModelFilterMixin, + InterfaceBaseFilterMixin, + CabledObjectModelFilterMixin, + NetBoxModelFilter +): vcdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -549,7 +557,7 @@ class InterfaceFilter(ModularComponentModelFilter, InterfaceBaseFilterMixin, Cab @strawberry_django.filter_type(models.InterfaceTemplate, lookups=True) -class InterfaceTemplateFilter(ModularComponentTemplateFilter): +class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['InterfaceTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -571,7 +579,7 @@ class InterfaceTemplateFilter(ModularComponentTemplateFilter): @strawberry_django.filter_type(models.InventoryItem, lookups=True) -class InventoryItemFilter(ComponentModelFilter): +class InventoryItemFilter(ComponentModelFilterMixin, NetBoxModelFilter): parent: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -675,7 +683,7 @@ class ModuleFilter(PrimaryModelFilter, ConfigContextFilterMixin): @strawberry_django.filter_type(models.ModuleBay, lookups=True) -class ModuleBayFilter(ModularComponentModelFilter): +class ModuleBayFilter(ModularComponentModelFilterMixin, NetBoxModelFilter): parent: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -684,7 +692,7 @@ class ModuleBayFilter(ModularComponentModelFilter): @strawberry_django.filter_type(models.ModuleBayTemplate, lookups=True) -class ModuleBayTemplateFilter(ModularComponentTemplateFilter): +class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): position: FilterLookup[str] | None = strawberry_django.filter_field() @@ -792,7 +800,7 @@ class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryM @strawberry_django.filter_type(models.PowerOutlet, lookups=True) -class PowerOutletFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter): type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -812,7 +820,7 @@ class PowerOutletFilter(ModularComponentModelFilter, CabledObjectModelFilterMixi @strawberry_django.filter_type(models.PowerOutletTemplate, lookups=True) -class PowerOutletTemplateFilter(ModularComponentModelFilter): +class PowerOutletTemplateFilter(ModularComponentModelFilterMixin, NetBoxModelFilter): type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -839,7 +847,7 @@ class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryMo @strawberry_django.filter_type(models.PowerPort, lookups=True) -class PowerPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class PowerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter): type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -852,7 +860,7 @@ class PowerPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin) @strawberry_django.filter_type(models.PowerPortTemplate, lookups=True) -class PowerPortTemplateFilter(ModularComponentTemplateFilter): +class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -865,7 +873,7 @@ class PowerPortTemplateFilter(ModularComponentTemplateFilter): @strawberry_django.filter_type(models.RackType, lookups=True) -class RackTypeFilter(RackBaseFilter): +class RackTypeFilter(RackFilterMixin, WeightFilterMixin, PrimaryModelFilter): form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -880,7 +888,13 @@ class RackTypeFilter(RackBaseFilter): @strawberry_django.filter_type(models.Rack, lookups=True) -class RackFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, RackBaseFilter): +class RackFilter( + ContactFilterMixin, + ImageAttachmentFilterMixin, + TenancyFilterMixin, + RackFilterMixin, + PrimaryModelFilter +): form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -936,7 +950,7 @@ class RackRoleFilter(OrganizationalModelFilter): @strawberry_django.filter_type(models.RearPort, lookups=True) -class RearPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): +class RearPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter): type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -949,7 +963,7 @@ class RearPortFilter(ModularComponentModelFilter, CabledObjectModelFilterMixin): @strawberry_django.filter_type(models.RearPortTemplate, lookups=True) -class RearPortTemplateFilter(ModularComponentTemplateFilter): +class RearPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter): type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/extras/graphql/filter_mixins.py b/netbox/extras/graphql/filter_mixins.py index f990300ad..4b5636c0e 100644 --- a/netbox/extras/graphql/filter_mixins.py +++ b/netbox/extras/graphql/filter_mixins.py @@ -3,7 +3,6 @@ from typing import Annotated, TYPE_CHECKING import strawberry import strawberry_django -from strawberry_django import FilterLookup if TYPE_CHECKING: from netbox.graphql.filter_lookups import JSONFilter @@ -14,7 +13,6 @@ __all__ = ( 'JournalEntriesFilterMixin', 'TagsFilterMixin', 'ConfigContextFilterMixin', - 'TagBaseFilter', ) @@ -42,9 +40,3 @@ class ConfigContextFilterMixin: local_context_data: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) - - -@dataclass -class TagBaseFilter: - name: FilterLookup[str] | None = strawberry_django.filter_field() - slug: FilterLookup[str] | None = strawberry_django.filter_field() diff --git a/netbox/extras/graphql/filters.py b/netbox/extras/graphql/filters.py index 01080c290..12b773f03 100644 --- a/netbox/extras/graphql/filters.py +++ b/netbox/extras/graphql/filters.py @@ -6,7 +6,7 @@ from strawberry.scalars import ID from strawberry_django import BaseFilterLookup, FilterLookup from extras import models -from extras.graphql.filter_mixins import TagBaseFilter, CustomFieldsFilterMixin, TagsFilterMixin +from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin from netbox.graphql.filter_mixins import SyncedDataFilterMixin from netbox.graphql.filters import ChangeLoggedModelFilter, PrimaryModelFilter @@ -295,7 +295,9 @@ class TableConfigFilter(ChangeLoggedModelFilter): @strawberry_django.filter_type(models.Tag, lookups=True) -class TagFilter(ChangeLoggedModelFilter, TagBaseFilter): +class TagFilter(ChangeLoggedModelFilter): + name: FilterLookup[str] | None = strawberry_django.filter_field() + slug: FilterLookup[str] | None = strawberry_django.filter_field() color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/ipam/graphql/filter_mixins.py b/netbox/ipam/graphql/filter_mixins.py index 817f72100..36666f781 100644 --- a/netbox/ipam/graphql/filter_mixins.py +++ b/netbox/ipam/graphql/filter_mixins.py @@ -9,12 +9,12 @@ if TYPE_CHECKING: from .enums import * __all__ = ( - 'ServiceBaseFilterMixin', + 'ServiceFilterMixin', ) @dataclass -class ServiceBaseFilterMixin: +class ServiceFilterMixin: protocol: Annotated['ServiceProtocolEnum', strawberry.lazy('ipam.graphql.enums')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 7d0e22558..c1cca193e 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -12,7 +12,7 @@ from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup from dcim.graphql.filter_mixins import ScopedFilterMixin from dcim.models import Device from ipam import models -from ipam.graphql.filter_mixins import ServiceBaseFilterMixin +from ipam.graphql.filter_mixins import ServiceFilterMixin from netbox.graphql.filters import ( ChangeLoggedModelFilter, NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter, ) @@ -340,7 +340,7 @@ class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilter): @strawberry_django.filter_type(models.Service, lookups=True) -class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilter): +class ServiceFilter(ContactFilterMixin, ServiceFilterMixin, PrimaryModelFilter): name: FilterLookup[str] | None = strawberry_django.filter_field() ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = ( strawberry_django.filter_field() @@ -352,7 +352,7 @@ class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilt @strawberry_django.filter_type(models.ServiceTemplate, lookups=True) -class ServiceTemplateFilter(ServiceBaseFilterMixin, PrimaryModelFilter): +class ServiceTemplateFilter(ServiceFilterMixin, PrimaryModelFilter): name: FilterLookup[str] | None = strawberry_django.filter_field() diff --git a/netbox/virtualization/graphql/filter_mixins.py b/netbox/virtualization/graphql/filter_mixins.py index 134db4506..c387f4c4e 100644 --- a/netbox/virtualization/graphql/filter_mixins.py +++ b/netbox/virtualization/graphql/filter_mixins.py @@ -3,21 +3,19 @@ from typing import Annotated, TYPE_CHECKING import strawberry import strawberry_django -from strawberry import ID +from strawberry.scalars import ID from strawberry_django import FilterLookup -from netbox.graphql.filters import NetBoxModelFilter - if TYPE_CHECKING: from .filters import VirtualMachineFilter __all__ = ( - 'VMComponentFilter', + 'VMComponentFilterMixin', ) @dataclass -class VMComponentFilter(NetBoxModelFilter): +class VMComponentFilterMixin: virtual_machine: Annotated['VirtualMachineFilter', strawberry.lazy('virtualization.graphql.filters')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/virtualization/graphql/filters.py b/netbox/virtualization/graphql/filters.py index c202ab306..3bb71be6f 100644 --- a/netbox/virtualization/graphql/filters.py +++ b/netbox/virtualization/graphql/filters.py @@ -8,10 +8,10 @@ from strawberry_django import BaseFilterLookup, FilterLookup from dcim.graphql.filter_mixins import InterfaceBaseFilterMixin, RenderConfigFilterMixin, ScopedFilterMixin from extras.graphql.filter_mixins import ConfigContextFilterMixin from netbox.graphql.filter_mixins import ImageAttachmentFilterMixin -from netbox.graphql.filters import OrganizationalModelFilter, PrimaryModelFilter +from netbox.graphql.filters import NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin from virtualization import models -from virtualization.graphql.filter_mixins import VMComponentFilter +from virtualization.graphql.filter_mixins import VMComponentFilterMixin if TYPE_CHECKING: from .enums import * @@ -135,7 +135,7 @@ class VirtualMachineFilter( @strawberry_django.filter_type(models.VMInterface, lookups=True) -class VMInterfaceFilter(VMComponentFilter, InterfaceBaseFilterMixin): +class VMInterfaceFilter(InterfaceBaseFilterMixin, VMComponentFilterMixin, NetBoxModelFilter): ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -160,7 +160,7 @@ class VMInterfaceFilter(VMComponentFilter, InterfaceBaseFilterMixin): @strawberry_django.filter_type(models.VirtualDisk, lookups=True) -class VirtualDiskFilter(VMComponentFilter): +class VirtualDiskFilter(VMComponentFilterMixin, NetBoxModelFilter): size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/wireless/graphql/filter_mixins.py b/netbox/wireless/graphql/filter_mixins.py index d795209cf..d5b85425a 100644 --- a/netbox/wireless/graphql/filter_mixins.py +++ b/netbox/wireless/graphql/filter_mixins.py @@ -9,12 +9,12 @@ if TYPE_CHECKING: from .enums import * __all__ = ( - 'WirelessAuthenticationBaseFilterMixin', + 'WirelessAuthenticationFilterMixin', ) @dataclass -class WirelessAuthenticationBaseFilterMixin: +class WirelessAuthenticationFilterMixin: auth_type: Annotated['WirelessAuthTypeEnum', strawberry.lazy('wireless.graphql.enums')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/wireless/graphql/filters.py b/netbox/wireless/graphql/filters.py index d676ca89c..b1432ac8c 100644 --- a/netbox/wireless/graphql/filters.py +++ b/netbox/wireless/graphql/filters.py @@ -10,7 +10,7 @@ from netbox.graphql.filter_mixins import DistanceFilterMixin from netbox.graphql.filters import PrimaryModelFilter, NestedGroupModelFilter from tenancy.graphql.filter_mixins import TenancyFilterMixin from wireless import models -from .filter_mixins import WirelessAuthenticationBaseFilterMixin +from .filter_mixins import WirelessAuthenticationFilterMixin if TYPE_CHECKING: from dcim.graphql.filters import InterfaceFilter @@ -31,7 +31,7 @@ class WirelessLANGroupFilter(NestedGroupModelFilter): @strawberry_django.filter_type(models.WirelessLAN, lookups=True) class WirelessLANFilter( - WirelessAuthenticationBaseFilterMixin, + WirelessAuthenticationFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilter @@ -50,7 +50,7 @@ class WirelessLANFilter( @strawberry_django.filter_type(models.WirelessLink, lookups=True) class WirelessLinkFilter( - WirelessAuthenticationBaseFilterMixin, + WirelessAuthenticationFilterMixin, DistanceFilterMixin, TenancyFilterMixin, PrimaryModelFilter