PageRenderTime 47ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/django/contrib/localflavor/fi/forms.py

https://code.google.com/p/mango-py/
Python | 51 lines | 40 code | 5 blank | 6 comment | 1 complexity | fb137648204a321a8433fd6c797b1c0c MD5 | raw file
Possible License(s): BSD-3-Clause
  1. """
  2. FI-specific Form helpers
  3. """
  4. import re
  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.translation import ugettext_lazy as _
  9. class FIZipCodeField(RegexField):
  10. default_error_messages = {
  11. 'invalid': _('Enter a zip code in the format XXXXX.'),
  12. }
  13. def __init__(self, *args, **kwargs):
  14. super(FIZipCodeField, self).__init__(r'^\d{5}$',
  15. max_length=None, min_length=None, *args, **kwargs)
  16. class FIMunicipalitySelect(Select):
  17. """
  18. A Select widget that uses a list of Finnish municipalities as its choices.
  19. """
  20. def __init__(self, attrs=None):
  21. from fi_municipalities import MUNICIPALITY_CHOICES
  22. super(FIMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
  23. class FISocialSecurityNumber(Field):
  24. default_error_messages = {
  25. 'invalid': _('Enter a valid Finnish social security number.'),
  26. }
  27. def clean(self, value):
  28. super(FISocialSecurityNumber, self).clean(value)
  29. if value in EMPTY_VALUES:
  30. return u''
  31. checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
  32. result = re.match(r"""^
  33. (?P<date>([0-2]\d|3[01])
  34. (0\d|1[012])
  35. (\d{2}))
  36. [A+-]
  37. (?P<serial>(\d{3}))
  38. (?P<checksum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
  39. if not result:
  40. raise ValidationError(self.error_messages['invalid'])
  41. gd = result.groupdict()
  42. checksum = int(gd['date'] + gd['serial'])
  43. if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper():
  44. return u'%s' % value.upper()
  45. raise ValidationError(self.error_messages['invalid'])