Django

Code

Changeset 5018

Show
Ignore:
Timestamp:
04/17/07 08:37:45 (1 year ago)
Author:
russellm
Message:

Fixed #3866 -- Added Italian Social Security and VAT input fields to localflavor. Thanks, Massimiliano Ravelli.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/AUTHORS

    r4987 r5018  
    175175    Michael Radziej <mir@noris.de> 
    176176    ramiro 
     177    Massimiliano Ravelli <massimiliano.ravelli@gmail.com> 
    177178    Brian Ray <http://brianray.chipy.org/> 
    178179    remco@diji.biz 
  • django/trunk/django/contrib/localflavor/it/forms.py

    r4918 r5018  
    66from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 
    77from django.utils.translation import gettext 
     8from django.utils.encoding import smart_unicode 
     9from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit 
    810import re 
    911 
     
    1214        super(ITZipCodeField, self).__init__(r'^\d{5}$', 
    1315        max_length=None, min_length=None, 
    14         error_message=gettext(u'Enter a zip code in the format XXXXX.'), 
     16        error_message=gettext(u'Enter a valid zip code.'), 
    1517        *args, **kwargs) 
    1618 
     
    3032        from it_province import PROVINCE_CHOICES # relative import 
    3133        super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) 
     34 
     35class ITSocialSecurityNumberField(RegexField): 
     36    """ 
     37    A form field that validates Italian Social Security numbers (codice fiscale). 
     38    For reference see http://www.agenziaentrate.it/ and search for 
     39    'Informazioni sulla codificazione delle persone fisiche'. 
     40    """ 
     41    err_msg = gettext(u'Enter a valid Social Security number.') 
     42    def __init__(self, *args, **kwargs): 
     43        super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$', 
     44        max_length=None, min_length=None, error_message=self.err_msg, 
     45        *args, **kwargs) 
     46 
     47    def clean(self, value): 
     48        value = super(ITSocialSecurityNumberField, self).clean(value) 
     49        if value == u'': 
     50            return value 
     51        value = re.sub('\s', u'', value).upper() 
     52        try: 
     53            check_digit = ssn_check_digit(value) 
     54        except ValueError: 
     55            raise ValidationError(self.err_msg) 
     56        if not value[15] == check_digit: 
     57            raise ValidationError(self.err_msg) 
     58        return value 
     59 
     60class ITVatNumberField(Field): 
     61    """ 
     62    A form field that validates Italian VAT numbers (partita IVA). 
     63    """ 
     64    def clean(self, value): 
     65        value = super(ITVatNumberField, self).clean(value) 
     66        if value == u'': 
     67            return value 
     68        err_msg = gettext(u'Enter a valid VAT number.') 
     69        try: 
     70            vat_number = int(value) 
     71        except ValueError: 
     72            raise ValidationError(err_msg) 
     73        vat_number = str(vat_number).zfill(11) 
     74        check_digit = vat_number_check_digit(vat_number[0:10]) 
     75        if not vat_number[10] == check_digit: 
     76            raise ValidationError(err_msg) 
     77        return smart_unicode(vat_number) 
  • django/trunk/tests/regressiontests/forms/localflavor.py

    r4993 r5018  
    634634Traceback (most recent call last): 
    635635... 
    636 ValidationError: [u'Enter a zip code in the format XXXXX.'] 
     636ValidationError: [u'Enter a valid zip code.'] 
    637637 
    638638# ITRegionSelect ############################################################# 
     
    642642>>> w.render('regions', 'PMN') 
    643643u'<select name="regions">\n<option value="ABR">Abruzzo</option>\n<option value="BAS">Basilicata</option>\n<option value="CAL">Calabria</option>\n<option value="CAM">Campania</option>\n<option value="EMR">Emilia-Romagna</option>\n<option value="FVG">Friuli-Venezia Giulia</option>\n<option value="LAZ">Lazio</option>\n<option value="LIG">Liguria</option>\n<option value="LOM">Lombardia</option>\n<option value="MAR">Marche</option>\n<option value="MOL">Molise</option>\n<option value="PMN" selected="selected">Piemonte</option>\n<option value="PUG">Puglia</option>\n<option value="SAR">Sardegna</option>\n<option value="SIC">Sicilia</option>\n<option value="TOS">Toscana</option>\n<option value="TAA">Trentino-Alto Adige</option>\n<option value="UMB">Umbria</option>\n<option value="VAO">Valle d\u2019Aosta</option>\n<option value="VEN">Veneto</option>\n</select>' 
     644 
     645# ITSocialSecurityNumberField ################################################# 
     646 
     647>>> from django.contrib.localflavor.it.forms import ITSocialSecurityNumberField 
     648>>> f = ITSocialSecurityNumberField() 
     649>>> f.clean('LVSGDU99T71H501L') 
     650u'LVSGDU99T71H501L' 
     651>>> f.clean('LBRRME11A01L736W') 
     652u'LBRRME11A01L736W' 
     653>>> f.clean('lbrrme11a01l736w') 
     654u'LBRRME11A01L736W' 
     655>>> f.clean('LBR RME 11A01 L736W') 
     656u'LBRRME11A01L736W' 
     657>>> f.clean('LBRRME11A01L736A') 
     658Traceback (most recent call last): 
     659... 
     660ValidationError: [u'Enter a valid Social Security number.'] 
     661>>> f.clean('%BRRME11A01L736W') 
     662Traceback (most recent call last): 
     663... 
     664ValidationError: [u'Enter a valid Social Security number.'] 
     665 
     666# ITVatNumberField ########################################################### 
     667 
     668>>> from django.contrib.localflavor.it.forms import ITVatNumberField 
     669>>> f = ITVatNumberField() 
     670>>> f.clean('07973780013') 
     671u'07973780013' 
     672>>> f.clean('7973780013') 
     673u'07973780013' 
     674>>> f.clean(7973780013) 
     675u'07973780013' 
     676>>> f.clean('07973780014') 
     677Traceback (most recent call last): 
     678... 
     679ValidationError: [u'Enter a valid VAT number.'] 
     680>>> f.clean('A7973780013') 
     681Traceback (most recent call last): 
     682... 
     683ValidationError: [u'Enter a valid VAT number.'] 
    644684 
    645685# FIZipCodeField #############################################################