App Engine Python SDK version 1.7.4 (2)
[gae.git] / python / lib / django_1_4 / django / contrib / localflavor / it / forms.py
blob0060b486bdc6459df3b84063a9319637980d81f8
1 """
2 IT-specific Form helpers
3 """
5 from __future__ import absolute_import
7 import re
9 from django.contrib.localflavor.it.it_province import PROVINCE_CHOICES
10 from django.contrib.localflavor.it.it_region import REGION_CHOICES
11 from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit
12 from django.core.validators import EMPTY_VALUES
13 from django.forms import ValidationError
14 from django.forms.fields import Field, RegexField, Select
15 from django.utils.translation import ugettext_lazy as _
16 from django.utils.encoding import smart_unicode
19 class ITZipCodeField(RegexField):
20 default_error_messages = {
21 'invalid': _('Enter a valid zip code.'),
23 def __init__(self, max_length=None, min_length=None, *args, **kwargs):
24 super(ITZipCodeField, self).__init__(r'^\d{5}$',
25 max_length, min_length, *args, **kwargs)
27 class ITRegionSelect(Select):
28 """
29 A Select widget that uses a list of IT regions as its choices.
30 """
31 def __init__(self, attrs=None):
32 super(ITRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
34 class ITProvinceSelect(Select):
35 """
36 A Select widget that uses a list of IT provinces as its choices.
37 """
38 def __init__(self, attrs=None):
39 super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
41 class ITSocialSecurityNumberField(RegexField):
42 """
43 A form field that validates Italian Social Security numbers (codice fiscale).
44 For reference see http://www.agenziaentrate.it/ and search for
45 'Informazioni sulla codificazione delle persone fisiche'.
46 """
47 default_error_messages = {
48 'invalid': _(u'Enter a valid Social Security number.'),
51 def __init__(self, max_length=None, min_length=None, *args, **kwargs):
52 super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$',
53 max_length, min_length, *args, **kwargs)
55 def clean(self, value):
56 value = super(ITSocialSecurityNumberField, self).clean(value)
57 if value in EMPTY_VALUES:
58 return u''
59 value = re.sub('\s', u'', value).upper()
60 try:
61 check_digit = ssn_check_digit(value)
62 except ValueError:
63 raise ValidationError(self.error_messages['invalid'])
64 if not value[15] == check_digit:
65 raise ValidationError(self.error_messages['invalid'])
66 return value
68 class ITVatNumberField(Field):
69 """
70 A form field that validates Italian VAT numbers (partita IVA).
71 """
72 default_error_messages = {
73 'invalid': _(u'Enter a valid VAT number.'),
76 def clean(self, value):
77 value = super(ITVatNumberField, self).clean(value)
78 if value in EMPTY_VALUES:
79 return u''
80 try:
81 vat_number = int(value)
82 except ValueError:
83 raise ValidationError(self.error_messages['invalid'])
84 vat_number = str(vat_number).zfill(11)
85 check_digit = vat_number_check_digit(vat_number[0:10])
86 if not vat_number[10] == check_digit:
87 raise ValidationError(self.error_messages['invalid'])
88 return smart_unicode(vat_number)