nested_serializers.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. from drf_spectacular.utils import extend_schema_serializer
  2. from rest_framework import serializers
  3. from ipam import models
  4. from netbox.api.fields import RelatedObjectCountField
  5. from netbox.api.serializers import WritableNestedSerializer
  6. from .field_serializers import IPAddressField
  7. __all__ = [
  8. 'NestedAggregateSerializer',
  9. 'NestedASNSerializer',
  10. 'NestedASNRangeSerializer',
  11. 'NestedFHRPGroupSerializer',
  12. 'NestedFHRPGroupAssignmentSerializer',
  13. 'NestedIPAddressSerializer',
  14. 'NestedIPRangeSerializer',
  15. 'NestedPrefixSerializer',
  16. 'NestedRIRSerializer',
  17. 'NestedRoleSerializer',
  18. 'NestedRouteTargetSerializer',
  19. 'NestedServiceSerializer',
  20. 'NestedServiceTemplateSerializer',
  21. 'NestedVLANGroupSerializer',
  22. 'NestedVLANSerializer',
  23. 'NestedVRFSerializer',
  24. ]
  25. #
  26. # ASN ranges
  27. #
  28. class NestedASNRangeSerializer(WritableNestedSerializer):
  29. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail')
  30. class Meta:
  31. model = models.ASNRange
  32. fields = ['id', 'url', 'display', 'name']
  33. #
  34. # ASNs
  35. #
  36. class NestedASNSerializer(WritableNestedSerializer):
  37. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail')
  38. class Meta:
  39. model = models.ASN
  40. fields = ['id', 'url', 'display', 'asn']
  41. #
  42. # VRFs
  43. #
  44. @extend_schema_serializer(
  45. exclude_fields=('prefix_count',),
  46. )
  47. class NestedVRFSerializer(WritableNestedSerializer):
  48. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail')
  49. prefix_count = RelatedObjectCountField('prefixes')
  50. class Meta:
  51. model = models.VRF
  52. fields = ['id', 'url', 'display', 'name', 'rd', 'prefix_count']
  53. #
  54. # Route targets
  55. #
  56. class NestedRouteTargetSerializer(WritableNestedSerializer):
  57. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail')
  58. class Meta:
  59. model = models.RouteTarget
  60. fields = ['id', 'url', 'display', 'name']
  61. #
  62. # RIRs/aggregates
  63. #
  64. @extend_schema_serializer(
  65. exclude_fields=('aggregate_count',),
  66. )
  67. class NestedRIRSerializer(WritableNestedSerializer):
  68. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
  69. aggregate_count = RelatedObjectCountField('aggregates')
  70. class Meta:
  71. model = models.RIR
  72. fields = ['id', 'url', 'display', 'name', 'slug', 'aggregate_count']
  73. class NestedAggregateSerializer(WritableNestedSerializer):
  74. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail')
  75. family = serializers.IntegerField(read_only=True)
  76. class Meta:
  77. model = models.Aggregate
  78. fields = ['id', 'url', 'display', 'family', 'prefix']
  79. #
  80. # FHRP groups
  81. #
  82. class NestedFHRPGroupSerializer(WritableNestedSerializer):
  83. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail')
  84. class Meta:
  85. model = models.FHRPGroup
  86. fields = ['id', 'url', 'display', 'protocol', 'group_id']
  87. class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer):
  88. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail')
  89. group = NestedFHRPGroupSerializer()
  90. class Meta:
  91. model = models.FHRPGroupAssignment
  92. fields = ['id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority']
  93. #
  94. # VLANs
  95. #
  96. @extend_schema_serializer(
  97. exclude_fields=('prefix_count', 'vlan_count'),
  98. )
  99. class NestedRoleSerializer(WritableNestedSerializer):
  100. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
  101. prefix_count = RelatedObjectCountField('prefixes')
  102. vlan_count = RelatedObjectCountField('vlans')
  103. class Meta:
  104. model = models.Role
  105. fields = ['id', 'url', 'display', 'name', 'slug', 'prefix_count', 'vlan_count']
  106. @extend_schema_serializer(
  107. exclude_fields=('vlan_count',),
  108. )
  109. class NestedVLANGroupSerializer(WritableNestedSerializer):
  110. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
  111. vlan_count = RelatedObjectCountField('vlans')
  112. class Meta:
  113. model = models.VLANGroup
  114. fields = ['id', 'url', 'display', 'name', 'slug', 'vlan_count']
  115. class NestedVLANSerializer(WritableNestedSerializer):
  116. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail')
  117. class Meta:
  118. model = models.VLAN
  119. fields = ['id', 'url', 'display', 'vid', 'name']
  120. #
  121. # Prefixes
  122. #
  123. class NestedPrefixSerializer(WritableNestedSerializer):
  124. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail')
  125. family = serializers.IntegerField(read_only=True)
  126. _depth = serializers.IntegerField(read_only=True)
  127. class Meta:
  128. model = models.Prefix
  129. fields = ['id', 'url', 'display', 'family', 'prefix', '_depth']
  130. #
  131. # IP ranges
  132. #
  133. class NestedIPRangeSerializer(WritableNestedSerializer):
  134. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail')
  135. family = serializers.IntegerField(read_only=True)
  136. start_address = IPAddressField()
  137. end_address = IPAddressField()
  138. class Meta:
  139. model = models.IPRange
  140. fields = ['id', 'url', 'display', 'family', 'start_address', 'end_address']
  141. #
  142. # IP addresses
  143. #
  144. class NestedIPAddressSerializer(WritableNestedSerializer):
  145. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
  146. family = serializers.IntegerField(read_only=True)
  147. address = IPAddressField()
  148. class Meta:
  149. model = models.IPAddress
  150. fields = ['id', 'url', 'display', 'family', 'address']
  151. #
  152. # Services
  153. #
  154. class NestedServiceTemplateSerializer(WritableNestedSerializer):
  155. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail')
  156. class Meta:
  157. model = models.ServiceTemplate
  158. fields = ['id', 'url', 'display', 'name', 'protocol', 'ports']
  159. class NestedServiceSerializer(WritableNestedSerializer):
  160. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail')
  161. class Meta:
  162. model = models.Service
  163. fields = ['id', 'url', 'display', 'name', 'protocol', 'ports']