2
NL-specific Form helpers
5
from __future__ import absolute_import, unicode_literals
9
from django.contrib.localflavor.nl.nl_provinces import PROVINCE_CHOICES
10
from django.core.validators import EMPTY_VALUES
11
from django.forms import ValidationError
12
from django.forms.fields import Field, Select
13
from django.utils.encoding import smart_text
14
from django.utils.translation import ugettext_lazy as _
17
pc_re = re.compile('^\d{4}[A-Z]{2}$')
18
sofi_re = re.compile('^\d{9}$')
19
numeric_re = re.compile('^\d+$')
21
class NLZipCodeField(Field):
23
A Dutch postal code field.
25
default_error_messages = {
26
'invalid': _('Enter a valid postal code'),
29
def clean(self, value):
30
super(NLZipCodeField, self).clean(value)
31
if value in EMPTY_VALUES:
34
value = value.strip().upper().replace(' ', '')
35
if not pc_re.search(value):
36
raise ValidationError(self.error_messages['invalid'])
38
if int(value[:4]) < 1000:
39
raise ValidationError(self.error_messages['invalid'])
41
return '%s %s' % (value[:4], value[4:])
43
class NLProvinceSelect(Select):
45
A Select widget that uses a list of provinces of the Netherlands as its
48
def __init__(self, attrs=None):
49
super(NLProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
51
class NLPhoneNumberField(Field):
53
A Dutch telephone number field.
55
default_error_messages = {
56
'invalid': _('Enter a valid phone number'),
59
def clean(self, value):
60
super(NLPhoneNumberField, self).clean(value)
61
if value in EMPTY_VALUES:
64
phone_nr = re.sub('[\-\s\(\)]', '', smart_text(value))
66
if len(phone_nr) == 10 and numeric_re.search(phone_nr):
69
if phone_nr[:3] == '+31' and len(phone_nr) == 12 and \
70
numeric_re.search(phone_nr[3:]):
73
raise ValidationError(self.error_messages['invalid'])
75
class NLSoFiNumberField(Field):
77
A Dutch social security number (SoFi/BSN) field.
79
http://nl.wikipedia.org/wiki/Sofinummer
81
default_error_messages = {
82
'invalid': _('Enter a valid SoFi number'),
85
def clean(self, value):
86
super(NLSoFiNumberField, self).clean(value)
87
if value in EMPTY_VALUES:
90
if not sofi_re.search(value):
91
raise ValidationError(self.error_messages['invalid'])
94
raise ValidationError(self.error_messages['invalid'])
97
for i in range(9, 1, -1):
98
checksum += int(value[9-i]) * i
99
checksum -= int(value[-1])
101
if checksum % 11 != 0:
102
raise ValidationError(self.error_messages['invalid'])