2
# Extract of Django 1.4's core/validators.py file with modified imports.
5
from django.core.exceptions import ValidationError
6
from django.core.validators import RegexValidator
7
from django.utils.translation import ugettext_lazy as _
8
from maasserver.dj14.ipv6 import is_valid_ipv6_address
11
ipv4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
12
validate_ipv4_address = RegexValidator(ipv4_re, _(u'Enter a valid IPv4 address.'), 'invalid')
14
def validate_ipv6_address(value):
15
if not is_valid_ipv6_address(value):
16
raise ValidationError(_(u'Enter a valid IPv6 address.'), code='invalid')
18
def validate_ipv46_address(value):
20
validate_ipv4_address(value)
21
except ValidationError:
23
validate_ipv6_address(value)
24
except ValidationError:
25
raise ValidationError(_(u'Enter a valid IPv4 or IPv6 address.'), code='invalid')
27
ip_address_validator_map = {
28
'both': ([validate_ipv46_address], _('Enter a valid IPv4 or IPv6 address.')),
29
'ipv4': ([validate_ipv4_address], _('Enter a valid IPv4 address.')),
30
'ipv6': ([validate_ipv6_address], _('Enter a valid IPv6 address.')),
33
def ip_address_validators(protocol, unpack_ipv4):
35
Depending on the given parameters returns the appropriate validators for
36
the GenericIPAddressField.
38
This code is here, because it is exactly the same for the model and the form field.
40
if protocol != 'both' and unpack_ipv4:
42
"You can only use `unpack_ipv4` if `protocol` is set to 'both'")
44
return ip_address_validator_map[protocol.lower()]
46
raise ValueError("The protocol '%s' is unknown. Supported: %s"
47
% (protocol, ip_address_validator_map.keys()))