From 5f20587fcb43cac9a65b72d44a201edf0666dd07 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 16 Apr 2009 14:59:37 +0000 Subject: [PATCH] [1.0.X] Fixed #9890 -- Modified the regex validation for email addresses to match RFC822/1035. Thanks to ozgur for the report, and kratorius for the patch. Merge of 10573 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10576 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/fields.py | 8 ++++---- tests/regressiontests/forms/fields.py | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/django/forms/fields.py b/django/forms/fields.py index 63d06ab0eb..abfc4c4f99 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 @@ -421,7 +421,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 = { @@ -828,7 +828,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