Source code for localflavor.nl.forms
"""NL-specific Form helpers."""
import re
from django import forms
from .nl_provinces import PROVINCE_CHOICES
from .validators import NLBSNFieldValidator, NLLicensePlateFieldValidator, NLZipCodeFieldValidator
[docs]class NLZipCodeField(forms.CharField):
"""A Dutch zip code field."""
default_validators = [NLZipCodeFieldValidator()]
[docs] def clean(self, value):
if isinstance(value, str):
value = value.upper().replace(' ', '')
if len(value) == 6:
value = '%s %s' % (value[:4], value[4:])
return super().clean(value)
[docs]class NLProvinceSelect(forms.Select):
"""A Select widget that uses a list of provinces of the Netherlands as it's choices."""
def __init__(self, attrs=None):
super().__init__(attrs, choices=PROVINCE_CHOICES)
[docs]class NLBSNFormField(forms.CharField):
"""
A Dutch social security number (BSN) field.
https://nl.wikipedia.org/wiki/Burgerservicenummer
Note that you may only process the BSN if you have a legal basis to do so!
.. versionadded:: 1.6
"""
default_validators = [NLBSNFieldValidator()]
def __init__(self, **kwargs):
kwargs['max_length'] = 9
super().__init__(**kwargs)
[docs]class NLLicensePlateFormField(forms.CharField):
"""
A Dutch license plate field.
https://www.rdw.nl/
https://nl.wikipedia.org/wiki/Nederlands_kenteken
.. versionadded:: 2.1
"""
default_validators = [NLLicensePlateFieldValidator()]
SANITIZE_REGEXS = {
"sidecode1": re.compile(r"^([A-Z]{2})([0-9]{2})([0-9]{2})$"), # AA-99-99
"sidecode2": re.compile(r"^([0-9]{2})([0-9]{2})([A-Z]{2})$"), # 99-99-AA
"sidecode3": re.compile(r"^([0-9]{2})([A-Z]{2})([0-9]{2})$"), # 99-AA-99
"sidecode4": re.compile(r"^([A-Z]{2})([0-9]{2})([A-Z]{2})$"), # AA-99-AA
"sidecode5": re.compile(r"^([A-Z]{2})([A-Z]{2})([0-9]{2})$"), # AA-AA-99
"sidecode6": re.compile(r"^([0-9]{2})([A-Z]{2})([A-Z]{2})$"), # 99-AA-AA
"sidecode7": re.compile(r"^([0-9]{2})([A-Z]{3})([0-9]{1})$"), # 99-AAA-9
"sidecode8": re.compile(r"^([0-9]{1})([A-Z]{3})([0-9]{2})$"), # 9-AAA-99
"sidecode9": re.compile(r"^([A-Z]{2})([0-9]{3})([A-Z]{1})$"), # AA-999-A
"sidecode10": re.compile(r"^([A-Z]{1})([0-9]{3})([A-Z]{2})$"), # A-999-AA
"sidecode11": re.compile(r"^([A-Z]{3})([0-9]{2})([A-Z]{1})$"), # AAA-99-A
"sidecode12": re.compile(r"^([A-Z]{1})([0-9]{2})([A-Z]{3})$"), # A-99-AAA
"sidecode13": re.compile(r"^([0-9]{1})([A-Z]{2})([0-9]{3})$"), # 9-AA-999
"sidecode14": re.compile(r"^([0-9]{3})([A-Z]{2})([0-9]{1})$"), # 999-AA-9
"sidecode_koninklijk_huis": re.compile(r"^(AA)([0-9]{2,3})(([0-9]{2})?)$"), # AA-99(-99)?
"sidecode_internationaal_gerechtshof": re.compile(r"^(CDJ)([0-9]{3})$"), # CDJ-999
"sidecode_bijzondere_toelating": re.compile(r"^(ZZ)([0-9]{2})([0-9]{2})$"), # ZZ-99-99
"sidecode_tijdelijk_voor_een_dag": re.compile(r"^(F)([0-9]{2})([0-9]{2})$"), # F-99-99
"sidecode_voertuig_binnen_of_buiten_nederland_brengen": re.compile(r"^(Z)([0-9]{2})([0-9]{2})$"), # Z-99-99
}
def __init__(self, **kwargs):
kwargs['max_length'] = 8
super().__init__(**kwargs)
[docs] def clean(self, value):
value = super().clean(value)
if value:
value = value.upper().replace('-', '')
for sidecode, regex in self.SANITIZE_REGEXS.items():
match = regex.match(value)
if match:
return '-'.join(match.groups())
return value