6
6
from django.core.exceptions import ValidationError
7
7
from django.utils.translation import ugettext_lazy as _
8
8
from django.utils.encoding import smart_unicode
9
from django.utils.ipv6 import is_valid_ipv6_address
10
11
# These values, if given to validate(), will trigger the self.required check.
11
12
EMPTY_VALUES = (None, '', [], (), {})
160
161
comma_separated_int_list_re = re.compile('^[\d,]+$')
161
162
validate_comma_separated_integer_list = RegexValidator(comma_separated_int_list_re, _(u'Enter only digits separated by commas.'), 'invalid')
164
def validate_ipv6_address(value):
165
if not is_valid_ipv6_address(value):
166
raise ValidationError(_(u'Enter a valid IPv6 address.'), code='invalid')
168
def validate_ipv46_address(value):
170
validate_ipv4_address(value)
171
except ValidationError:
173
validate_ipv6_address(value)
174
except ValidationError:
175
raise ValidationError(_(u'Enter a valid IPv4 or IPv6 address.'), code='invalid')
177
ip_address_validator_map = {
178
'both': ([validate_ipv46_address], _('Enter a valid IPv4 or IPv6 address.')),
179
'ipv4': ([validate_ipv4_address], _('Enter a valid IPv4 address.')),
180
'ipv6': ([validate_ipv6_address], _('Enter a valid IPv6 address.')),
183
def ip_address_validators(protocol, unpack_ipv4):
185
Depending on the given parameters returns the appropriate validators for
186
the GenericIPAddressField.
188
This code is here, because it is exactly the same for the model and the form field.
190
if protocol != 'both' and unpack_ipv4:
192
"You can only use `unpack_ipv4` if `protocol` is set to 'both'")
194
return ip_address_validator_map[protocol.lower()]
196
raise ValueError("The protocol '%s' is unknown. Supported: %s"
197
% (protocol, ip_address_validator_map.keys()))
164
200
class BaseValidator(object):
165
201
compare = lambda self, a, b: a is not b