Code

Ticket #3847: fi_localflavor_social_security_number.patch

File fi_localflavor_social_security_number.patch, 3.1 KB (added by karsu, 7 years ago)

A Finnish social security number field

Line 
1Index: django/contrib/localflavor/fi/__init__.py
2===================================================================
3Index: django/contrib/localflavor/fi/forms.py
4===================================================================
5--- django/contrib/localflavor/fi/forms.py      (revision 0)
6
7+++ django/contrib/localflavor/fi/forms.py      (revision 0)
8
9@@ -0,0 +1,31 @@
10
11+"""
12+FI-specific Form helpers
13+"""
14+
15+from django.newforms import ValidationError
16+from django.newforms.fields import Field, EMPTY_VALUES
17+from django.utils.translation import gettext
18+import re
19+
20+class FISocialSecurityNumber(Field):
21+    def clean(self, value):
22+        super(FISocialSecurityNumber, self).clean(value)
23+        if value in EMPTY_VALUES:
24+               return u''
25+       
26+        checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
27+        result = re.match(r"""^
28+            (?P<date>([0-2]\d|3[01])
29+            (0\d|1[012])
30+            (\d{2}))
31+            [A+-]
32+            (?P<serial>(\d{3}))
33+            (?P<chechsum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
34+        if not result:
35+            raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))
36+        checksum = int(result.groupdict()['date'] + result.groupdict()['serial'])
37+
38+        if checkmarks[checksum % len(checkmarks)] == result.groupdict()['chechsum'].upper():
39+            return u'%s' % value.upper()
40+       
41+        raise ValidationError(gettext(u'Enter a valid Finnish social security number.'))
42Index: tests/regressiontests/forms/tests.py
43
44===================================================================
45
46--- tests/regressiontests/forms/tests.py        (revision 4866)
47
48+++ tests/regressiontests/forms/tests.py        (working copy)
49
50@@ -3878,7 +3878,49 @@
51
52 <option value="okinawa">Okinawa</option>
53 </select>
54 
55+# FISocialSecurityNumber ###############################################################
56 
57+>>> from django.contrib.localflavor.fi.forms import FISocialSecurityNumber
58+>>> f = FISocialSecurityNumber()
59+>>> f.clean('010101-0101')
60+u'010101-0101'
61+>>> f.clean('010101+0101')
62+u'010101+0101'
63+>>> f.clean('010101A0101')
64+u'010101A0101'
65+>>> f.clean('101010-0102')
66+Traceback (most recent call last):
67+...
68+ValidationError: [u'Enter a valid Finnish social security number.']
69+>>> f.clean('10a010-0101')
70+Traceback (most recent call last):
71+...
72+ValidationError: [u'Enter a valid Finnish social security number.']
73+>>> f.clean('101010-0\xe401')
74+Traceback (most recent call last):
75+...
76+ValidationError: [u'Enter a valid Finnish social security number.']
77+>>> f.clean('101010b0101')
78+Traceback (most recent call last):
79+...
80+ValidationError: [u'Enter a valid Finnish social security number.']
81+>>> f.clean('')
82+Traceback (most recent call last):
83+...
84+ValidationError: [u'This field is required.']
85+
86+>>> f.clean(None)
87+Traceback (most recent call last):
88+...
89+ValidationError: [u'This field is required.']
90+>>> f = FISocialSecurityNumber(required=False)
91+>>> f.clean('010101-0101')
92+u'010101-0101'
93+>>> f.clean(None)
94+u''
95+>>> f.clean('')
96+u''
97+
98 #################################
99 # Tests of underlying functions #
100 #################################