PageRenderTime 19ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/django/contrib/localflavor/it/forms.py

https://code.google.com/p/mango-py/
Python | 84 lines | 67 code | 5 blank | 12 comment | 0 complexity | e627aa4eebbc3c55769c29f91bb4fd10 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. """
  2. IT-specific Form helpers
  3. """
  4. from django.core.validators import EMPTY_VALUES
  5. from django.forms import ValidationError
  6. from django.forms.fields import Field, RegexField, Select
  7. from django.utils.translation import ugettext_lazy as _
  8. from django.utils.encoding import smart_unicode
  9. from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit
  10. import re
  11. class ITZipCodeField(RegexField):
  12. default_error_messages = {
  13. 'invalid': _('Enter a valid zip code.'),
  14. }
  15. def __init__(self, *args, **kwargs):
  16. super(ITZipCodeField, self).__init__(r'^\d{5}$',
  17. max_length=None, min_length=None, *args, **kwargs)
  18. class ITRegionSelect(Select):
  19. """
  20. A Select widget that uses a list of IT regions as its choices.
  21. """
  22. def __init__(self, attrs=None):
  23. from it_region import REGION_CHOICES
  24. super(ITRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
  25. class ITProvinceSelect(Select):
  26. """
  27. A Select widget that uses a list of IT provinces as its choices.
  28. """
  29. def __init__(self, attrs=None):
  30. from it_province import PROVINCE_CHOICES
  31. super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
  32. class ITSocialSecurityNumberField(RegexField):
  33. """
  34. A form field that validates Italian Social Security numbers (codice fiscale).
  35. For reference see http://www.agenziaentrate.it/ and search for
  36. 'Informazioni sulla codificazione delle persone fisiche'.
  37. """
  38. default_error_messages = {
  39. 'invalid': _(u'Enter a valid Social Security number.'),
  40. }
  41. def __init__(self, *args, **kwargs):
  42. super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$',
  43. max_length=None, min_length=None, *args, **kwargs)
  44. def clean(self, value):
  45. value = super(ITSocialSecurityNumberField, self).clean(value)
  46. if value in EMPTY_VALUES:
  47. return u''
  48. value = re.sub('\s', u'', value).upper()
  49. try:
  50. check_digit = ssn_check_digit(value)
  51. except ValueError:
  52. raise ValidationError(self.error_messages['invalid'])
  53. if not value[15] == check_digit:
  54. raise ValidationError(self.error_messages['invalid'])
  55. return value
  56. class ITVatNumberField(Field):
  57. """
  58. A form field that validates Italian VAT numbers (partita IVA).
  59. """
  60. default_error_messages = {
  61. 'invalid': _(u'Enter a valid VAT number.'),
  62. }
  63. def clean(self, value):
  64. value = super(ITVatNumberField, self).clean(value)
  65. if value in EMPTY_VALUES:
  66. return u''
  67. try:
  68. vat_number = int(value)
  69. except ValueError:
  70. raise ValidationError(self.error_messages['invalid'])
  71. vat_number = str(vat_number).zfill(11)
  72. check_digit = vat_number_check_digit(vat_number[0:10])
  73. if not vat_number[10] == check_digit:
  74. raise ValidationError(self.error_messages['invalid'])
  75. return smart_unicode(vat_number)