From 5143003c684cfe8aedbd4cbaab5f207a8bbfb178 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 21 Nov 2025 10:36:54 -0500 Subject: [PATCH] Add filters for missing fields and for enums in filter_mixins files --- netbox/core/graphql/enums.py | 11 +++++++++++ netbox/core/graphql/filter_mixins.py | 1 + netbox/core/graphql/filters.py | 11 ++++++++--- netbox/dcim/graphql/enums.py | 4 ++++ netbox/dcim/graphql/filter_mixins.py | 21 ++++++++++++++------- netbox/dcim/graphql/filters.py | 7 ++++++- netbox/netbox/graphql/filter_mixins.py | 6 +++--- netbox/virtualization/graphql/enums.py | 2 ++ netbox/virtualization/graphql/filters.py | 5 +++++ netbox/vpn/graphql/enums.py | 2 ++ netbox/vpn/graphql/filters.py | 3 +++ 11 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 netbox/core/graphql/enums.py diff --git a/netbox/core/graphql/enums.py b/netbox/core/graphql/enums.py new file mode 100644 index 000000000..863382258 --- /dev/null +++ b/netbox/core/graphql/enums.py @@ -0,0 +1,11 @@ +import strawberry + +from core.choices import * + +__all__ = ( + 'DataSourceStatusEnum', + 'ObjectChangeActionEnum', +) + +DataSourceStatusEnum = strawberry.enum(DataSourceStatusChoices.as_enum(prefix='status')) +ObjectChangeActionEnum = strawberry.enum(ObjectChangeActionChoices.as_enum(prefix='action')) diff --git a/netbox/core/graphql/filter_mixins.py b/netbox/core/graphql/filter_mixins.py index 27d950d73..4d1f4fad5 100644 --- a/netbox/core/graphql/filter_mixins.py +++ b/netbox/core/graphql/filter_mixins.py @@ -29,6 +29,7 @@ class BaseObjectTypeFilterMixin(BaseFilterMixin): @dataclass class ChangeLogFilterMixin(BaseFilterMixin): id: FilterLookup[ID] | None = strawberry_django.filter_field() + # TODO: "changelog" is not a valid field name; needs to be updated for ObjectChange changelog: Annotated['ObjectChangeFilter', strawberry.lazy('core.graphql.filters')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/core/graphql/filters.py b/netbox/core/graphql/filters.py index 76ace2362..db42d4d59 100644 --- a/netbox/core/graphql/filters.py +++ b/netbox/core/graphql/filters.py @@ -5,11 +5,12 @@ import strawberry import strawberry_django from django.contrib.contenttypes.models import ContentType as DjangoContentType from strawberry.scalars import ID -from strawberry_django import DatetimeFilterLookup, FilterLookup +from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup from core import models from core.graphql.filter_mixins import BaseFilterMixin from netbox.graphql.filter_mixins import PrimaryModelFilterMixin +from .enums import * if TYPE_CHECKING: from netbox.graphql.filter_lookups import IntegerLookup, JSONFilter @@ -44,7 +45,9 @@ class DataSourceFilter(PrimaryModelFilterMixin): name: FilterLookup[str] | None = strawberry_django.filter_field() type: FilterLookup[str] | None = strawberry_django.filter_field() source_url: FilterLookup[str] | None = strawberry_django.filter_field() - status: FilterLookup[str] | None = strawberry_django.filter_field() + status: ( + BaseFilterLookup[Annotated['DataSourceStatusEnum', strawberry.lazy('core.graphql.enums')]] | None + ) = strawberry_django.filter_field() enabled: FilterLookup[bool] | None = strawberry_django.filter_field() ignore_rules: FilterLookup[str] | None = strawberry_django.filter_field() parameters: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( @@ -63,7 +66,9 @@ class ObjectChangeFilter(BaseFilterMixin): user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field() user_name: FilterLookup[str] | None = strawberry_django.filter_field() request_id: FilterLookup[str] | None = strawberry_django.filter_field() - action: FilterLookup[str] | None = strawberry_django.filter_field() + action: ( + BaseFilterLookup[Annotated['ObjectChangeActionEnum', strawberry.lazy('core.graphql.enums')]] | None + ) = strawberry_django.filter_field() changed_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/dcim/graphql/enums.py b/netbox/dcim/graphql/enums.py index 62a666b45..437094d72 100644 --- a/netbox/dcim/graphql/enums.py +++ b/netbox/dcim/graphql/enums.py @@ -28,11 +28,13 @@ __all__ = ( 'PowerFeedSupplyEnum', 'PowerFeedTypeEnum', 'PowerOutletFeedLegEnum', + 'PowerOutletStatusEnum', 'PowerOutletTypeEnum', 'PowerPortTypeEnum', 'RackAirflowEnum', 'RackDimensionUnitEnum', 'RackFormFactorEnum', + 'RackReservationStatusEnum', 'RackStatusEnum', 'RackWidthEnum', 'SiteStatusEnum', @@ -65,11 +67,13 @@ PowerFeedStatusEnum = strawberry.enum(PowerFeedStatusChoices.as_enum(prefix='sta PowerFeedSupplyEnum = strawberry.enum(PowerFeedSupplyChoices.as_enum(prefix='supply')) PowerFeedTypeEnum = strawberry.enum(PowerFeedTypeChoices.as_enum(prefix='type')) PowerOutletFeedLegEnum = strawberry.enum(PowerOutletFeedLegChoices.as_enum(prefix='feed_leg')) +PowerOutletStatusEnum = strawberry.enum(PowerOutletStatusChoices.as_enum(prefix='status')) PowerOutletTypeEnum = strawberry.enum(PowerOutletTypeChoices.as_enum(prefix='type')) PowerPortTypeEnum = strawberry.enum(PowerPortTypeChoices.as_enum(prefix='type')) RackAirflowEnum = strawberry.enum(RackAirflowChoices.as_enum()) RackDimensionUnitEnum = strawberry.enum(RackDimensionUnitChoices.as_enum(prefix='unit')) RackFormFactorEnum = strawberry.enum(RackFormFactorChoices.as_enum(prefix='type')) +RackReservationStatusEnum = strawberry.enum(RackReservationStatusChoices.as_enum(prefix='status')) RackStatusEnum = strawberry.enum(RackStatusChoices.as_enum(prefix='status')) RackWidthEnum = strawberry.enum(RackWidthChoices.as_enum(prefix='width')) SiteStatusEnum = strawberry.enum(SiteStatusChoices.as_enum(prefix='status')) diff --git a/netbox/dcim/graphql/filter_mixins.py b/netbox/dcim/graphql/filter_mixins.py index 25379ad7f..c05eec1f5 100644 --- a/netbox/dcim/graphql/filter_mixins.py +++ b/netbox/dcim/graphql/filter_mixins.py @@ -4,7 +4,7 @@ from typing import Annotated, TYPE_CHECKING import strawberry import strawberry_django from strawberry import ID -from strawberry_django import FilterLookup +from strawberry_django import BaseFilterLookup, FilterLookup from core.graphql.filter_mixins import BaseFilterMixin, ChangeLogFilterMixin from core.graphql.filters import ContentTypeFilter @@ -60,7 +60,9 @@ class ModularComponentModelFilterMixin(ComponentModelFilterMixin): class CabledObjectModelFilterMixin(BaseFilterMixin): cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field() cable_id: ID | None = strawberry_django.filter_field() - cable_end: CableEndEnum | None = strawberry_django.filter_field() + cable_end: ( + BaseFilterLookup[Annotated['CableEndEnum', strawberry.lazy('dcim.graphql.enums')]] | None + ) = strawberry_django.filter_field() mark_connected: FilterLookup[bool] | None = strawberry_django.filter_field() @@ -96,7 +98,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin): mtu: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) - mode: InterfaceModeEnum | None = strawberry_django.filter_field() + mode: ( + BaseFilterLookup[Annotated['InterfaceModeEnum', strawberry.lazy('dcim.graphql.enums')]] | None + ) = strawberry_django.filter_field() bridge: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -110,8 +114,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin): qinq_svlan: Annotated['VLANFilter', strawberry.lazy('ipam.graphql.filters')] | None = ( strawberry_django.filter_field() ) - vlan_translation_policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None \ - = strawberry_django.filter_field() + vlan_translation_policy: ( + Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None + ) = strawberry_django.filter_field() primary_mac_address: Annotated['MACAddressFilter', strawberry.lazy('dcim.graphql.filters')] | None = ( strawberry_django.filter_field() ) @@ -120,7 +125,9 @@ class InterfaceBaseFilterMixin(BaseFilterMixin): @dataclass class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin): - width: Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field() + width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( + strawberry_django.filter_field() + ) u_height: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) @@ -137,7 +144,7 @@ class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin): outer_depth: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( strawberry_django.filter_field() ) - outer_unit: Annotated['RackDimensionUnitEnum', strawberry.lazy('dcim.graphql.enums')] | None = ( + outer_unit: BaseFilterLookup[Annotated['RackDimensionUnitEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( strawberry_django.filter_field() ) mounting_depth: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index de156b55b..a6d076410 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -1,6 +1,5 @@ from typing import Annotated, TYPE_CHECKING -from django.db.models import Q import strawberry import strawberry_django from strawberry.scalars import ID @@ -810,6 +809,9 @@ class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilte color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = ( strawberry_django.filter_field() ) + status: BaseFilterLookup[Annotated['PowerOutletStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( + strawberry_django.filter_field() + ) @strawberry_django.filter_type(models.PowerOutletTemplate, lookups=True) @@ -924,6 +926,9 @@ class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilterMixin): user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field() user_id: ID | None = strawberry_django.filter_field() description: FilterLookup[str] | None = strawberry_django.filter_field() + status: BaseFilterLookup[Annotated['RackReservationStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = ( + strawberry_django.filter_field() + ) @strawberry_django.filter_type(models.RackRole, lookups=True) diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index b77238325..cb9fcffe7 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -5,7 +5,7 @@ from typing import TypeVar, TYPE_CHECKING, Annotated import strawberry import strawberry_django from strawberry import ID -from strawberry_django import FilterLookup, DatetimeFilterLookup +from strawberry_django import BaseFilterLookup, FilterLookup, DatetimeFilterLookup from core.graphql.filter_mixins import BaseFilterMixin, BaseObjectTypeFilterMixin, ChangeLogFilterMixin from extras.graphql.filter_mixins import CustomFieldsFilterMixin, JournalEntriesFilterMixin, TagsFilterMixin @@ -76,7 +76,7 @@ class ImageAttachmentFilterMixin(BaseFilterMixin): @dataclass class WeightFilterMixin(BaseFilterMixin): weight: FilterLookup[float] | None = strawberry_django.filter_field() - weight_unit: Annotated['WeightUnitEnum', strawberry.lazy('netbox.graphql.enums')] | None = ( + weight_unit: BaseFilterLookup[Annotated['WeightUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = ( strawberry_django.filter_field() ) @@ -99,6 +99,6 @@ class SyncedDataFilterMixin(BaseFilterMixin): @dataclass class DistanceFilterMixin(BaseFilterMixin): distance: FilterLookup[float] | None = strawberry_django.filter_field() - distance_unit: Annotated['DistanceUnitEnum', strawberry.lazy('netbox.graphql.enums')] | None = ( + distance_unit: BaseFilterLookup[Annotated['DistanceUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = ( strawberry_django.filter_field() ) diff --git a/netbox/virtualization/graphql/enums.py b/netbox/virtualization/graphql/enums.py index 3c7ebad8a..7a67e6868 100644 --- a/netbox/virtualization/graphql/enums.py +++ b/netbox/virtualization/graphql/enums.py @@ -5,7 +5,9 @@ from virtualization.choices import * __all__ = ( 'ClusterStatusEnum', 'VirtualMachineStatusEnum', + 'VirtualMachineStatusEnum', ) ClusterStatusEnum = strawberry.enum(ClusterStatusChoices.as_enum(prefix='status')) +VirtualMachineStartOnBootEnum = strawberry.enum(VirtualMachineStartOnBootChoices.as_enum(prefix='start_on_boot')) VirtualMachineStatusEnum = strawberry.enum(VirtualMachineStatusChoices.as_enum(prefix='status')) diff --git a/netbox/virtualization/graphql/filters.py b/netbox/virtualization/graphql/filters.py index 5b29e362a..ad8e40ee5 100644 --- a/netbox/virtualization/graphql/filters.py +++ b/netbox/virtualization/graphql/filters.py @@ -130,6 +130,11 @@ class VirtualMachineFilter( virtual_disks: Annotated['VirtualDiskFilter', strawberry.lazy('virtualization.graphql.filters')] | None = ( strawberry_django.filter_field() ) + start_on_boot: ( + BaseFilterLookup[Annotated['VirtualMachineStartOnBootEnum', strawberry.lazy('virtualization.graphql.enums')] + ] | None) = ( + strawberry_django.filter_field() + ) @strawberry_django.filter_type(models.VMInterface, lookups=True) diff --git a/netbox/vpn/graphql/enums.py b/netbox/vpn/graphql/enums.py index 518528b83..5007386c2 100644 --- a/netbox/vpn/graphql/enums.py +++ b/netbox/vpn/graphql/enums.py @@ -10,6 +10,7 @@ __all__ = ( 'IKEModeEnum', 'IKEVersionEnum', 'IPSecModeEnum', + 'L2VPNStatusEnum', 'L2VPNTypeEnum', 'TunnelEncapsulationEnum', 'TunnelStatusEnum', @@ -24,6 +25,7 @@ EncryptionAlgorithmEnum = strawberry.enum(EncryptionAlgorithmChoices.as_enum(pre IKEModeEnum = strawberry.enum(IKEModeChoices.as_enum()) IKEVersionEnum = strawberry.enum(IKEVersionChoices.as_enum(prefix='version')) IPSecModeEnum = strawberry.enum(IPSecModeChoices.as_enum()) +L2VPNStatusEnum = strawberry.enum(L2VPNStatusChoices.as_enum(prefix='status')) L2VPNTypeEnum = strawberry.enum(L2VPNTypeChoices.as_enum(prefix='type')) TunnelEncapsulationEnum = strawberry.enum(TunnelEncapsulationChoices.as_enum(prefix='encap')) TunnelStatusEnum = strawberry.enum(TunnelStatusChoices.as_enum(prefix='status')) diff --git a/netbox/vpn/graphql/filters.py b/netbox/vpn/graphql/filters.py index 7955550c9..403ece3b3 100644 --- a/netbox/vpn/graphql/filters.py +++ b/netbox/vpn/graphql/filters.py @@ -200,6 +200,9 @@ class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixi terminations: Annotated['L2VPNTerminationFilter', strawberry.lazy('vpn.graphql.filters')] | None = ( strawberry_django.filter_field() ) + status: BaseFilterLookup[Annotated['L2VPNStatusEnum', strawberry.lazy('vpn.graphql.enums')]] | None = ( + strawberry_django.filter_field() + ) @strawberry_django.filter_type(models.L2VPNTermination, lookups=True)