Fixed #8527 -- Made CAPostalCodeField more forgiving of the input format. Thanks to Claude Paroz.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16175 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2011-05-07 16:59:08 +00:00
parent c5f58f54fd
commit 02b837d38a
2 changed files with 19 additions and 7 deletions

View File

@ -4,7 +4,7 @@ Canada-specific Form helpers
from django.core.validators import EMPTY_VALUES
from django.forms import ValidationError
from django.forms.fields import Field, RegexField, Select
from django.forms.fields import Field, CharField, Select
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext_lazy as _
import re
@ -12,7 +12,7 @@ import re
phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$')
sin_re = re.compile(r"^(\d{3})-(\d{3})-(\d{3})$")
class CAPostalCodeField(RegexField):
class CAPostalCodeField(CharField):
"""
Canadian postal code field.
@ -25,9 +25,17 @@ class CAPostalCodeField(RegexField):
'invalid': _(u'Enter a postal code in the format XXX XXX.'),
}
def __init__(self, max_length=None, min_length=None, *args, **kwargs):
super(CAPostalCodeField, self).__init__(r'^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] \d[ABCEGHJKLMNPRSTVWXYZ]\d$',
max_length, min_length, *args, **kwargs)
postcode_regex = re.compile(r'^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) *(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$')
def clean(self, value):
value = super(CAPostalCodeField, self).clean(value)
if value in EMPTY_VALUES:
return u''
postcode = value.upper().strip()
m = self.postcode_regex.match(postcode)
if not m:
raise ValidationError(self.default_error_messages['invalid'])
return "%s %s" % (m.group(1), m.group(2))
class CAPhoneNumberField(Field):
"""Canadian phone number field."""

View File

@ -45,13 +45,17 @@ class CALocalFlavorTests(LocalFlavorTestCase):
'T2S 2W7': 'T2S 2W7',
'T2S 2Z7': 'T2S 2Z7',
'T2Z 2H7': 'T2Z 2H7',
'T2S2H7' : 'T2S 2H7',
't2s 2h7': 'T2S 2H7',
't2s2h7' : 'T2S 2H7',
't2s 2H7': 'T2S 2H7',
' t2s 2H7 ': 'T2S 2H7',
}
invalid = {
'T2S2H7' : error_format,
'T2S 2H' : error_format,
'2T6 H8I': error_format,
'T2S2H' : error_format,
't2s h8i': error_format,
90210 : error_format,
'W2S 2H3': error_format,
'Z2S 2H3': error_format,