nested_serializers.py 4.9 KB

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