types.py 5.8 KB

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