| 1 | Index: django/contrib/localflavor/pl/forms.py
 | 
|---|
| 2 | ===================================================================
 | 
|---|
| 3 | --- django/contrib/localflavor/pl/forms.py      (wersja 6397)
 | 
|---|
| 4 | +++ django/contrib/localflavor/pl/forms.py      (kopia robocza)
 | 
|---|
| 5 | @@ -6,6 +6,8 @@
 | 
|---|
| 6 |  from django.newforms.fields import Select, RegexField
 | 
|---|
| 7 |  from django.utils.translation import ugettext as _
 | 
|---|
| 8 |  
 | 
|---|
| 9 | +import re
 | 
|---|
| 10 | +
 | 
|---|
| 11 |  class PLVoivodeshipSelect(Select):
 | 
|---|
| 12 |      """
 | 
|---|
| 13 |      A select widget with list of Polish voivodeships (administrative provinces)
 | 
|---|
| 14 | @@ -64,13 +66,85 @@
 | 
|---|
| 15 |      """
 | 
|---|
| 16 |      A form field that validates as Polish Tax Number (NIP).
 | 
|---|
| 17 |      Valid forms are: XXX-XXX-YY-YY or XX-XX-YYY-YYY.
 | 
|---|
| 18 | +
 | 
|---|
| 19 | +    Checksum algorithm based on documentation at http://wipos.p.lodz.pl/zylla/ut/nip-rego.html
 | 
|---|
| 20 |      """
 | 
|---|
| 21 | +
 | 
|---|
| 22 | +    def has_valid_checksum(self, number):
 | 
|---|
| 23 | +        """
 | 
|---|
| 24 | +        Calculates a checksum with the provided algorithm.
 | 
|---|
| 25 | +        """
 | 
|---|
| 26 | +        multiple_table = (6, 5, 7, 2, 3, 4, 5, 6, 7)
 | 
|---|
| 27 | +        result = 0
 | 
|---|
| 28 | +        for i in range(len(number)-1):
 | 
|---|
| 29 | +            result += int(number[i])*multiple_table[i]
 | 
|---|
| 30 | +
 | 
|---|
| 31 | +        result %= 11
 | 
|---|
| 32 | +
 | 
|---|
| 33 | +        if result == int(number[-1]):
 | 
|---|
| 34 | +            return True
 | 
|---|
| 35 | +        else:
 | 
|---|
| 36 | +            return False
 | 
|---|
| 37 | +
 | 
|---|
| 38 |      def __init__(self, *args, **kwargs):
 | 
|---|
| 39 |          super(PLTaxNumberField, self).__init__(r'^\d{3}-\d{3}-\d{2}-\d{2}$|^\d{2}-\d{2}-\d{3}-\d{3}$',
 | 
|---|
| 40 |              max_length=None, min_length=None,
 | 
|---|
| 41 |              error_message=_(u'Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX.'),  *args, **kwargs)
 | 
|---|
| 42 |  
 | 
|---|
| 43 | +    def clean(self,value):
 | 
|---|
| 44 | +        super(PLTaxNumberField, self).clean(value)
 | 
|---|
| 45 | +        value = re.sub("[-]","",value)
 | 
|---|
| 46 | +        if not self.has_valid_checksum(value):
 | 
|---|
| 47 | +            raise ValidationError(_(u'Wrong checksum for the Tax Number (NIP).'))
 | 
|---|
| 48 | +        return u'%s' % value
 | 
|---|
| 49 |  
 | 
|---|
| 50 | +class PLNationalBusinessRegisterField(RegexField):
 | 
|---|
| 51 | +    """ 
 | 
|---|
| 52 | +    A form field that validated as Polish National Official Business Register Number (REGON)
 | 
|---|
| 53 | +    Valid forms are: 7 or 9 digits number
 | 
|---|
| 54 | +
 | 
|---|
| 55 | +    More on the field: http://www.stat.gov.pl/bip/regon_ENG_HTML.htm
 | 
|---|
| 56 | +
 | 
|---|
| 57 | +    The checksum algorithm is documented at http://wipos.p.lodz.pl/zylla/ut/nip-rego.html
 | 
|---|
| 58 | +    """
 | 
|---|
| 59 | +    
 | 
|---|
| 60 | +    def has_valid_checksum(self, number):
 | 
|---|
| 61 | +        """
 | 
|---|
| 62 | +        Calculates a checksum with the provided algorithm.
 | 
|---|
| 63 | +        """
 | 
|---|
| 64 | +        multiple_table_7 = (2, 3, 4, 5, 6, 7)
 | 
|---|
| 65 | +        multiple_table_9 = (8, 9, 2, 3, 4, 5, 6, 7)
 | 
|---|
| 66 | +        result = 0
 | 
|---|
| 67 | +        
 | 
|---|
| 68 | +        if len(number) == 7:
 | 
|---|
| 69 | +            multiple_table = multiple_table_7
 | 
|---|
| 70 | +        else:
 | 
|---|
| 71 | +            multiple_table = multiple_table_9
 | 
|---|
| 72 | +
 | 
|---|
| 73 | +        for i in range(len(number)-1):
 | 
|---|
| 74 | +            result += int(number[i])*multiple_table[i]
 | 
|---|
| 75 | +
 | 
|---|
| 76 | +        result %= 11
 | 
|---|
| 77 | +
 | 
|---|
| 78 | +        if result == 10:
 | 
|---|
| 79 | +            result = 0
 | 
|---|
| 80 | +
 | 
|---|
| 81 | +        if result  == int(number[-1]):
 | 
|---|
| 82 | +            return True
 | 
|---|
| 83 | +        else:
 | 
|---|
| 84 | +            return False
 | 
|---|
| 85 | +
 | 
|---|
| 86 | +    def __init__(self, *args, **kwargs):
 | 
|---|
| 87 | +        super(PLNationalBusinessRegisterField, self).__init__(r'^\d{7,9}$',
 | 
|---|
| 88 | +            max_length=None, min_length=None, error_message=_(u'National Business Register Number (REGON) consists of 7 or 9 digits.'),
 | 
|---|
| 89 | +            *args, **kwargs)
 | 
|---|
| 90 | +    
 | 
|---|
| 91 | +    def clean(self,value):
 | 
|---|
| 92 | +        super(PLNationalBusinessRegisterField, self).clean(value)
 | 
|---|
| 93 | +        if not self.has_valid_checksum(value):
 | 
|---|
| 94 | +            raise ValidationError(_(u'Wrong checksum for the National Business Register Number (REGON).'))
 | 
|---|
| 95 | +        return u'%s' % value
 | 
|---|
| 96 | +
 | 
|---|
| 97 |  class PLPostalCodeField(RegexField):
 | 
|---|
| 98 |      """
 | 
|---|
| 99 |      A form field that validates as Polish postal code.
 | 
|---|
| 100 | Index: tests/regressiontests/forms/localflavor/pl.py
 | 
|---|
| 101 | ===================================================================
 | 
|---|
| 102 | --- tests/regressiontests/forms/localflavor/pl.py       (wersja 6397)
 | 
|---|
| 103 | +++ tests/regressiontests/forms/localflavor/pl.py       (kopia robocza)
 | 
|---|
| 104 | @@ -35,11 +35,15 @@
 | 
|---|
| 105 |  Traceback (most recent call last):
 | 
|---|
| 106 |  ...
 | 
|---|
| 107 |  ValidationError: [u'Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX.']
 | 
|---|
| 108 | ->>> f.clean('43-34-234-323')
 | 
|---|
| 109 | -u'43-34-234-323'
 | 
|---|
| 110 | ->>> f.clean('433-344-24-23')
 | 
|---|
| 111 | -u'433-344-24-23'
 | 
|---|
| 112 | -
 | 
|---|
| 113 | +>>> f.clean('64-62-414-124')
 | 
|---|
| 114 | +u'6462414124'
 | 
|---|
| 115 | +>>> f.clean('646-241-41-24')
 | 
|---|
| 116 | +u'6462414124'
 | 
|---|
| 117 | +>>> f.clean('646-241-41-23')
 | 
|---|
| 118 | +Traceback (most recent call last):
 | 
|---|
| 119 | +...
 | 
|---|
| 120 | +ValidationError: [u'Wrong checksum for the Tax Number (NIP).']
 | 
|---|
| 121 | + 
 | 
|---|
| 122 |  # PLNationalIdentificationNumberField ############################################
 | 
|---|
| 123 |  
 | 
|---|
| 124 |  >>> from django.contrib.localflavor.pl.forms import PLNationalIdentificationNumberField
 | 
|---|
| 125 | @@ -58,4 +62,20 @@
 | 
|---|
| 126 |  Traceback (most recent call last):
 | 
|---|
| 127 |  ...
 | 
|---|
| 128 |  ValidationError: [u'National Identification Number consists of 11 digits.']
 | 
|---|
| 129 | +
 | 
|---|
| 130 | +# PLNationalBusinessRegisterField ################################################
 | 
|---|
| 131 | +
 | 
|---|
| 132 | +>>> from django.contrib.localflavor.pl.forms import PLNationalBusinessRegisterField
 | 
|---|
| 133 | +>>> f = PLNationalBusinessRegisterField()
 | 
|---|
| 134 | +>>> f.clean('590096454')
 | 
|---|
| 135 | +u'590096454'
 | 
|---|
| 136 | +>>> f.clean('590096453')
 | 
|---|
| 137 | +Traceback (most recent call last):
 | 
|---|
| 138 | +...
 | 
|---|
| 139 | +ValidationError: [u'Wrong checksum for the National Business Register Number (REGON).']
 | 
|---|
| 140 | +>>> f.clean('590096')
 | 
|---|
| 141 | +Traceback (most recent call last):
 | 
|---|
| 142 | +...
 | 
|---|
| 143 | +ValidationError: [u'National Business Register Number (REGON) consists of 7 or 9 digits.']
 | 
|---|
| 144 | +
 | 
|---|
| 145 |  """
 | 
|---|