2 FR-specific Form helpers
5 from django
.core
.validators
import EMPTY_VALUES
6 from django
.forms
import ValidationError
7 from django
.forms
.fields
import Field
, RegexField
, Select
8 from django
.utils
.encoding
import smart_unicode
9 from django
.utils
.translation
import ugettext_lazy
as _
12 phone_digits_re
= re
.compile(r
'^0\d(\s|\.)?(\d{2}(\s|\.)?){3}\d{2}$')
14 class FRZipCodeField(RegexField
):
15 default_error_messages
= {
16 'invalid': _('Enter a zip code in the format XXXXX.'),
19 def __init__(self
, *args
, **kwargs
):
20 super(FRZipCodeField
, self
).__init
__(r
'^\d{5}$',
21 max_length
=None, min_length
=None, *args
, **kwargs
)
23 class FRPhoneNumberField(Field
):
25 Validate local French phone number (not international ones)
26 The correct format is '0X XX XX XX XX'.
27 '0X.XX.XX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
30 default_error_messages
= {
31 'invalid': _('Phone numbers must be in 0X XX XX XX XX format.'),
34 def clean(self
, value
):
35 super(FRPhoneNumberField
, self
).clean(value
)
36 if value
in EMPTY_VALUES
:
38 value
= re
.sub('(\.|\s)', '', smart_unicode(value
))
39 m
= phone_digits_re
.search(value
)
41 return u
'%s %s %s %s %s' % (value
[0:2], value
[2:4], value
[4:6], value
[6:8], value
[8:10])
42 raise ValidationError(self
.error_messages
['invalid'])
44 class FRDepartmentSelect(Select
):
46 A Select widget that uses a list of FR departments as its choices.
48 def __init__(self
, attrs
=None):
49 from fr_department
import DEPARTMENT_ASCII_CHOICES
50 super(FRDepartmentSelect
, self
).__init
__(attrs
, choices
=DEPARTMENT_ASCII_CHOICES
)