Django

Code

Ticket #4122: localflavor_cl.diff

File localflavor_cl.diff, 5.3 kB (added by marijn <marijn@metronomo.cl>, 2 years ago)
  • django/contrib/localflavor/cl/forms.py

    old new  
     1""" 
     2Chile specific form helpers. 
     3""" 
     4from django.newforms import ValidationError 
     5from django.newforms.fields import RegexField, EMPTY_VALUES 
     6from django.utils.translation import gettext 
     7 
     8class CLRutField(RegexField): 
     9    """ 
     10    Chilean "Rol Unico Tributario" (RUT) field. This is the chilean national identification number. 
     11    """ 
     12    def __init__(self, *args, **kwargs): 
     13        if kwargs.get('strict')  == True: 
     14            del kwargs['strict'] 
     15            super(CLRutField, self).__init__(r'^(\d{1,2}\.)?\d{3}\.\d{3}-[\dkK]$', 
     16                error_message=gettext(u'Enter valid a Chilean Rut. The format is XX.XXX.XXX-X.'), 
     17                *args, **kwargs) 
     18        else: # We take it relaxed and format it     for the user, 
     19                  # accepting RUTs that are validate, but do not exist in the real world. 
     20            super(CLRutField, self).__init__(r'^[\d\.]{1,11}-?[\dkK]$', 
     21                error_message=gettext(u'Enter valid a Chilean RUT'), 
     22                *args, **kwargs) 
     23         
     24    def clean(self, value): 
     25        """ 
     26        Check and clean the chilean rut. 
     27        """ 
     28        super(CLRutField, self).clean(value) 
     29        if value in EMPTY_VALUES: 
     30            return u'' 
     31        (rut, verificador) = self._canonify(value) 
     32        if self._algorithm(rut) == verificador: 
     33            return self._format(rut, verificador) 
     34        else: 
     35            raise ValidationError(u'The Chilean RUT is not valid.') 
     36         
     37     
     38    def _algorithm(self, rut): 
     39        """ 
     40        Takes RUT in pure canonical form, calculates the verifier digit.  
     41        """ 
     42        suma  = 0 
     43        multi = 2 
     44        for r in rut[::-1]: 
     45            suma  += int (r) * multi 
     46            multi += 1 
     47            if multi == 8: 
     48                multi = 2 
     49        rest = suma % 11 
     50        rest = 11 - rest 
     51        if rest == 11: return '0' 
     52        elif rest == 10: return 'K' 
     53        else: return str(rest) 
     54 
     55    def _canonify(self, rut): 
     56        """ 
     57        Turns the rut into one normalized format. Returns a (rut, verifier) tuple. 
     58        """ 
     59        rut = str(rut) 
     60        rut = rut.replace(' ', '') 
     61        rut = rut.replace('.', '') 
     62        rut = rut.replace('-', '') 
     63        return (rut[:-1], rut[-1]) 
     64 
     65    def _format(self, code, verifier=None): 
     66        """ 
     67        Formats the rut from canonical form to the common string representation. 
     68        If verifier=None, then the last digit in 'code' is the verifier. 
     69        """ 
     70        if(verifier == None): 
     71            verifier = code[-1] 
     72            code = code[:-1] 
     73        while len(code) > 3 and (code.find('.') > 3 or code.find('.') == -1): 
     74            if code.find('.') == -1: 
     75                new_dot = -3 
     76            else: 
     77                new_dot = code.find('.')-3 
     78            code = code[:new_dot] +'.'+code[new_dot:]     
     79        return '%s-%s' % (code, verifier) 
     80 
  • tests/regressiontests/forms/localflavor.py

    old new  
    10521052<option value="VIC">Victoria</option> 
    10531053<option value="WA">Western Australia</option> 
    10541054</select> 
     1055 
     1056 
     1057## CLRutField ############################################################# 
     1058 
     1059CLRutField is a Field that checks the validity of the Chilean 
     1060personal identification number (RUT). It has two modes relaxed (default) and 
     1061strict.  
     1062 
     1063>>> from django.contrib.localflavor.cl.forms import CLRutField 
     1064>>> rut = CLRutField() 
     1065 
     1066>>> rut.clean('11-6') 
     1067'11-6' 
     1068>>> rut.clean('116') 
     1069'11-6' 
     1070 
     1071# valid format, bad verifier. 
     1072>>> rut.clean('11.111.111-0') 
     1073Traceback (most recent call last): 
     1074... 
     1075ValidationError: [u'The Chilean RUT is not valid.'] 
     1076>>> rut.clean('111') 
     1077Traceback (most recent call last): 
     1078... 
     1079ValidationError: [u'The Chilean RUT is not valid.'] 
     1080 
     1081>>> rut.clean('767484100') 
     1082'76.748.410-0' 
     1083>>> rut.clean('78.412.790-7') 
     1084'78.412.790-7' 
     1085>>> rut.clean('8.334.6043') 
     1086'8.334.604-3' 
     1087>>> rut.clean('76793310-K') 
     1088'76.793.310-K' 
     1089 
     1090Strict RUT usage (does not allow imposible values) 
     1091>>> rut = CLRutField(strict=True) 
     1092 
     1093>>> rut.clean('11-6') 
     1094Traceback (most recent call last): 
     1095... 
     1096ValidationError: [u'Enter valid a Chilean Rut. The format is XX.XXX.XXX-X.'] 
     1097 
     1098# valid format, bad verifier. 
     1099>>> rut.clean('11.111.111-0') 
     1100Traceback (most recent call last): 
     1101... 
     1102ValidationError: [u'The Chilean RUT is not valid.'] 
     1103 
     1104# Correct input, invalid format. 
     1105>>> rut.clean('767484100') 
     1106Traceback (most recent call last): 
     1107... 
     1108ValidationError: [u'Enter valid a Chilean Rut. The format is XX.XXX.XXX-X.'] 
     1109>>> rut.clean('78.412.790-7') 
     1110'78.412.790-7' 
     1111>>> rut.clean('8.334.6043') 
     1112Traceback (most recent call last): 
     1113... 
     1114ValidationError: [u'Enter valid a Chilean Rut. The format is XX.XXX.XXX-X.'] 
     1115>>> rut.clean('76793310-K') 
     1116Traceback (most recent call last): 
     1117... 
     1118ValidationError: [u'Enter valid a Chilean Rut. The format is XX.XXX.XXX-X.'] 
     1119 
    10551120"""