~canonical-django/canonical-django/project-template

« back to all changes in this revision

Viewing changes to trunk/python-packages/django/contrib/localflavor/fr/forms.py

  • Committer: Matthew Nuzum
  • Date: 2008-11-13 05:46:03 UTC
  • Revision ID: matthew.nuzum@canonical.com-20081113054603-v0kvr6z6xyexvqt3
adding to version control

Show diffs side-by-side

added added

removed removed

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