field_serializers.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from django.utils.translation import gettext_lazy as _
  2. from rest_framework import serializers
  3. from netaddr import AddrFormatError, IPNetwork
  4. __all__ = (
  5. 'IPAddressField',
  6. 'IPNetworkField',
  7. )
  8. class IPAddressField(serializers.CharField):
  9. """
  10. An IPv4 or IPv6 address with optional mask
  11. """
  12. default_error_messages = {
  13. 'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
  14. }
  15. def to_internal_value(self, data):
  16. try:
  17. return IPNetwork(data)
  18. except AddrFormatError:
  19. raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data))
  20. except (TypeError, ValueError) as e:
  21. raise serializers.ValidationError(e)
  22. def to_representation(self, value):
  23. return str(value)
  24. class IPNetworkField(serializers.CharField):
  25. """
  26. An IPv4 or IPv6 prefix
  27. """
  28. default_error_messages = {
  29. 'invalid': _('Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation.'),
  30. }
  31. def to_internal_value(self, data):
  32. try:
  33. return IPNetwork(data)
  34. except AddrFormatError:
  35. raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data))
  36. except (TypeError, ValueError) as e:
  37. raise serializers.ValidationError(e)
  38. def to_representation(self, value):
  39. return str(value)