types.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. from typing import TYPE_CHECKING, Annotated
  2. import strawberry
  3. import strawberry_django
  4. from circuits import models
  5. from dcim.graphql.mixins import CabledObjectMixin
  6. from dcim.models import Location, Region, Site, SiteGroup
  7. from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
  8. from netbox.graphql.optimization import build_gfk_prefetch
  9. from netbox.graphql.types import BaseObjectType, ObjectType, OrganizationalObjectType, PrimaryObjectType, register_type
  10. from tenancy.graphql.types import TenantType
  11. from .filters import *
  12. if TYPE_CHECKING:
  13. from dcim.graphql.types import InterfaceType, LocationType, RegionType, SiteGroupType, SiteType
  14. from ipam.graphql.types import ASNType
  15. __all__ = (
  16. 'CircuitGroupAssignmentType',
  17. 'CircuitGroupType',
  18. 'CircuitTerminationType',
  19. 'CircuitType',
  20. 'CircuitTypeType',
  21. 'ProviderAccountType',
  22. 'ProviderNetworkType',
  23. 'ProviderType',
  24. 'VirtualCircuitTerminationType',
  25. 'VirtualCircuitType',
  26. 'VirtualCircuitTypeType',
  27. )
  28. @register_type(
  29. models.Provider,
  30. fields='__all__',
  31. filters=ProviderFilter,
  32. pagination=True
  33. )
  34. class ProviderType(ContactsMixin, PrimaryObjectType):
  35. networks: list[Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')]]
  36. circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  37. asns: list[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
  38. accounts: list[Annotated["ProviderAccountType", strawberry.lazy('circuits.graphql.types')]]
  39. @register_type(
  40. models.ProviderAccount,
  41. fields='__all__',
  42. filters=ProviderAccountFilter,
  43. pagination=True
  44. )
  45. class ProviderAccountType(ContactsMixin, PrimaryObjectType):
  46. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  47. circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  48. @register_type(
  49. models.ProviderNetwork,
  50. fields='__all__',
  51. filters=ProviderNetworkFilter,
  52. pagination=True
  53. )
  54. class ProviderNetworkType(PrimaryObjectType):
  55. provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
  56. circuit_terminations: list[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]
  57. @register_type(
  58. models.CircuitTermination,
  59. exclude=['termination_type', 'termination_id', '_location', '_region', '_site', '_site_group', '_provider_network'],
  60. filters=CircuitTerminationFilter,
  61. pagination=True
  62. )
  63. class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType):
  64. circuit: Annotated['CircuitType', strawberry.lazy('circuits.graphql.types')]
  65. @strawberry_django.field(
  66. prefetch_related=build_gfk_prefetch(
  67. 'termination',
  68. [
  69. Location,
  70. Region,
  71. SiteGroup,
  72. Site,
  73. models.ProviderNetwork,
  74. ],
  75. ),
  76. only=['termination_type', 'termination_id'],
  77. )
  78. def termination(self) -> Annotated[
  79. Annotated['LocationType', strawberry.lazy('dcim.graphql.types')]
  80. | Annotated['RegionType', strawberry.lazy('dcim.graphql.types')]
  81. | Annotated['SiteGroupType', strawberry.lazy('dcim.graphql.types')]
  82. | Annotated['SiteType', strawberry.lazy('dcim.graphql.types')]
  83. | Annotated['ProviderNetworkType', strawberry.lazy('circuits.graphql.types')],
  84. strawberry.union('CircuitTerminationTerminationType'),
  85. ] | None:
  86. return self.termination
  87. @register_type(
  88. models.CircuitType,
  89. fields='__all__',
  90. filters=CircuitTypeFilter,
  91. pagination=True
  92. )
  93. class CircuitTypeType(OrganizationalObjectType):
  94. color: str
  95. circuits: list[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
  96. @register_type(
  97. models.Circuit,
  98. fields='__all__',
  99. filters=CircuitFilter,
  100. pagination=True
  101. )
  102. class CircuitType(PrimaryObjectType, ContactsMixin):
  103. provider: ProviderType
  104. provider_account: ProviderAccountType | None
  105. termination_a: CircuitTerminationType | None
  106. termination_z: CircuitTerminationType | None
  107. type: CircuitTypeType
  108. tenant: TenantType | None
  109. terminations: list[CircuitTerminationType]
  110. @register_type(
  111. models.CircuitGroup,
  112. fields='__all__',
  113. filters=CircuitGroupFilter,
  114. pagination=True
  115. )
  116. class CircuitGroupType(OrganizationalObjectType):
  117. tenant: TenantType | None
  118. @register_type(
  119. models.CircuitGroupAssignment,
  120. exclude=['member_type', 'member_id'],
  121. filters=CircuitGroupAssignmentFilter,
  122. pagination=True
  123. )
  124. class CircuitGroupAssignmentType(CustomFieldsMixin, TagsMixin, BaseObjectType):
  125. group: Annotated['CircuitGroupType', strawberry.lazy('circuits.graphql.types')]
  126. @strawberry_django.field(
  127. prefetch_related=build_gfk_prefetch(
  128. 'member',
  129. [
  130. models.Circuit,
  131. models.VirtualCircuit,
  132. ],
  133. ),
  134. only=['member_type', 'member_id'],
  135. )
  136. def member(self) -> Annotated[
  137. Annotated['CircuitType', strawberry.lazy('circuits.graphql.types')]
  138. | Annotated['VirtualCircuitType', strawberry.lazy('circuits.graphql.types')],
  139. strawberry.union('CircuitGroupAssignmentMemberType'),
  140. ] | None:
  141. return self.member
  142. @register_type(
  143. models.VirtualCircuitType,
  144. fields='__all__',
  145. filters=VirtualCircuitTypeFilter,
  146. pagination=True
  147. )
  148. class VirtualCircuitTypeType(OrganizationalObjectType):
  149. color: str
  150. virtual_circuits: list[Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')]]
  151. @register_type(
  152. models.VirtualCircuitTermination,
  153. fields='__all__',
  154. filters=VirtualCircuitTerminationFilter,
  155. pagination=True
  156. )
  157. class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
  158. virtual_circuit: Annotated[
  159. "VirtualCircuitType",
  160. strawberry.lazy('circuits.graphql.types')
  161. ] = strawberry_django.field(select_related=["virtual_circuit"])
  162. interface: Annotated[
  163. "InterfaceType",
  164. strawberry.lazy('dcim.graphql.types')
  165. ] = strawberry_django.field(select_related=["interface"])
  166. @register_type(
  167. models.VirtualCircuit,
  168. fields='__all__',
  169. filters=VirtualCircuitFilter,
  170. pagination=True
  171. )
  172. class VirtualCircuitType(ContactsMixin, PrimaryObjectType):
  173. provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"])
  174. provider_account: ProviderAccountType | None
  175. type: Annotated["VirtualCircuitTypeType", strawberry.lazy('circuits.graphql.types')] = strawberry_django.field(
  176. select_related=["type"]
  177. )
  178. tenant: TenantType | None
  179. terminations: list[VirtualCircuitTerminationType]