72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
|
"""
|
||
|
Belgium-specific Form helpers
|
||
|
"""
|
||
|
import re
|
||
|
|
||
|
from django.core.validators import EMPTY_VALUES
|
||
|
from django.forms import ValidationError
|
||
|
from django.forms.fields import RegexField, Select
|
||
|
from django.utils.translation import ugettext_lazy as _
|
||
|
|
||
|
class BEPostalCodeField(RegexField):
|
||
|
"""
|
||
|
A form field that validates its input as a belgium postal code.
|
||
|
|
||
|
Belgium postal code is a 4 digits string. The first digit indicates
|
||
|
the province (except for the 3ddd numbers that are shared by the
|
||
|
eastern part of Flemish Brabant and Limburg and the and 1ddd that
|
||
|
are shared by the Brussels Capital Region, the western part of
|
||
|
Flemish Brabant and Walloon Brabant)
|
||
|
"""
|
||
|
default_error_messages = {
|
||
|
'invalid': _(
|
||
|
'Enter a valid postal code in the range and format 1XXX - 9XXX.'),
|
||
|
}
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(BEPostalCodeField, self).__init__(r'^[1-9]\d{3}$',
|
||
|
max_length=None, min_length=None, *args, **kwargs)
|
||
|
|
||
|
class BEPhoneNumberField(RegexField):
|
||
|
"""
|
||
|
A form field that validates its input as a belgium phone number.
|
||
|
|
||
|
Landlines have a seven-digit subscriber number and a one-digit area code,
|
||
|
while smaller cities have a six-digit subscriber number and a two-digit
|
||
|
area code. Cell phones have a six-digit subscriber number and a two-digit
|
||
|
area code preceeded by the number 4.
|
||
|
0d ddd dd dd, 0d/ddd.dd.dd, 0d.ddd.dd.dd,
|
||
|
0dddddddd - dialling a bigger city
|
||
|
0dd dd dd dd, 0dd/dd.dd.dd, 0dd.dd.dd.dd,
|
||
|
0dddddddd - dialling a smaller city
|
||
|
04dd ddd dd dd, 04dd/ddd.dd.dd,
|
||
|
04dd.ddd.dd.dd, 04ddddddddd - dialling a mobile number
|
||
|
"""
|
||
|
default_error_messages = {
|
||
|
'invalid': _('Enter a valid phone number in one of the formats '
|
||
|
'0x xxx xx xx, 0xx xx xx xx, 04xx xx xx xx, '
|
||
|
'0x/xxx.xx.xx, 0xx/xx.xx.xx, 04xx/xx.xx.xx, '
|
||
|
'0x.xxx.xx.xx, 0xx.xx.xx.xx, 04xx.xx.xx.xx, '
|
||
|
'0xxxxxxxx or 04xxxxxxxx.'),
|
||
|
}
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(BEPhoneNumberField, self).__init__(r'^[0]\d{1}[/. ]?\d{3}[. ]\d{2}[. ]?\d{2}$|^[0]\d{2}[/. ]?\d{2}[. ]?\d{2}[. ]?\d{2}$|^[0][4]\d{2}[/. ]?\d{2}[. ]?\d{2}[. ]?\d{2}$',
|
||
|
max_length=None, min_length=None, *args, **kwargs)
|
||
|
|
||
|
class BERegionSelect(Select):
|
||
|
"""
|
||
|
A Select widget that uses a list of belgium regions as its choices.
|
||
|
"""
|
||
|
def __init__(self, attrs=None):
|
||
|
from be_regions import REGION_CHOICES
|
||
|
super(BERegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
|
||
|
|
||
|
class BEProvinceSelect(Select):
|
||
|
"""
|
||
|
A Select widget that uses a list of belgium provinces as its choices.
|
||
|
"""
|
||
|
def __init__(self, attrs=None):
|
||
|
from be_provinces import PROVINCE_CHOICES
|
||
|
super(BEProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
|