2023-04-21 09:41:03 -07:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
|
|
from netaddr import AddrFormatError, IPNetwork
|
|
|
|
|
2023-09-06 07:49:40 -07:00
|
|
|
__all__ = (
|
2023-04-21 09:41:03 -07:00
|
|
|
'IPAddressField',
|
2023-09-06 07:49:40 -07:00
|
|
|
'IPNetworkField',
|
|
|
|
)
|
2023-04-21 09:41:03 -07:00
|
|
|
|
|
|
|
|
|
|
|
class IPAddressField(serializers.CharField):
|
2023-09-06 07:49:40 -07:00
|
|
|
"""
|
|
|
|
An IPv4 or IPv6 address with optional mask
|
|
|
|
"""
|
2023-04-21 09:41:03 -07:00
|
|
|
default_error_messages = {
|
|
|
|
'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
|
|
|
|
}
|
|
|
|
|
|
|
|
def to_internal_value(self, data):
|
|
|
|
try:
|
|
|
|
return IPNetwork(data)
|
|
|
|
except AddrFormatError:
|
2023-09-06 07:49:40 -07:00
|
|
|
raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data))
|
|
|
|
except (TypeError, ValueError) as e:
|
|
|
|
raise serializers.ValidationError(e)
|
|
|
|
|
|
|
|
def to_representation(self, value):
|
|
|
|
return str(value)
|
|
|
|
|
|
|
|
|
|
|
|
class IPNetworkField(serializers.CharField):
|
|
|
|
"""
|
|
|
|
An IPv4 or IPv6 prefix
|
|
|
|
"""
|
|
|
|
default_error_messages = {
|
|
|
|
'invalid': _('Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation.'),
|
|
|
|
}
|
|
|
|
|
|
|
|
def to_internal_value(self, data):
|
|
|
|
try:
|
|
|
|
return IPNetwork(data)
|
|
|
|
except AddrFormatError:
|
|
|
|
raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data))
|
2023-04-21 09:41:03 -07:00
|
|
|
except (TypeError, ValueError) as e:
|
|
|
|
raise serializers.ValidationError(e)
|
|
|
|
|
|
|
|
def to_representation(self, value):
|
|
|
|
return str(value)
|