From 48b459a83e40aa6dae588f114d68f54b95e860de Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 16 Apr 2009 14:24:27 +0000 Subject: [PATCH] Fixed #9890 -- Modified the regex validation for email addresses to match RFC822/1035. Thanks to ozgur for the report, and kratorius for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10573 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/fields.py | 10 +++++----- tests/regressiontests/forms/fields.py | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/django/forms/fields.py b/django/forms/fields.py index bd4f3d4a80..ab3fe67aeb 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -256,8 +256,8 @@ class DecimalField(Field): digits = len(digittuple) if decimals > digits: # We have leading zeros up to or past the decimal point. Count - # everything past the decimal point as a digit. We do not count - # 0 before the decimal point as a digit since that would mean + # everything past the decimal point as a digit. We do not count + # 0 before the decimal point as a digit since that would mean # we would not allow max_digits = decimal_places. digits = decimals whole_digits = digits - decimals @@ -283,7 +283,7 @@ DEFAULT_DATE_INPUT_FORMATS = ( ) class DateField(Field): - widget = DateInput + widget = DateInput default_error_messages = { 'invalid': _(u'Enter a valid date.'), } @@ -422,7 +422,7 @@ class RegexField(CharField): email_re = re.compile( r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string - r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain + r')@(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain class EmailField(RegexField): default_error_messages = { @@ -829,7 +829,7 @@ class FilePathField(ChoiceField): super(FilePathField, self).__init__(choices=(), required=required, widget=widget, label=label, initial=initial, help_text=help_text, *args, **kwargs) - + if self.required: self.choices = [] else: diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py index 0dc49f2ca7..bec07dd5c3 100644 --- a/tests/regressiontests/forms/fields.py +++ b/tests/regressiontests/forms/fields.py @@ -745,6 +745,27 @@ ValidationError: [u'Enter a valid e-mail address.'] Traceback (most recent call last): ... ValidationError: [u'Enter a valid e-mail address.'] +>>> f.clean('example@invalid-.com') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid e-mail address.'] +>>> f.clean('example@-invalid.com') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid e-mail address.'] +>>> f.clean('example@inv-.alid-.com') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid e-mail address.'] +>>> f.clean('example@inv-.-alid.com') +Traceback (most recent call last): +... +ValidationError: [u'Enter a valid e-mail address.'] +>>> f.clean('example@valid-----hyphens.com') +u'example@valid-----hyphens.com' + +>>> f.clean('example@valid-with-hyphens.com') +u'example@valid-with-hyphens.com' >>> f = EmailField(required=False) >>> f.clean('') @@ -1104,7 +1125,7 @@ ValidationError: [u'Select a valid choice. 6 is not one of the available choices # TypedChoiceField ############################################################ -# TypedChoiceField is just like ChoiceField, except that coerced types will +# TypedChoiceField is just like ChoiceField, except that coerced types will # be returned: >>> f = TypedChoiceField(choices=[(1, "+1"), (-1, "-1")], coerce=int) >>> f.clean('1') @@ -1122,7 +1143,7 @@ ValidationError: [u'Select a valid choice. 2 is not one of the available choices # This can also cause weirdness: be careful (bool(-1) == True, remember) >>> f.coerce = bool ->>> f.clean('-1') +>>> f.clean('-1') True # Even more weirdness: if you have a valid choice but your coercion function