types.py 5.6 KB

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