Ticket #3866: more_it_fields.diff
File more_it_fields.diff, 7.1 KB (added by , 18 years ago) |
---|
-
django/contrib/localflavor/it/util.py
1 from django.utils.translation import gettext 2 3 FISCAL_CODE_EVEN_CHARS = { 4 '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 5 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9, 6 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 7 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25 8 } 9 FISCAL_CODE_ODD_CHARS = { 10 '0': 1, '1': 0, '2': 5, '3': 7, '4': 9, '5': 13, '6': 15, '7': 17, '8': 19, '9': 21, 11 'A': 1, 'B': 0, 'C': 5, 'D': 7, 'E': 9, 'F': 13, 'G': 15, 'H': 17, 'I': 19, 'J': 21, 12 'K': 2, 'L': 4, 'M': 18, 'N': 20, 'O': 11, 'P': 3, 'Q': 6, 'R': 8, 'S': 12, 13 'T': 14, 'U': 16, 'V': 10, 'W': 22, 'X': 25, 'Y': 24, 'Z': 23 14 } 15 # Chars from 'A' to 'Z' 16 FISCAL_CODE_CHECK_DIGITS = [chr(x) for x in range(65, 91)] 17 18 19 def fiscal_code_check_digit(fiscal_code): 20 """ Calculate italian fiscal code check digit. """ 21 code = fiscal_code.upper() 22 total = 0 23 for i in range(0,15): 24 try: 25 if i % 2 == 0: 26 total += FISCAL_CODE_ODD_CHARS[code[i]] 27 else: 28 total += FISCAL_CODE_EVEN_CHARS[code[i]] 29 except KeyError: 30 msg = gettext(u" Character '%(char)s' is not allowed.") % {'char': code[i]} 31 raise ValueError(msg) 32 return FISCAL_CODE_CHECK_DIGITS[total % 26] 33 34 def vat_number_check_digit(vat_number): 35 """ Calculate italian vat number check digit. """ 36 normalized_vat_number = str(vat_number).zfill(10) 37 total = 0 38 for i in range(0, 10, 2): 39 total += int(normalized_vat_number[i]) 40 for i in range(1, 11, 2): 41 quotient , remainder = divmod(int(normalized_vat_number[i]) * 2, 10) 42 total += quotient + remainder 43 return str((10 - total % 10) % 10) -
django/contrib/localflavor/it/forms.py
5 5 from django.newforms import ValidationError 6 6 from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES 7 7 from django.utils.translation import gettext 8 from django.utils.encoding import smart_unicode 9 from django.contrib.localflavor.it.util import fiscal_code_check_digit, vat_number_check_digit 8 10 import re 9 11 10 12 class ITZipCodeField(RegexField): … … 29 31 def __init__(self, attrs=None): 30 32 from it_province import PROVINCE_CHOICES # relative import 31 33 super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) 34 35 class ITFiscalCodeField(Field): 36 """ 37 A form field that validates it's input in Italian fiscal code. 38 """ 39 def clean(self, value): 40 super(ITFiscalCodeField, self).clean(value) 41 if value in EMPTY_VALUES: 42 return u'' 43 err_msg = gettext(u'Enter a valid fiscal code.') 44 fiscal_code = value.upper() 45 fiscal_code = fiscal_code.replace(' ', '') 46 fiscal_code = fiscal_code.replace('-', '') 47 if not len(fiscal_code) == 16: 48 raise ValidationError(err_msg) 49 try: 50 check_digit = fiscal_code_check_digit(fiscal_code) 51 except ValueError: 52 raise ValidationError(err_msg) 53 if not fiscal_code[15] == check_digit: 54 raise ValidationError(err_msg) 55 return smart_unicode(fiscal_code) 56 57 class ITVatNumberField(Field): 58 """ 59 A form field that validates it's input in Italian VAT number. 60 """ 61 def clean(self, value): 62 super(ITVatNumberField, self).clean(value) 63 if value in EMPTY_VALUES: 64 return u'' 65 err_msg = gettext(u'Enter a valid VAT number.') 66 try: 67 vat_number = int(value) 68 except ValueError: 69 raise ValidationError(err_msg) 70 vat_number = str(vat_number).zfill(11) 71 check_digit = vat_number_check_digit(vat_number[0:10]) 72 if not vat_number[10] == check_digit: 73 raise ValidationError(err_msg) 74 return smart_unicode(vat_number) -
tests/regressiontests/forms/localflavor.py
642 642 >>> w.render('regions', 'PMN') 643 643 u'<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 644 645 # ITFiscalCodeField ########################################################## 646 647 >>> from django.contrib.localflavor.it.forms import ITFiscalCodeField 648 >>> f = ITFiscalCodeField() 649 >>> f.clean('RVLMSM71L12E897Q') 650 u'RVLMSM71L12E897Q' 651 >>> f.clean('rvlmsm71l12e897q') 652 u'RVLMSM71L12E897Q' 653 >>> f.clean('RVL MSM 71L12 E897Q') 654 u'RVLMSM71L12E897Q' 655 >>> f.clean('RVL-MSM-71L12-E897Q') 656 u'RVLMSM71L12E897Q' 657 >>> f.clean('RVLMSM71L12E897A') 658 Traceback (most recent call last): 659 ... 660 ValidationError: [u'Enter a valid fiscal code.'] 661 >>> f.clean('%VLMSM71L12E897Q') 662 Traceback (most recent call last): 663 ... 664 ValidationError: [u'Enter a valid fiscal code.'] 665 666 # ITVatNumberField ########################################################### 667 668 >>> from django.contrib.localflavor.it.forms import ITVatNumberField 669 >>> f = ITVatNumberField() 670 >>> f.clean('07973780013') 671 u'07973780013' 672 >>> f.clean('7973780013') 673 u'07973780013' 674 >>> f.clean(7973780013) 675 u'07973780013' 676 >>> f.clean('07973780014') 677 Traceback (most recent call last): 678 ... 679 ValidationError: [u'Enter a valid VAT number.'] 680 >>> f.clean('A7973780013') 681 Traceback (most recent call last): 682 ... 683 ValidationError: [u'Enter a valid VAT number.'] 684 645 685 # FIZipCodeField ############################################################# 646 686 647 687 FIZipCodeField validates that the data is a valid FI zipcode. -
AUTHORS
174 174 J. Rademaker 175 175 Michael Radziej <mir@noris.de> 176 176 ramiro 177 Massimiliano Ravelli <massimiliano.ravelli@gmail.com> 177 178 Brian Ray <http://brianray.chipy.org/> 178 179 remco@diji.biz 179 180 rhettg@gmail.com