Răsfoiți Sursa

Add filters for missing fields and for enums in filter_mixins files

Brian Tiemann 2 luni în urmă
părinte
comite
5143003c68

+ 11 - 0
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'))

+ 1 - 0
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()
     )

+ 8 - 3
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()
     )

+ 4 - 0
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'))

+ 14 - 7
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 = (

+ 6 - 1
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)

+ 3 - 3
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()
     )

+ 2 - 0
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'))

+ 5 - 0
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)

+ 2 - 0
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'))

+ 3 - 0
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)