app/django/contrib/localflavor/fr/forms.py
changeset 54 03e267d67478
child 323 ff1a9aa48cfd
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     1 """
       
     2 FR-specific Form helpers
       
     3 """
       
     4 
       
     5 from django.newforms import ValidationError
       
     6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
       
     7 from django.utils.encoding import smart_unicode
       
     8 from django.utils.translation import ugettext
       
     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': ugettext('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