Coverage for circuits/graphql/types.py: 90%
47 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from typing import TYPE_CHECKING, Annotated
3import strawberry
4import strawberry_django
6from circuits import models
7from dcim.graphql.mixins import CabledObjectMixin
8from dcim.models import Location, Region, Site, SiteGroup
9from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
10from netbox.graphql.optimization import build_gfk_prefetch
11from netbox.graphql.types import BaseObjectType, ObjectType, OrganizationalObjectType, PrimaryObjectType, register_type
12from tenancy.graphql.types import TenantType
14from .filters import *
16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true
17 from dcim.graphql.types import InterfaceType, LocationType, RegionType, SiteGroupType, SiteType
18 from ipam.graphql.types import ASNType
20__all__ = (
21 'CircuitGroupAssignmentType',
22 'CircuitGroupType',
23 'CircuitTerminationType',
24 'CircuitType',
25 'CircuitTypeType',
26 'ProviderAccountType',
27 'ProviderNetworkType',
28 'ProviderType',
29 'VirtualCircuitTerminationType',
30 'VirtualCircuitType',
31 'VirtualCircuitTypeType',
32)
35@register_type(
36 models.Provider,
37 fields='__all__',
38 filters=ProviderFilter,
39 pagination=True
40)
41class ProviderType(ContactsMixin, PrimaryObjectType):
42 networks: list[Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')]]
43 circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
44 asns: list[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
45 accounts: list[Annotated["ProviderAccountType", strawberry.lazy('circuits.graphql.types')]]
48@register_type(
49 models.ProviderAccount,
50 fields='__all__',
51 filters=ProviderAccountFilter,
52 pagination=True
53)
54class ProviderAccountType(ContactsMixin, PrimaryObjectType):
55 provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
56 circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
59@register_type(
60 models.ProviderNetwork,
61 fields='__all__',
62 filters=ProviderNetworkFilter,
63 pagination=True
64)
65class ProviderNetworkType(PrimaryObjectType):
66 provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
67 circuit_terminations: list[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]
70@register_type(
71 models.CircuitTermination,
72 exclude=['termination_type', 'termination_id', '_location', '_region', '_site', '_site_group', '_provider_network'],
73 filters=CircuitTerminationFilter,
74 pagination=True
75)
76class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType):
77 circuit: Annotated['CircuitType', strawberry.lazy('circuits.graphql.types')]
79 @strawberry_django.field(
80 prefetch_related=build_gfk_prefetch(
81 'termination',
82 [
83 Location,
84 Region,
85 SiteGroup,
86 Site,
87 models.ProviderNetwork,
88 ],
89 ),
90 only=['termination_type', 'termination_id'],
91 )
92 def termination(self) -> Annotated[
93 Annotated['LocationType', strawberry.lazy('dcim.graphql.types')]
94 | Annotated['RegionType', strawberry.lazy('dcim.graphql.types')]
95 | Annotated['SiteGroupType', strawberry.lazy('dcim.graphql.types')]
96 | Annotated['SiteType', strawberry.lazy('dcim.graphql.types')]
97 | Annotated['ProviderNetworkType', strawberry.lazy('circuits.graphql.types')],
98 strawberry.union('CircuitTerminationTerminationType'),
99 ] | None:
100 return self.termination
103@register_type(
104 models.CircuitType,
105 fields='__all__',
106 filters=CircuitTypeFilter,
107 pagination=True
108)
109class CircuitTypeType(OrganizationalObjectType):
110 color: str
112 circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
115@register_type(
116 models.Circuit,
117 fields='__all__',
118 filters=CircuitFilter,
119 pagination=True
120)
121class CircuitType(PrimaryObjectType, ContactsMixin):
122 provider: ProviderType
123 provider_account: ProviderAccountType | None
124 termination_a: CircuitTerminationType | None
125 termination_z: CircuitTerminationType | None
126 type: CircuitTypeType
127 tenant: TenantType | None
128 terminations: list[CircuitTerminationType]
131@register_type(
132 models.CircuitGroup,
133 fields='__all__',
134 filters=CircuitGroupFilter,
135 pagination=True
136)
137class CircuitGroupType(OrganizationalObjectType):
138 tenant: TenantType | None
141@register_type(
142 models.CircuitGroupAssignment,
143 exclude=['member_type', 'member_id'],
144 filters=CircuitGroupAssignmentFilter,
145 pagination=True
146)
147class CircuitGroupAssignmentType(TagsMixin, BaseObjectType):
148 group: Annotated['CircuitGroupType', strawberry.lazy('circuits.graphql.types')]
150 @strawberry_django.field(
151 prefetch_related=build_gfk_prefetch(
152 'member',
153 [
154 models.Circuit,
155 models.VirtualCircuit,
156 ],
157 ),
158 only=['member_type', 'member_id'],
159 )
160 def member(self) -> Annotated[
161 Annotated['CircuitType', strawberry.lazy('circuits.graphql.types')]
162 | Annotated['VirtualCircuitType', strawberry.lazy('circuits.graphql.types')],
163 strawberry.union('CircuitGroupAssignmentMemberType'),
164 ] | None:
165 return self.member
168@register_type(
169 models.VirtualCircuitType,
170 fields='__all__',
171 filters=VirtualCircuitTypeFilter,
172 pagination=True
173)
174class VirtualCircuitTypeType(OrganizationalObjectType):
175 color: str
177 virtual_circuits: list[Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')]]
180@register_type(
181 models.VirtualCircuitTermination,
182 fields='__all__',
183 filters=VirtualCircuitTerminationFilter,
184 pagination=True
185)
186class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
187 virtual_circuit: Annotated[
188 "VirtualCircuitType",
189 strawberry.lazy('circuits.graphql.types')
190 ] = strawberry_django.field(select_related=["virtual_circuit"])
191 interface: Annotated[
192 "InterfaceType",
193 strawberry.lazy('dcim.graphql.types')
194 ] = strawberry_django.field(select_related=["interface"])
197@register_type(
198 models.VirtualCircuit,
199 fields='__all__',
200 filters=VirtualCircuitFilter,
201 pagination=True
202)
203class VirtualCircuitType(ContactsMixin, PrimaryObjectType):
204 provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"])
205 provider_account: ProviderAccountType | None
206 type: Annotated["VirtualCircuitTypeType", strawberry.lazy('circuits.graphql.types')] = strawberry_django.field(
207 select_related=["type"]
208 )
209 tenant: TenantType | None
210 terminations: list[VirtualCircuitTerminationType]