#12278 add ipaddressfieldserializer to nested serializers

This commit is contained in:
Arthur 2023-04-18 09:59:46 -07:00
parent 91e546c800
commit fb1827cac1
2 changed files with 25 additions and 14 deletions

View File

@ -1,11 +1,14 @@
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema_serializer from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers from rest_framework import serializers
from ipam import models from ipam import models
from ipam.models.l2vpn import L2VPNTermination, L2VPN from ipam.models.l2vpn import L2VPNTermination, L2VPN
from ipam.validators import validate_ipaddress_with_mask
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
__all__ = [ __all__ = [
'IPAddressField',
'NestedAggregateSerializer', 'NestedAggregateSerializer',
'NestedASNSerializer', 'NestedASNSerializer',
'NestedASNRangeSerializer', 'NestedASNRangeSerializer',
@ -27,6 +30,23 @@ __all__ = [
] ]
#
# IP address field
#
class IPAddressField(serializers.CharField):
"""IPAddressField with mask"""
default_error_messages = {
'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
}
def __init__(self, **kwargs):
super().__init__(**kwargs)
validator = validate_ipaddress_with_mask
self.validators.append(validator)
# #
# ASN ranges # ASN ranges
# #
@ -182,6 +202,8 @@ class NestedPrefixSerializer(WritableNestedSerializer):
class NestedIPRangeSerializer(WritableNestedSerializer): class NestedIPRangeSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail')
family = serializers.IntegerField(read_only=True) family = serializers.IntegerField(read_only=True)
start_address = IPAddressField()
end_address = IPAddressField()
class Meta: class Meta:
model = models.IPRange model = models.IPRange
@ -195,6 +217,7 @@ class NestedIPRangeSerializer(WritableNestedSerializer):
class NestedIPAddressSerializer(WritableNestedSerializer): class NestedIPAddressSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
family = serializers.IntegerField(read_only=True) family = serializers.IntegerField(read_only=True)
address = IPAddressField()
class Meta: class Meta:
model = models.IPAddress model = models.IPAddress

View File

@ -1,5 +1,4 @@
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
@ -7,7 +6,6 @@ from dcim.api.nested_serializers import NestedDeviceSerializer, NestedSiteSerial
from ipam.choices import * from ipam.choices import *
from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS, VLANGROUP_SCOPE_TYPES from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS, VLANGROUP_SCOPE_TYPES
from ipam.models import * from ipam.models import *
from ipam.validators import validate_ipaddress_with_mask
from netaddr import AddrFormatError, IPNetwork from netaddr import AddrFormatError, IPNetwork
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
@ -372,6 +370,8 @@ class AvailablePrefixSerializer(serializers.Serializer):
class IPRangeSerializer(NetBoxModelSerializer): class IPRangeSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail')
family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
start_address = IPAddressField()
end_address = IPAddressField()
vrf = NestedVRFSerializer(required=False, allow_null=True) vrf = NestedVRFSerializer(required=False, allow_null=True)
tenant = NestedTenantSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True)
status = ChoiceField(choices=IPRangeStatusChoices, required=False) status = ChoiceField(choices=IPRangeStatusChoices, required=False)
@ -390,18 +390,6 @@ class IPRangeSerializer(NetBoxModelSerializer):
# #
# IP addresses # IP addresses
# #
class IPAddressField(serializers.CharField):
"""IPAddressField with mask"""
default_error_messages = {
'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
}
def __init__(self, **kwargs):
super().__init__(**kwargs)
validator = validate_ipaddress_with_mask
self.validators.append(validator)
class IPAddressSerializer(NetBoxModelSerializer): class IPAddressSerializer(NetBoxModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')