Added newforms USPhoneNumberField in django.contrib.localflavor.usa
git-svn-id: http://code.djangoproject.com/svn/django/trunk@4554 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
e8f165f1f0
commit
08e406d146
|
@ -4,7 +4,11 @@ USA-specific Form helpers
|
||||||
|
|
||||||
from django.newforms import ValidationError
|
from django.newforms import ValidationError
|
||||||
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
|
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
|
||||||
|
from django.newforms.util import smart_unicode
|
||||||
from django.utils.translation import gettext
|
from django.utils.translation import gettext
|
||||||
|
import re
|
||||||
|
|
||||||
|
phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$')
|
||||||
|
|
||||||
class USZipCodeField(RegexField):
|
class USZipCodeField(RegexField):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -13,6 +17,21 @@ class USZipCodeField(RegexField):
|
||||||
error_message=gettext(u'Enter a zip code in the format XXXXX or XXXXX-XXXX.'),
|
error_message=gettext(u'Enter a zip code in the format XXXXX or XXXXX-XXXX.'),
|
||||||
*args, **kwargs)
|
*args, **kwargs)
|
||||||
|
|
||||||
|
class USPhoneNumberField(Field):
|
||||||
|
def __init__(self, allow_letters=True, *args, **kwargs):
|
||||||
|
self.allow_letters = allow_letters
|
||||||
|
super(USPhoneNumberField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def clean(self, value):
|
||||||
|
super(USPhoneNumberField, self).clean(value)
|
||||||
|
if value in EMPTY_VALUES:
|
||||||
|
return u''
|
||||||
|
value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
|
||||||
|
m = phone_digits_re.search(value)
|
||||||
|
if m:
|
||||||
|
return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
|
||||||
|
raise ValidationError(u'Phone numbers must be in XXX-XXX-XXXX format.')
|
||||||
|
|
||||||
class USStateField(Field):
|
class USStateField(Field):
|
||||||
"""
|
"""
|
||||||
A form field that validates its input is a U.S. state name or abbreviation.
|
A form field that validates its input is a U.S. state name or abbreviation.
|
||||||
|
|
|
@ -3329,6 +3329,75 @@ u''
|
||||||
>>> f.clean('')
|
>>> f.clean('')
|
||||||
u''
|
u''
|
||||||
|
|
||||||
|
# USPhoneNumberField ##########################################################
|
||||||
|
|
||||||
|
USPhoneNumberField validates that the data is a valid U.S. phone number,
|
||||||
|
including the area code. It's normalized to XXX-XXX-XXXX format.
|
||||||
|
>>> from django.contrib.localflavor.usa.forms import USPhoneNumberField
|
||||||
|
>>> f = USPhoneNumberField()
|
||||||
|
>>> f.clean('312-555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('3125551212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('(312) 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555 1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555.1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean(' (312) 555.1212 ')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('312-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = USPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('312-555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('3125551212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('(312) 555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312 555 1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555.1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('312.555-1212')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean(' (312) 555.1212 ')
|
||||||
|
u'312-555-1212'
|
||||||
|
>>> f.clean('555-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean('312-55-1212')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Phone numbers must be in XXX-XXX-XXXX format.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
|
||||||
# USStateField ################################################################
|
# USStateField ################################################################
|
||||||
|
|
||||||
USStateField validates that the data is either an abbreviation or name of a
|
USStateField validates that the data is either an abbreviation or name of a
|
||||||
|
|
Loading…
Reference in New Issue