diff --git a/netbox/ipam/api/field_serializers.py b/netbox/ipam/api/field_serializers.py new file mode 100644 index 000000000..63033d41f --- /dev/null +++ b/netbox/ipam/api/field_serializers.py @@ -0,0 +1,38 @@ +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + +from ipam import models +from ipam.validators import validate_ipaddress_with_mask +from netaddr import AddrFormatError, IPNetwork + +__all__ = [ + 'IPAddressField', +] + + +# +# 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) + + def to_internal_value(self, data): + try: + return IPNetwork(data) + except AddrFormatError: + raise serializers.ValidationError("Invalid IP address format: {}".format(data)) + except (TypeError, ValueError) as e: + raise serializers.ValidationError(e) + + def to_representation(self, value): + return str(value) diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 1f88272a4..9e150e2cb 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -1,15 +1,12 @@ -from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers from ipam import models from ipam.models.l2vpn import L2VPNTermination, L2VPN -from ipam.validators import validate_ipaddress_with_mask from netbox.api.serializers import WritableNestedSerializer -from netaddr import AddrFormatError, IPNetwork +from .field_serializers import IPAddressField __all__ = [ - 'IPAddressField', 'NestedAggregateSerializer', 'NestedASNSerializer', 'NestedASNRangeSerializer', @@ -31,34 +28,6 @@ __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) - - def to_internal_value(self, data): - try: - return IPNetwork(data) - except AddrFormatError: - raise serializers.ValidationError("Invalid IP address format: {}".format(data)) - except (TypeError, ValueError) as e: - raise serializers.ValidationError(e) - - def to_representation(self, value): - return str(value) - - # # ASN ranges # diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 4aa0a75de..dea7cb157 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -14,6 +14,7 @@ from tenancy.api.nested_serializers import NestedTenantSerializer from utilities.api import get_serializer_for_model from virtualization.api.nested_serializers import NestedVirtualMachineSerializer from .nested_serializers import * +from .field_serializers import IPAddressField #