| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- from django.utils.translation import gettext_lazy as _
- from rest_framework import serializers
- from netaddr import AddrFormatError, IPNetwork
- __all__ = (
- 'IPAddressField',
- 'IPNetworkField',
- )
- class IPAddressField(serializers.CharField):
- """
- An IPv4 or IPv6 address with optional mask
- """
- 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:
- 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))
- except (TypeError, ValueError) as e:
- raise serializers.ValidationError(e)
- def to_representation(self, value):
- return str(value)
|