Fixed #3847 -- Added validation support for Finnish social security numbers.

Thanks, karsu.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@4868 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2007-03-30 10:18:15 +00:00
parent 51c7dadc4c
commit 63a629bb8d
2 changed files with 70 additions and 1 deletions

View File

@ -2,8 +2,9 @@
FI-specific Form helpers
"""
import re
from django.newforms import ValidationError
from django.newforms.fields import RegexField, Select
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
from django.utils.translation import gettext
class FIZipCodeField(RegexField):
@ -20,3 +21,27 @@ class FIMunicipalitySelect(Select):
def __init__(self, attrs=None):
from fi_municipalities import MUNICIPALITY_CHOICES # relative import
super(FIMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
class FISocialSecurityNumber(Field):
def clean(self, value):
super(FISocialSecurityNumber, self).clean(value)
if value in EMPTY_VALUES:
return u''
checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
result = re.match(r"""^
(?P<date>([0-2]\d|3[01])
(0\d|1[012])
(\d{2}))
[A+-]
(?P<serial>(\d{3}))
(?P<chechsum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
if not result:
raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))
checksum = int(result.groupdict()['date'] + result.groupdict()['serial'])
if checkmarks[checksum % len(checkmarks)] == result.groupdict()['chechsum'].upper():
return u'%s' % value.upper()
raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))

File diff suppressed because one or more lines are too long