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
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from rest_framework import serializers
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
9from .roles import RoleSerializer
11__all__ = (
12 'ASNRangeSerializer',
13 'ASNSerializer',
14 'ASNSiteSerializer',
15 'AvailableASNSerializer',
16 'RIRSerializer',
17)
20class RIRSerializer(OrganizationalModelSerializer):
22 # Related object counts
23 aggregate_count = RelatedObjectCountField('aggregates')
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')
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)
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')
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'
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 )
72 # Related object counts
73 site_count = RelatedObjectCountField('sites')
74 provider_count = RelatedObjectCountField('providers')
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')
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)
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 }