Ticket #3945: django_cnpj_localflavor.diff

File django_cnpj_localflavor.diff, 1.6 KB (added by onaiort@…, 17 years ago)

Initial implementation

  • django/contrib/localflavor/br/forms.py

     
    3737    def __init__(self, attrs=None):
    3838        from br_states import STATE_CHOICES # relative import
    3939        super(BRStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
     40
     41def DV_maker(v):
     42    if v >= 2:
     43        return 11 - v
     44    return 0
     45
     46class BRCNPJField(Field):
     47    def clean(self, value):
     48        """ value can be either a string in the format XX.XXX.XXX/XXXX-XX
     49        or a group of 14 characters. """
     50        if not value.isdigit():
     51            value = re.sub("[-/\.]", "", value)
     52        if len(value) != 14:
     53            raise ValidationError(
     54                gettext(u"This field requires at least 14 digits"))
     55        orig_value = value[:]
     56        orig_dv = value[-2:]
     57
     58        new_1dv = sum([i * int(value[idx])
     59                         for idx, i in enumerate(range(5, 1, -1) +
     60                                                 range(9, 1, -1))])
     61        new_1dv = DV_maker(new_1dv % 11)
     62        value = value[:-2] + str(new_1dv) + value[-1]
     63        new_2dv = sum([i * int(value[idx])
     64                         for idx, i in enumerate(range(6, 1, -1) +
     65                                                 range(9, 1, -1))])
     66        new_2dv = DV_maker(new_2dv % 11)
     67        value = value[:-1] + str(new_2dv)
     68        if (value[-2:] != orig_dv):
     69            raise ValidationError(gettext(u"Invalid CNPJ number"))
     70
     71        return orig_value
     72
Back to Top