Django

Code

Ticket #5200: pl-localflavor-0.3-r6397.txt

File pl-localflavor-0.3-r6397.txt, 5.0 kB (added by Slawek Mikula <slawek.mikula@gmail.com>, 1 year ago)

New version of patch for test code refactoring (rev 6397)

Line 
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  """