/django/contrib/localflavor/pe/forms.py

https://code.google.com/p/mango-py/ · Python · 72 lines · 42 code · 10 blank · 20 comment · 6 complexity · ffcda2f1a4eb6af70f3c39ee969451b4 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """
  3. PE-specific Form helpers.
  4. """
  5. from django.core.validators import EMPTY_VALUES
  6. from django.forms import ValidationError
  7. from django.forms.fields import RegexField, CharField, Select
  8. from django.utils.translation import ugettext_lazy as _
  9. class PERegionSelect(Select):
  10. """
  11. A Select widget that uses a list of Peruvian Regions as its choices.
  12. """
  13. def __init__(self, attrs=None):
  14. from pe_region import REGION_CHOICES
  15. super(PERegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
  16. class PEDNIField(CharField):
  17. """
  18. A field that validates `Documento Nacional de Identidad?? (DNI) numbers.
  19. """
  20. default_error_messages = {
  21. 'invalid': _("This field requires only numbers."),
  22. 'max_digits': _("This field requires 8 digits."),
  23. }
  24. def __init__(self, *args, **kwargs):
  25. super(PEDNIField, self).__init__(max_length=8, min_length=8, *args,
  26. **kwargs)
  27. def clean(self, value):
  28. """
  29. Value must be a string in the XXXXXXXX formats.
  30. """
  31. value = super(PEDNIField, self).clean(value)
  32. if value in EMPTY_VALUES:
  33. return u''
  34. if not value.isdigit():
  35. raise ValidationError(self.error_messages['invalid'])
  36. if len(value) != 8:
  37. raise ValidationError(self.error_messages['max_digits'])
  38. return value
  39. class PERUCField(RegexField):
  40. """
  41. This field validates a RUC (Registro Unico de Contribuyentes). A RUC is of
  42. the form XXXXXXXXXXX.
  43. """
  44. default_error_messages = {
  45. 'invalid': _("This field requires only numbers."),
  46. 'max_digits': _("This field requires 11 digits."),
  47. }
  48. def __init__(self, *args, **kwargs):
  49. super(PERUCField, self).__init__(max_length=11, min_length=11, *args,
  50. **kwargs)
  51. def clean(self, value):
  52. """
  53. Value must be an 11-digit number.
  54. """
  55. value = super(PERUCField, self).clean(value)
  56. if value in EMPTY_VALUES:
  57. return u''
  58. if not value.isdigit():
  59. raise ValidationError(self.error_messages['invalid'])
  60. if len(value) != 11:
  61. raise ValidationError(self.error_messages['max_digits'])
  62. return value