diff --git a/netbox/core/graphql/types.py b/netbox/core/graphql/types.py index f4f1ebd46..636c322e4 100644 --- a/netbox/core/graphql/types.py +++ b/netbox/core/graphql/types.py @@ -1,3 +1,5 @@ +from typing import Annotated, List + import strawberry import strawberry_django @@ -27,4 +29,7 @@ class DataFileType(BaseObjectType): filters=DataSourceFilter ) class DataSourceType(NetBoxObjectType): - pass + + @strawberry_django.field + def datafiles(self) -> List[Annotated["DataFileType", strawberry.lazy('core.graphql.types')]]: + return self.datafiles.all() diff --git a/netbox/dcim/graphql/gfk_mixins.py b/netbox/dcim/graphql/gfk_mixins.py index 547cf24bc..8bd435284 100644 --- a/netbox/dcim/graphql/gfk_mixins.py +++ b/netbox/dcim/graphql/gfk_mixins.py @@ -40,7 +40,7 @@ from dcim.models import ( ) -class InventoryItemTemplateComponentType(graphene.Union): +class InventoryItemTemplateComponentType: class Meta: types = ( ConsolePortTemplateType, @@ -70,7 +70,7 @@ class InventoryItemTemplateComponentType(graphene.Union): return RearPortTemplateType -class InventoryItemComponentType(graphene.Union): +class InventoryItemComponentType: class Meta: types = ( ConsolePortType, @@ -100,7 +100,7 @@ class InventoryItemComponentType(graphene.Union): return RearPortType -class ConnectedEndpointType(graphene.Union): +class ConnectedEndpointType: class Meta: types = ( CircuitTerminationType, diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index b92c82e6f..ac7134e56 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -215,6 +215,74 @@ class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBo def resolve_airflow(self, info): return self.airflow or None + @strawberry_django.field + def devicebays(self) -> List[Annotated["DeviceBayType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def vc_master_for(self) -> Annotated["VirtualChassisType", strawberry.lazy('dcim.graphql.types')]: + return self.vc_master_for + + @strawberry_django.field + def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]: + return self.virtual_machines.all() + + @strawberry_django.field + def modules(self) -> List[Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')]]: + return self.modules.all() + + @strawberry_django.field + def parent_bay(self) -> Annotated["DeviceBayType", strawberry.lazy('dcim.graphql.types')]: + return self.parent_bay + + @strawberry_django.field + def interfaces(self) -> List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def rearports(self) -> List[Annotated["RearPortType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def consoleports(self) -> List[Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def powerports(self) -> List[Annotated["PowerPortType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def cabletermination_set(self) -> List[Annotated["CableTerminationType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def consoleserverports(self) -> List[Annotated["ConsoleServerPortType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def poweroutlets(self) -> List[Annotated["PowerOutletType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def frontports(self) -> List[Annotated["FrontPortType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def modulebays(self) -> List[Annotated["ModuleBayType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def services(self) -> List[Annotated["ServiceType", strawberry.lazy('ipam.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def inventoryitems(self) -> List[Annotated["InventoryItemType", strawberry.lazy('dcim.graphql.types')]]: + return self.clusters.all() + + @strawberry_django.field + def vdcs(self) -> List[Annotated["VirtualDeviceContextType", strawberry.lazy('dcim.graphql.types')]]: + return self.vdcs.all() + @strawberry_django.type( models.DeviceBay, @@ -250,7 +318,15 @@ class InventoryItemTemplateType(ComponentTemplateObjectType): filters=DeviceRoleFilter ) class DeviceRoleType(OrganizationalObjectType): - pass + color: str + + @strawberry_django.field + def virtual_machines(self) -> List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]: + return self.virtual_machines.all() + + @strawberry_django.field + def devices(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]: + return self.devices.all() @strawberry_django.type( @@ -279,6 +355,50 @@ class DeviceTypeType(NetBoxObjectType): def resolve_weight_unit(self, info): return self.weight_unit or None + @strawberry_django.field + def frontporttemplates(self) -> List[Annotated["FrontPortTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def modulebaytemplates(self) -> List[Annotated["ModuleBayTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def instances(self) -> List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def poweroutlettemplates(self) -> List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def powerporttemplates(self) -> List[Annotated["PowerPortTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def inventoryitemtemplates(self) -> List[Annotated["InventoryItemTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def rearporttemplates(self) -> List[Annotated["RearPortTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def consoleserverporttemplates(self) -> List[Annotated["ConsoleServerPortTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def interfacetemplates(self) -> List[Annotated["InterfaceTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def devicebaytemplates(self) -> List[Annotated["DeviceBayTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + + @strawberry_django.field + def consoleporttemplates(self) -> List[Annotated["ConsolePortTemplateType", strawberry.lazy('dcim.graphql.types')]]: + return self.device_bays.all() + @strawberry_django.type( models.FrontPort, diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 2056d01ee..a66dd2cba 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -130,7 +130,14 @@ class CustomFieldType(ObjectType): filters=CustomFieldChoiceSetFilter ) class CustomFieldChoiceSetType(ObjectType): - pass + + @strawberry_django.field + def choices_for(self) -> List[Annotated["CustomFieldType", strawberry.lazy('extras.graphql.types')]]: + return self.assignments.all() + + @strawberry_django.field + def extra_choices(self) -> List[str]: + return self.assignments.all() @strawberry_django.type( diff --git a/netbox/tenancy/graphql/types.py b/netbox/tenancy/graphql/types.py index 307a9000d..828a36930 100644 --- a/netbox/tenancy/graphql/types.py +++ b/netbox/tenancy/graphql/types.py @@ -1,3 +1,5 @@ +from typing import Annotated, List + import strawberry import strawberry_django @@ -56,7 +58,10 @@ class TenantGroupType(OrganizationalObjectType): filters=ContactFilter ) class ContactType(ContactAssignmentsMixin, NetBoxObjectType): - pass + + @strawberry_django.field + def assignments(self) -> List[Annotated["ContactAssignmentType", strawberry.lazy('tenancy.graphql.types')]]: + return self.assignments.all() @strawberry_django.type( @@ -65,7 +70,10 @@ class ContactType(ContactAssignmentsMixin, NetBoxObjectType): filters=ContactRoleFilter ) class ContactRoleType(ContactAssignmentsMixin, OrganizationalObjectType): - pass + + @strawberry_django.field + def assignments(self) -> List[Annotated["ContactAssignmentType", strawberry.lazy('tenancy.graphql.types')]]: + return self.assignments.all() @strawberry_django.type( @@ -75,7 +83,18 @@ class ContactRoleType(ContactAssignmentsMixin, OrganizationalObjectType): filters=ContactGroupFilter ) class ContactGroupType(OrganizationalObjectType): - pass + + @strawberry_django.field + def parent(self) -> Annotated["ContactGroupType", strawberry.lazy('tenancy.graphql.types')]: + return self.parent + + @strawberry_django.field + def contacts(self) -> List[ContactType]: + return self.clusters.all() + + @strawberry_django.field + def children(self) -> List[Annotated["ContactGroupType", strawberry.lazy('tenancy.graphql.types')]]: + return self.children.all() @strawberry_django.type(