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

1from typing import TYPE_CHECKING, Annotated 

2 

3import strawberry 

4import strawberry_django 

5 

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 

13 

14from .filters import * 

15 

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 

19 

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) 

33 

34 

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')]] 

46 

47 

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')]] 

57 

58 

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')]] 

68 

69 

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')] 

78 

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 

101 

102 

103@register_type( 

104 models.CircuitType, 

105 fields='__all__', 

106 filters=CircuitTypeFilter, 

107 pagination=True 

108) 

109class CircuitTypeType(OrganizationalObjectType): 

110 color: str 

111 

112 circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]] 

113 

114 

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] 

129 

130 

131@register_type( 

132 models.CircuitGroup, 

133 fields='__all__', 

134 filters=CircuitGroupFilter, 

135 pagination=True 

136) 

137class CircuitGroupType(OrganizationalObjectType): 

138 tenant: TenantType | None 

139 

140 

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')] 

149 

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 

166 

167 

168@register_type( 

169 models.VirtualCircuitType, 

170 fields='__all__', 

171 filters=VirtualCircuitTypeFilter, 

172 pagination=True 

173) 

174class VirtualCircuitTypeType(OrganizationalObjectType): 

175 color: str 

176 

177 virtual_circuits: list[Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')]] 

178 

179 

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"]) 

195 

196 

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]