Coverage for ipam/api/field_serializers.py: 92%
26 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.utils.translation import gettext_lazy as _
2from netaddr import AddrFormatError, IPNetwork
3from rest_framework import serializers
5__all__ = (
6 'IPAddressField',
7 'IPNetworkField',
8)
11class IPAddressField(serializers.CharField):
12 """
13 An IPv4 or IPv6 address with optional mask
14 """
15 default_error_messages = {
16 'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
17 }
19 def to_internal_value(self, data):
20 try:
21 return IPNetwork(data)
22 except AddrFormatError:
23 raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data=data))
24 except (TypeError, ValueError) as e:
25 raise serializers.ValidationError(e)
27 def to_representation(self, value):
28 return str(value)
31class IPNetworkField(serializers.CharField):
32 """
33 An IPv4 or IPv6 prefix
34 """
35 default_error_messages = {
36 'invalid': _('Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation.'),
37 }
39 def to_internal_value(self, data):
40 try:
41 return IPNetwork(data)
42 except AddrFormatError:
43 raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data=data))
44 except (TypeError, ValueError) as e:
45 raise serializers.ValidationError(e)
47 def to_representation(self, value):
48 return str(value)