Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Implented newforms USStateField in django.contrib.localflavor.usa. Refs

#2455

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4525 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 1ce1442d95730e7b4e0d54f971aaeb6cf744f04c 1 parent 27b2861
@adrianholovaty adrianholovaty authored
View
25 django/contrib/localflavor/usa/forms.py
@@ -2,7 +2,8 @@
USA-specific Form helpers
"""
-from django.newforms.fields import RegexField
+from django.newforms import ValidationError
+from django.newforms.fields import Field, RegexField, EMPTY_VALUES
from django.utils.translation import gettext
class USZipCodeField(RegexField):
@@ -11,3 +12,25 @@ def __init__(self, *args, **kwargs):
max_length=None, min_length=None,
error_message=gettext(u'Enter a zip code in the format XXXXX or XXXXX-XXXX.'),
*args, **kwargs)
+
+class USStateField(Field):
+ """
+ A form field that validates its input is a U.S. state name or abbreviation.
+ It normalizes the input to the standard two-leter postal service
+ abbreviation for the given state.
+ """
+ def clean(self, value):
+ from us_states import STATES_NORMALIZED # relative import
+ super(USStateField, self).clean(value)
+ if value in EMPTY_VALUES:
+ return u''
+ try:
+ value = value.strip().lower()
+ except AttributeError:
+ pass
+ else:
+ try:
+ return STATES_NORMALIZED[value.strip().lower()].decode('ascii')
+ except KeyError:
+ pass
+ raise ValidationError(u'Enter a U.S. state or territory.')
View
176 django/contrib/localflavor/usa/us_states.py
@@ -0,0 +1,176 @@
+"""
+A mapping of state misspellings/abbreviations to normalized abbreviations.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATES_NORMALIZED = {
+ 'ak': 'AK',
+ 'al': 'AL',
+ 'ala': 'AL',
+ 'alabama': 'AL',
+ 'alaska': 'AK',
+ 'american samao': 'AS',
+ 'american samoa': 'AS',
+ 'ar': 'AR',
+ 'ariz': 'AZ',
+ 'arizona': 'AZ',
+ 'ark': 'AR',
+ 'arkansas': 'AR',
+ 'as': 'AS',
+ 'az': 'AZ',
+ 'ca': 'CA',
+ 'calf': 'CA',
+ 'calif': 'CA',
+ 'california': 'CA',
+ 'co': 'CO',
+ 'colo': 'CO',
+ 'colorado': 'CO',
+ 'conn': 'CT',
+ 'connecticut': 'CT',
+ 'ct': 'CT',
+ 'dc': 'DC',
+ 'de': 'DE',
+ 'del': 'DE',
+ 'delaware': 'DE',
+ 'district of columbia': 'DC',
+ 'federated states of micronesia': 'FM',
+ 'fl': 'FL',
+ 'fla': 'FL',
+ 'florida': 'FL',
+ 'fm': 'FM',
+ 'ga': 'GA',
+ 'georgia': 'GA',
+ 'gu': 'GU',
+ 'guam': 'GU',
+ 'hawaii': 'HI',
+ 'hi': 'HI',
+ 'ia': 'IA',
+ 'id': 'ID',
+ 'idaho': 'ID',
+ 'il': 'IL',
+ 'ill': 'IL',
+ 'illinois': 'IL',
+ 'in': 'IN',
+ 'ind': 'IN',
+ 'indiana': 'IN',
+ 'iowa': 'IA',
+ 'kan': 'KS',
+ 'kans': 'KS',
+ 'kansas': 'KS',
+ 'kentucky': 'KY',
+ 'ks': 'KS',
+ 'ky': 'KY',
+ 'la': 'LA',
+ 'louisiana': 'LA',
+ 'ma': 'MA',
+ 'maine': 'ME',
+ 'marianas islands': 'MP',
+ 'marianas islands of the pacific': 'MP',
+ 'marinas islands of the pacific': 'MP',
+ 'maryland': 'MD',
+ 'mass': 'MA',
+ 'massachusetts': 'MA',
+ 'massachussetts': 'MA',
+ 'md': 'MD',
+ 'me': 'ME',
+ 'mi': 'MI',
+ 'mich': 'MI',
+ 'michigan': 'MI',
+ 'micronesia': 'FM',
+ 'minn': 'MN',
+ 'minnesota': 'MN',
+ 'miss': 'MS',
+ 'mississippi': 'MS',
+ 'missouri': 'MO',
+ 'mn': 'MN',
+ 'mo': 'MO',
+ 'mont': 'MT',
+ 'montana': 'MT',
+ 'mp': 'MP',
+ 'ms': 'MS',
+ 'mt': 'MT',
+ 'n d': 'ND',
+ 'n dak': 'ND',
+ 'n h': 'NH',
+ 'n j': 'NJ',
+ 'n m': 'NM',
+ 'n mex': 'NM',
+ 'nc': 'NC',
+ 'nd': 'ND',
+ 'ne': 'NE',
+ 'neb': 'NE',
+ 'nebr': 'NE',
+ 'nebraska': 'NE',
+ 'nev': 'NV',
+ 'nevada': 'NV',
+ 'new hampshire': 'NH',
+ 'new jersey': 'NJ',
+ 'new mexico': 'NM',
+ 'new york': 'NY',
+ 'nh': 'NH',
+ 'nj': 'NJ',
+ 'nm': 'NM',
+ 'nmex': 'NM',
+ 'north carolina': 'NC',
+ 'north dakota': 'ND',
+ 'northern mariana islands': 'MP',
+ 'nv': 'NV',
+ 'ny': 'NY',
+ 'oh': 'OH',
+ 'ohio': 'OH',
+ 'ok': 'OK',
+ 'okla': 'OK',
+ 'oklahoma': 'OK',
+ 'or': 'OR',
+ 'ore': 'OR',
+ 'oreg': 'OR',
+ 'oregon': 'OR',
+ 'pa': 'PA',
+ 'penn': 'PA',
+ 'pennsylvania': 'PA',
+ 'pr': 'PR',
+ 'puerto rico': 'PR',
+ 'rhode island': 'RI',
+ 'ri': 'RI',
+ 's dak': 'SD',
+ 'sc': 'SC',
+ 'sd': 'SD',
+ 'sdak': 'SD',
+ 'south carolina': 'SC',
+ 'south dakota': 'SD',
+ 'tenn': 'TN',
+ 'tennessee': 'TN',
+ 'territory of hawaii': 'HI',
+ 'tex': 'TX',
+ 'texas': 'TX',
+ 'tn': 'TN',
+ 'tx': 'TX',
+ 'us virgin islands': 'VI',
+ 'usvi': 'VI',
+ 'ut': 'UT',
+ 'utah': 'UT',
+ 'va': 'VA',
+ 'vermont': 'VT',
+ 'vi': 'VI',
+ 'viginia': 'VA',
+ 'virgin islands': 'VI',
+ 'virgina': 'VA',
+ 'virginia': 'VA',
+ 'vt': 'VT',
+ 'w va': 'WV',
+ 'wa': 'WA',
+ 'wash': 'WA',
+ 'washington': 'WA',
+ 'west virginia': 'WV',
+ 'wi': 'WI',
+ 'wis': 'WI',
+ 'wisc': 'WI',
+ 'wisconsin': 'WI',
+ 'wv': 'WV',
+ 'wva': 'WV',
+ 'wy': 'WY',
+ 'wyo': 'WY',
+ 'wyoming': 'WY',
+}
View
45 tests/regressiontests/forms/tests.py
@@ -3282,6 +3282,51 @@
>>> f.clean('')
u''
+# USStateField ################################################################
+
+USStateField validates that the data is either an abbreviation or name of a
+U.S. state.
+>>> from django.contrib.localflavor.usa.forms import USStateField
+>>> f = USStateField()
+>>> f.clean('il')
+u'IL'
+>>> f.clean('IL')
+u'IL'
+>>> f.clean('illinois')
+u'IL'
+>>> f.clean(' illinois ')
+u'IL'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a U.S. state or territory.']
+>>> 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 = USStateField(required=False)
+>>> f.clean('il')
+u'IL'
+>>> f.clean('IL')
+u'IL'
+>>> f.clean('illinois')
+u'IL'
+>>> f.clean(' illinois ')
+u'IL'
+>>> f.clean(60606)
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a U.S. state or territory.']
+>>> f.clean(None)
+u''
+>>> f.clean('')
+u''
+
#################################
# Tests of underlying functions #
#################################
Please sign in to comment.
Something went wrong with that request. Please try again.