PageRenderTime 52ms CodeModel.GetById 21ms app.highlight 22ms RepoModel.GetById 0ms app.codeStats 0ms

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

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