Coverage for ipam/api/serializers_/asns.py: 96%

45 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from rest_framework import serializers 

2 

3from dcim.models import Site 

4from ipam.models import ASN, RIR, ASNRange 

5from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField 

6from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer 

7from tenancy.api.serializers_.tenants import TenantSerializer 

8 

9from .roles import RoleSerializer 

10 

11__all__ = ( 

12 'ASNRangeSerializer', 

13 'ASNSerializer', 

14 'ASNSiteSerializer', 

15 'AvailableASNSerializer', 

16 'RIRSerializer', 

17) 

18 

19 

20class RIRSerializer(OrganizationalModelSerializer): 

21 

22 # Related object counts 

23 aggregate_count = RelatedObjectCountField('aggregates') 

24 

25 class Meta: 

26 model = RIR 

27 fields = [ 

28 'id', 'url', 'display_url', 'display', 'name', 'slug', 'is_private', 'description', 'owner', 'comments', 

29 'tags', 'custom_fields', 'created', 'last_updated', 'aggregate_count', 

30 ] 

31 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'aggregate_count') 

32 

33 

34class ASNRangeSerializer(OrganizationalModelSerializer): 

35 rir = RIRSerializer(nested=True) 

36 tenant = TenantSerializer(nested=True, required=False, allow_null=True) 

37 asn_count = serializers.IntegerField(read_only=True) 

38 

39 class Meta: 

40 model = ASNRange 

41 fields = [ 

42 'id', 'url', 'display_url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 

43 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'asn_count', 

44 ] 

45 brief_fields = ('id', 'url', 'display', 'name', 'description') 

46 

47 

48class ASNSiteSerializer(PrimaryModelSerializer): 

49 """ 

50 This serializer is meant for inclusion in ASNSerializer and is only used 

51 to avoid a circular import of SiteSerializer. 

52 """ 

53 class Meta: 

54 model = Site 

55 fields = ('id', 'url', 'display', 'name', 'description', 'slug') 

56 brief_fields = ('id', 'url', 'display', 'name', 'description', 'slug') 

57 ref_name = 'ASNSite' 

58 

59 

60class ASNSerializer(PrimaryModelSerializer): 

61 rir = RIRSerializer(nested=True, required=False, allow_null=True) 

62 role = RoleSerializer(nested=True, required=False, allow_null=True) 

63 tenant = TenantSerializer(nested=True, required=False, allow_null=True) 

64 sites = SerializedPKRelatedField( 

65 queryset=Site.objects.all(), 

66 serializer=ASNSiteSerializer, 

67 nested=True, 

68 required=False, 

69 many=True 

70 ) 

71 

72 # Related object counts 

73 site_count = RelatedObjectCountField('sites') 

74 provider_count = RelatedObjectCountField('providers') 

75 

76 class Meta: 

77 model = ASN 

78 fields = [ 

79 'id', 'url', 'display_url', 'display', 'asn', 'rir', 'role', 'tenant', 'description', 'owner', 'comments', 

80 'tags', 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', 'sites', 

81 ] 

82 brief_fields = ('id', 'url', 'display', 'asn', 'description') 

83 

84 

85class AvailableASNSerializer(serializers.Serializer): 

86 """ 

87 Representation of an ASN which does not exist in the database. 

88 """ 

89 asn = serializers.IntegerField(read_only=True) 

90 description = serializers.CharField(required=False) 

91 

92 def to_representation(self, asn): 

93 rir = RIRSerializer(self.context['range'].rir, nested=True, context={ 

94 'request': self.context['request'] 

95 }).data 

96 return { 

97 'rir': rir, 

98 'asn': asn, 

99 }