Ticket #15856: localflavor_mk.patch
File localflavor_mk.patch, 26.1 KB (added by , 14 years ago) |
---|
-
new file django/contrib/localflavor/mk/forms.py
diff --git a/django/contrib/localflavor/mk/__init__.py b/django/contrib/localflavor/mk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django/contrib/localflavor/mk/forms.py b/django/contrib/localflavor/mk/forms.py new file mode 100644 index 0000000..485a317
- + 1 import datetime 2 from mk_choices import MK_MUNICIPALITIES 3 from django.forms import ValidationError 4 from django.forms.fields import RegexField, Select, CharField, Field, RegexField 5 from django.core.validators import EMPTY_VALUES 6 from django.utils.translation import ugettext_lazy as _ 7 8 class MKIdentityCardNumberField(RegexField): 9 """ 10 A Macedonian ID card number. Accepts both old and new format. 11 """ 12 13 default_error_messages = { 14 'invalid': _(u'Identity card numbers must contain'\ 15 ' either 4 to 7 digits or an uppercase letter and 7 digits.'), 16 } 17 18 def __init__(self, *args, **kwargs): 19 kwargs['min_length'] = None 20 kwargs['max_length'] = 8 21 regex = ur'(^[A-Z]{1}\d{7}$)|(^\d{4,7}$)' 22 super(MKIdentityCardNumberField, self).__init__(regex, *args, **kwargs) 23 24 25 26 class MKMunicipalitySelect(Select): 27 """ 28 A form ``Select`` widget that uses a list of Macedonian municipalities as 29 choices. The label is the name of the municipality and the value 30 is a 2 character code for the municipality. 31 """ 32 33 def __init__(self, attrs=None): 34 super(MKMunicipalitySelect, self).__init__(attrs, choices = MK_MUNICIPALITIES) 35 36 37 38 class UMCNField(RegexField): 39 """ 40 A form field that validates input as a unique master citizen 41 number. 42 43 The format of the unique master citizen number has been kept the same from 44 Yugoslavia. It is still in use in other countries as well, it is not applicable 45 solely in Macedonia. For more information see: 46 https://secure.wikimedia.org/wikipedia/en/wiki/Unique_Master_Citizen_Number 47 48 A value will pass validation if it complies to the following rules: 49 50 * Consists of exactly 13 digits 51 * The first 7 digits represent a valid past date in the format DDMMYYY 52 * The last digit of the UMCN passes a checksum test 53 """ 54 55 default_error_messages = { 56 'invalid': _(u'This field should contain exactly 13 digits.'), 57 'date': _(u'The first 7 digits of the UMCN must represent a valid past date.'), 58 'checksum': _(u'The UMCN is not valid.'), 59 } 60 61 def __init__(self, *args, **kwargs): 62 kwargs['min_length'] = None 63 kwargs['max_length'] = 13 64 super(UMCNField, self).__init__(r'^\d{13}$', *args, **kwargs) 65 66 67 def clean(self, value): 68 value = super(UMCNField, self).clean(value) 69 70 if value in EMPTY_VALUES: 71 return u'' 72 73 74 if not self._validate_date_part(value): 75 raise ValidationError(self.error_messages['date']) 76 if self._validate_checksum(value): 77 return value 78 else: 79 raise ValidationError(self.error_messages['checksum']) 80 81 def _validate_checksum(self, value): 82 a,b,c,d,e,f,g,h,i,j,k,l,K = [int(digit) for digit in value] 83 m = 11 - (( 7*(a+g) + 6*(b+h) + 5*(c+i) + 4*(d+j) + 3*(e+k) + 2*(f+l)) % 11) 84 if (m >= 1 and m <= 9) and K == m: 85 return True 86 elif m == 11 and K == 0: 87 return True 88 else: 89 return False 90 91 def _validate_date_part(self, value): 92 daypart, monthpart, yearpart = int(value[:2]), int(value[2:4]), int(value[4:7]) 93 if yearpart >= 800: 94 yearpart += 1000 95 else: 96 yearpart += 2000 97 try: 98 date = datetime.datetime(year = yearpart, month = monthpart, day = daypart).date() 99 except ValueError: 100 return False 101 if date >= datetime.datetime.now().date(): 102 return False 103 return True 104 -
new file django/contrib/localflavor/mk/mk_choices.py
diff --git a/django/contrib/localflavor/mk/mk_choices.py b/django/contrib/localflavor/mk/mk_choices.py new file mode 100644 index 0000000..c5dffdb
- + 1 # -*- coding: utf-8 -*- 2 """ 3 Macedonian municipalities per the reorganization from 2004. 4 """ 5 from django.utils.translation import ugettext_lazy as _ 6 7 MK_MUNICIPALITIES = ( 8 ('AD', _(u'Aerodrom')), 9 ('AR', _(u'Aračinovo')), 10 ('BR', _(u'Berovo')), 11 ('TL', _(u'Bitola')), 12 ('BG', _(u'Bogdanci')), 13 ('VJ', _(u'Bogovinje')), 14 ('BS', _(u'Bosilovo')), 15 ('BN', _(u'Brvenica')), 16 ('BU', _(u'Butel')), 17 ('VA', _(u'Valandovo')), 18 ('VL', _(u'Vasilevo')), 19 ('VV', _(u'Vevčani')), 20 ('VE', _(u'Veles')), 21 ('NI', _(u'Vinica')), 22 ('VC', _(u'Vraneštica')), 23 ('VH', _(u'Vrapčište')), 24 ('GB', _(u'Gazi Baba')), 25 ('GV', _(u'Gevgelija')), 26 ('GT', _(u'Gostivar')), 27 ('GR', _(u'Gradsko')), 28 ('DB', _(u'Debar')), 29 ('DA', _(u'Debarca')), 30 ('DL', _(u'Delčevo')), 31 ('DK', _(u'Demir Kapija')), 32 ('DM', _(u'Demir Hisar')), 33 ('DE', _(u'Dolneni')), 34 ('DR', _(u'Drugovo')), 35 ('GP', _(u'Gjorče Petrov')), 36 ('ZE', _(u'Želino')), 37 ('ZA', _(u'Zajas')), 38 ('ZK', _(u'Zelenikovo')), 39 ('ZR', _(u'Zrnovci')), 40 ('IL', _(u'Ilinden')), 41 ('JG', _(u'Jegunovce')), 42 ('AV', _(u'Kavadarci')), 43 ('KB', _(u'Karbinci')), 44 ('KX', _(u'Karpoš')), 45 ('VD', _(u'Kisela Voda')), 46 ('KH', _(u'Kičevo')), 47 ('KN', _(u'Konče')), 48 ('OC', _(u'Koćani')), 49 ('KY', _(u'Kratovo')), 50 ('KZ', _(u'Kriva Palanka')), 51 ('KG', _(u'Krivogaštani')), 52 ('KS', _(u'Kruševo')), 53 ('UM', _(u'Kumanovo')), 54 ('LI', _(u'Lipkovo')), 55 ('LO', _(u'Lozovo')), 56 ('MR', _(u'Mavrovo i Rostuša')), 57 ('MK', _(u'Makedonska Kamenica')), 58 ('MD', _(u'Makedonski Brod')), 59 ('MG', _(u'Mogila')), 60 ('NG', _(u'Negotino')), 61 ('NV', _(u'Novaci')), 62 ('NS', _(u'Novo Selo')), 63 ('OS', _(u'Oslomej')), 64 ('OD', _(u'Ohrid')), 65 ('PE', _(u'Petrovec')), 66 ('PH', _(u'Pehčevo')), 67 ('PN', _(u'Plasnica')), 68 ('PP', _(u'Prilep')), 69 ('PT', _(u'Probištip')), 70 ('RV', _(u'Radoviš')), 71 ('RN', _(u'Rankovce')), 72 ('RE', _(u'Resen')), 73 ('RO', _(u'Rosoman')), 74 ('AJ', _(u'Saraj')), 75 ('SL', _(u'Sveti Nikole')), 76 ('SS', _(u'Sopište')), 77 ('SD', _(u'Star Dojran')), 78 ('NA', _(u'Staro Nagoričane')), 79 ('UG', _(u'Struga')), 80 ('RU', _(u'Strumica')), 81 ('SU', _(u'Studeničani')), 82 ('TR', _(u'Tearce')), 83 ('ET', _(u'Tetovo')), 84 ('CE', _(u'Centar')), 85 ('CZ', _(u'Centar-Župa')), 86 ('CI', _(u'Čair')), 87 ('CA', _(u'Čaška')), 88 ('CH', _(u'Češinovo-Obleševo')), 89 ('CS', _(u'Čučer-Sandevo')), 90 ('ST', _(u'Štip')), 91 ('SO', _(u'Šuto Orizari')), 92 ) 93 -
new file django/contrib/localflavor/mk/models.py
diff --git a/django/contrib/localflavor/mk/models.py b/django/contrib/localflavor/mk/models.py new file mode 100644 index 0000000..c64881e
- + 1 from django.db.models.fields import CharField 2 from django.utils.translation import ugettext_lazy as _ 3 from django.contrib.localflavor.mk.mk_choices import MK_MUNICIPALITIES 4 5 6 class MKIdentityCardNumberField(CharField): 7 8 description = _("Macedonian identity card number") 9 10 def __init__(self, *args, **kwargs): 11 kwargs['max_length'] = 8 12 super(MKIdentityCardNumberField, self).__init__(*args, **kwargs) 13 14 def formfield(self, **kwargs): 15 from django.contrib.localflavor.mk.forms import MKIdentityCardNumberField as FormField 16 defaults = {'form_class' : FormField} 17 defaults.update(kwargs) 18 return super(MKIdentityCardNumberField, self).formfield(**defaults) 19 20 21 class MKMunicipalityField(CharField): 22 23 description = _("A Macedonian municipality (2 character code)") 24 25 def __init__(self, *args, **kwargs): 26 kwargs['choices'] = MK_MUNICIPALITIES 27 kwargs['max_length'] = 2 28 super(MKMunicipalityField, self).__init__(*args, **kwargs) 29 30 31 class UMCNField(CharField): 32 33 description = _("Unique master citizen number (13 digits)") 34 35 def __init__(self, *args, **kwargs): 36 kwargs['max_length'] = 13 37 super(UMCNField, self).__init__(*args, **kwargs) 38 39 def formfield(self, **kwargs): 40 from django.contrib.localflavor.mk.forms import UMCNField as FormField 41 defaults = {'form_class' : FormField} 42 defaults.update(kwargs) 43 return super(UMCNField, self).formfield(**defaults) -
docs/ref/contrib/localflavor.txt
diff --git a/docs/ref/contrib/localflavor.txt b/docs/ref/contrib/localflavor.txt index f27f57c..eb07589 100644
a b Countries currently supported by :mod:`~django.contrib.localflavor` are: 57 57 * Italy_ 58 58 * Japan_ 59 59 * Kuwait_ 60 * Macedonia_ 60 61 * Mexico_ 61 62 * `The Netherlands`_ 62 63 * Norway_ … … Here's an example of how to use them:: 110 111 .. _Italy: `Italy (it)`_ 111 112 .. _Japan: `Japan (jp)`_ 112 113 .. _Kuwait: `Kuwait (kw)`_ 114 .. _Macedonia: `Macedonia (mk)`_ 113 115 .. _Mexico: `Mexico (mx)`_ 114 116 .. _Norway: `Norway (no)`_ 115 117 .. _Peru: `Peru (pe)`_ … … Kuwait (``kw``) 694 696 * The birthdate of the person is a valid date. 695 697 * The calculated checksum equals to the last digit of the Civil ID. 696 698 699 700 Macedonia (``mk``) 701 =================== 702 703 .. class:: mk.forms.MKIdentityCardNumberField 704 705 A form field that validates input as a Macedonian identity card number. 706 Both old and new identity card numbers are supported. 707 708 709 .. class:: mk.forms.MKMunicipalitySelect 710 711 A form ``Select`` widget that uses a list of Macedonian municipalities as 712 choices. 713 714 715 .. class:: mk.forms.UMCNField 716 717 A form field that validates input as a unique master citizen 718 number. 719 720 The format of the unique master citizen number is not unique 721 to Macedonia. For more information see: 722 https://secure.wikimedia.org/wikipedia/en/wiki/Unique_Master_Citizen_Number 723 724 A value will pass validation if it complies to the following rules: 725 726 * Consists of exactly 13 digits 727 * The first 7 digits represent a valid past date in the format DDMMYYY 728 * The last digit of the UMCN passes a checksum test 729 730 731 .. class:: mk.models.MKIdentityCardNumberField 732 733 A model field that forms represent as a 734 ``forms.MKIdentityCardNumberField`` field. 735 736 737 .. class:: mk.models.MKMunicipalityField 738 739 A model field that forms represent as a 740 ``forms.MKMunicipalitySelect`` and stores the 2 character code of the 741 municipality in the database. 742 743 744 .. class:: mk.models.UMCNField 745 746 A model field that forms represent as a ``forms.UMCNField`` field. 747 748 697 749 Mexico (``mx``) 698 750 =============== 699 751 -
new file tests/regressiontests/forms/localflavor/mk.py
diff --git a/tests/regressiontests/forms/localflavor/mk.py b/tests/regressiontests/forms/localflavor/mk.py new file mode 100644 index 0000000..029236e
- + 1 from django.contrib.localflavor.mk.forms import ( MKIdentityCardNumberField, 2 MKMunicipalitySelect, 3 UMCNField, ) 4 from utils import LocalFlavorTestCase 5 6 7 class MKLocalFlavorTests(LocalFlavorTestCase): 8 9 def test_MKIdentityCardNumberField(self): 10 error_invalid =u'Identity card numbers must contain'\ 11 ' either 4 to 7 digits or an uppercase letter and 7 digits.' 12 13 valid = { 14 'L0018077':'L0018077', 15 'A0078315' : 'A0078315', 16 } 17 18 invalid = { 19 '123': error_invalid, 20 'abcdf': error_invalid, 21 '234390a': error_invalid, 22 } 23 24 self.assertFieldOutput(MKIdentityCardNumberField, valid, invalid) 25 26 27 def test_MKMunicipalitySelect(self): 28 f = MKMunicipalitySelect() 29 out=u'''<select name="municipality"> 30 <option value="AD">Aerodrom</option> 31 <option value="AR">Ara\u010dinovo</option> 32 <option value="BR">Berovo</option> 33 <option value="TL">Bitola</option> 34 <option value="BG">Bogdanci</option> 35 <option value="VJ">Bogovinje</option> 36 <option value="BS">Bosilovo</option> 37 <option value="BN">Brvenica</option> 38 <option value="BU">Butel</option> 39 <option value="VA">Valandovo</option> 40 <option value="VL">Vasilevo</option> 41 <option value="VV">Vev\u010dani</option> 42 <option value="VE">Veles</option> 43 <option value="NI">Vinica</option> 44 <option value="VC">Vrane\u0161tica</option> 45 <option value="VH">Vrap\u010di\u0161te</option> 46 <option value="GB">Gazi Baba</option> 47 <option value="GV">Gevgelija</option> 48 <option value="GT">Gostivar</option> 49 <option value="GR">Gradsko</option> 50 <option value="DB">Debar</option> 51 <option value="DA">Debarca</option> 52 <option value="DL" selected="selected">Del\u010devo</option> 53 <option value="DK">Demir Kapija</option> 54 <option value="DM">Demir Hisar</option> 55 <option value="DE">Dolneni</option> 56 <option value="DR">Drugovo</option> 57 <option value="GP">Gjor\u010de Petrov</option> 58 <option value="ZE">\u017delino</option> 59 <option value="ZA">Zajas</option> 60 <option value="ZK">Zelenikovo</option> 61 <option value="ZR">Zrnovci</option> 62 <option value="IL">Ilinden</option> 63 <option value="JG">Jegunovce</option> 64 <option value="AV">Kavadarci</option> 65 <option value="KB">Karbinci</option> 66 <option value="KX">Karpo\u0161</option> 67 <option value="VD">Kisela Voda</option> 68 <option value="KH">Ki\u010devo</option> 69 <option value="KN">Kon\u010de</option> 70 <option value="OC">Ko\u0107ani</option> 71 <option value="KY">Kratovo</option> 72 <option value="KZ">Kriva Palanka</option> 73 <option value="KG">Krivoga\u0161tani</option> 74 <option value="KS">Kru\u0161evo</option> 75 <option value="UM">Kumanovo</option> 76 <option value="LI">Lipkovo</option> 77 <option value="LO">Lozovo</option> 78 <option value="MR">Mavrovo i Rostu\u0161a</option> 79 <option value="MK">Makedonska Kamenica</option> 80 <option value="MD">Makedonski Brod</option> 81 <option value="MG">Mogila</option> 82 <option value="NG">Negotino</option> 83 <option value="NV">Novaci</option> 84 <option value="NS">Novo Selo</option> 85 <option value="OS">Oslomej</option> 86 <option value="OD">Ohrid</option> 87 <option value="PE">Petrovec</option> 88 <option value="PH">Peh\u010devo</option> 89 <option value="PN">Plasnica</option> 90 <option value="PP">Prilep</option> 91 <option value="PT">Probi\u0161tip</option> 92 <option value="RV">Radovi\u0161</option> 93 <option value="RN">Rankovce</option> 94 <option value="RE">Resen</option> 95 <option value="RO">Rosoman</option> 96 <option value="AJ">Saraj</option> 97 <option value="SL">Sveti Nikole</option> 98 <option value="SS">Sopi\u0161te</option> 99 <option value="SD">Star Dojran</option> 100 <option value="NA">Staro Nagori\u010dane</option> 101 <option value="UG">Struga</option> 102 <option value="RU">Strumica</option> 103 <option value="SU">Studeni\u010dani</option> 104 <option value="TR">Tearce</option> 105 <option value="ET">Tetovo</option> 106 <option value="CE">Centar</option> 107 <option value="CZ">Centar-\u017dupa</option> 108 <option value="CI">\u010cair</option> 109 <option value="CA">\u010ca\u0161ka</option> 110 <option value="CH">\u010ce\u0161inovo-Oble\u0161evo</option> 111 <option value="CS">\u010cu\u010der-Sandevo</option> 112 <option value="ST">\u0160tip</option> 113 <option value="SO">\u0160uto Orizari</option> 114 </select>''' 115 116 self.assertEqual( f.render('municipality', 'DL' ), out) 117 118 def test_UMCNField(self): 119 error_invalid = [u'This field should contain exactly 13 digits.'] 120 error_checksum = [u'The UMCN is not valid.'] 121 error_date = [u'The first 7 digits of the UMCN'\ 122 ' must represent a valid past date.'] 123 valid = { 124 '2402983450006': '2402983450006', 125 '2803984430038': '2803984430038', 126 '1909982045004': '1909982045004', 127 } 128 129 invalid = { 130 '240298345': error_invalid, 131 'abcdefghj': error_invalid, 132 '2402082450006': error_date, 133 '3002982450006': error_date, 134 '2402983450007': error_checksum, 135 '2402982450006': error_checksum, 136 } 137 138 self.assertFieldOutput(UMCNField, valid, invalid) 139 140 141 142 143 -
tests/regressiontests/forms/localflavortests.py
diff --git a/tests/regressiontests/forms/localflavortests.py b/tests/regressiontests/forms/localflavortests.py index 73f46a7..68717ca 100644
a b from localflavor.is_ import ISLocalFlavorTests 21 21 from localflavor.it import ITLocalFlavorTests 22 22 from localflavor.jp import JPLocalFlavorTests 23 23 from localflavor.kw import KWLocalFlavorTests 24 from localflavor.mk import MKLocalFlavorTests 24 25 from localflavor.nl import NLLocalFlavorTests 25 26 from localflavor.pl import PLLocalFlavorTests 26 27 from localflavor.pt import PTLocalFlavorTests -
tests/regressiontests/forms/tests/__init__.py
diff --git a/tests/regressiontests/forms/tests/__init__.py b/tests/regressiontests/forms/tests/__init__.py index 2d8f9e9..dfce783 100644
a b from regressiontests.forms.localflavortests import ( 35 35 ITLocalFlavorTests, 36 36 JPLocalFlavorTests, 37 37 KWLocalFlavorTests, 38 MKLocalFlavorTests, 38 39 NLLocalFlavorTests, 39 40 PLLocalFlavorTests, 40 41 PTLocalFlavorTests, -
new file tests/regressiontests/localflavor/mk/forms.py
diff --git a/tests/regressiontests/localflavor/mk/__init__.py b/tests/regressiontests/localflavor/mk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/localflavor/mk/forms.py b/tests/regressiontests/localflavor/mk/forms.py new file mode 100644 index 0000000..4b743bf
- + 1 from django.forms import ModelForm 2 from models import MKPerson 3 4 class MKPersonForm(ModelForm): 5 6 class Meta: 7 model = MKPerson -
new file tests/regressiontests/localflavor/mk/models.py
diff --git a/tests/regressiontests/localflavor/mk/models.py b/tests/regressiontests/localflavor/mk/models.py new file mode 100644 index 0000000..2ef703d
- + 1 from django.db import models 2 from django.contrib.localflavor.mk.models import (MKIdentityCardNumberField, 3 MKMunicipalityField, 4 UMCNField) 5 6 class MKPerson(models.Model): 7 first_name = models.CharField(max_length = 20) 8 last_name = models.CharField(max_length = 20) 9 umcn = UMCNField() 10 id_number = MKIdentityCardNumberField() 11 municipality = MKMunicipalityField(blank = True) 12 municipality_req = MKMunicipalityField(blank = False) 13 14 class Meta: 15 app_label = 'localflavor' -
new file tests/regressiontests/localflavor/mk/tests.py
diff --git a/tests/regressiontests/localflavor/mk/tests.py b/tests/regressiontests/localflavor/mk/tests.py new file mode 100644 index 0000000..d4742b8
- + 1 from django.test import TestCase 2 from forms import MKPersonForm 3 4 class MKLocalflavorTests(TestCase): 5 def setUp(self): 6 self.form = MKPersonForm({'first_name':'Someone', 7 'last_name':'Something', 8 'umcn': '2402983450006', 9 'municipality':'OD', 10 'municipality_req':'VE', 11 'id_number':'A1234567'}) 12 13 14 def test_get_display_methods(self): 15 """Test that the get_*_display() methods are added to the model instances.""" 16 17 person = self.form.save() 18 self.assertEqual(person.get_municipality_display(), 'Ohrid') 19 self.assertEqual(person.get_municipality_req_display(), 'Veles') 20 21 22 def test_municipality_required(self): 23 """Test that required MKMunicipalityFields throw appropriate errors.""" 24 25 form = MKPersonForm({'first_name':'Someone', 26 'last_name':'Something', 27 'umcn': '2402983450006', 28 'municipality':'OD', 29 'id_number':'A1234567'}) 30 31 self.assertFalse(form.is_valid()) 32 self.assertEqual(form.errors['municipality_req'], [u'This field is required.']) 33 34 35 def test_umcn_invalid(self): 36 """Test that UMCNFields throw appropriate errors for invalid UMCNs""" 37 38 form = MKPersonForm({'first_name':'Someone', 39 'last_name':'Something', 40 'umcn': '2402983450007', 41 'municipality':'OD', 42 'municipality_req':'VE', 43 'id_number':'A1234567'}) 44 45 self.assertFalse(form.is_valid()) 46 self.assertEqual(form.errors['umcn'], [u'The UMCN is not valid.']) 47 48 form = MKPersonForm({'first_name':'Someone', 49 'last_name':'Something', 50 'umcn': '3002983450007', 51 'municipality':'OD', 52 'municipality_req':'VE', 53 'id_number':'A1234567'}) 54 55 self.assertEqual(form.errors['umcn'],\ 56 [u'The first 7 digits of the UMCN must represent a valid past date.']) 57 58 59 def test_idnumber_invalid(self): 60 """Test that MKIdentityCardNumberFields throw appropriate errors for invalid values""" 61 62 form = MKPersonForm({'first_name':'Someone', 63 'last_name':'Something', 64 'umcn': '2402983450007', 65 'municipality':'OD', 66 'municipality_req':'VE', 67 'id_number':'A123456a'}) 68 69 self.assertFalse(form.is_valid()) 70 self.assertEqual(form.errors['id_number'],\ 71 [u'Identity card numbers must contain'\ 72 ' either 4 to 7 digits or an uppercase letter and 7 digits.']) 73 74 75 76 def test_field_blank_option(self): 77 """Test that the empty option is there.""" 78 79 municipality_select_html="""<select name="municipality" id="id_municipality"> 80 <option value="">---------</option> 81 <option value="AD">Aerodrom</option> 82 <option value="AR">Ara\xc4\x8dinovo</option> 83 <option value="BR">Berovo</option> 84 <option value="TL">Bitola</option> 85 <option value="BG">Bogdanci</option> 86 <option value="VJ">Bogovinje</option> 87 <option value="BS">Bosilovo</option> 88 <option value="BN">Brvenica</option> 89 <option value="BU">Butel</option> 90 <option value="VA">Valandovo</option> 91 <option value="VL">Vasilevo</option> 92 <option value="VV">Vev\xc4\x8dani</option> 93 <option value="VE">Veles</option> 94 <option value="NI">Vinica</option> 95 <option value="VC">Vrane\xc5\xa1tica</option> 96 <option value="VH">Vrap\xc4\x8di\xc5\xa1te</option> 97 <option value="GB">Gazi Baba</option> 98 <option value="GV">Gevgelija</option> 99 <option value="GT">Gostivar</option> 100 <option value="GR">Gradsko</option> 101 <option value="DB">Debar</option> 102 <option value="DA">Debarca</option> 103 <option value="DL">Del\xc4\x8devo</option> 104 <option value="DK">Demir Kapija</option> 105 <option value="DM">Demir Hisar</option> 106 <option value="DE">Dolneni</option> 107 <option value="DR">Drugovo</option> 108 <option value="GP">Gjor\xc4\x8de Petrov</option> 109 <option value="ZE">\xc5\xbdelino</option> 110 <option value="ZA">Zajas</option> 111 <option value="ZK">Zelenikovo</option> 112 <option value="ZR">Zrnovci</option> 113 <option value="IL">Ilinden</option> 114 <option value="JG">Jegunovce</option> 115 <option value="AV">Kavadarci</option> 116 <option value="KB">Karbinci</option> 117 <option value="KX">Karpo\xc5\xa1</option> 118 <option value="VD">Kisela Voda</option> 119 <option value="KH">Ki\xc4\x8devo</option> 120 <option value="KN">Kon\xc4\x8de</option> 121 <option value="OC">Ko\xc4\x87ani</option> 122 <option value="KY">Kratovo</option> 123 <option value="KZ">Kriva Palanka</option> 124 <option value="KG">Krivoga\xc5\xa1tani</option> 125 <option value="KS">Kru\xc5\xa1evo</option> 126 <option value="UM">Kumanovo</option> 127 <option value="LI">Lipkovo</option> 128 <option value="LO">Lozovo</option> 129 <option value="MR">Mavrovo i Rostu\xc5\xa1a</option> 130 <option value="MK">Makedonska Kamenica</option> 131 <option value="MD">Makedonski Brod</option> 132 <option value="MG">Mogila</option> 133 <option value="NG">Negotino</option> 134 <option value="NV">Novaci</option> 135 <option value="NS">Novo Selo</option> 136 <option value="OS">Oslomej</option> 137 <option value="OD" selected="selected">Ohrid</option> 138 <option value="PE">Petrovec</option> 139 <option value="PH">Peh\xc4\x8devo</option> 140 <option value="PN">Plasnica</option> 141 <option value="PP">Prilep</option> 142 <option value="PT">Probi\xc5\xa1tip</option> 143 <option value="RV">Radovi\xc5\xa1</option> 144 <option value="RN">Rankovce</option> 145 <option value="RE">Resen</option> 146 <option value="RO">Rosoman</option> 147 <option value="AJ">Saraj</option> 148 <option value="SL">Sveti Nikole</option> 149 <option value="SS">Sopi\xc5\xa1te</option> 150 <option value="SD">Star Dojran</option> 151 <option value="NA">Staro Nagori\xc4\x8dane</option> 152 <option value="UG">Struga</option> 153 <option value="RU">Strumica</option> 154 <option value="SU">Studeni\xc4\x8dani</option> 155 <option value="TR">Tearce</option> 156 <option value="ET">Tetovo</option> 157 <option value="CE">Centar</option> 158 <option value="CZ">Centar-\xc5\xbdupa</option> 159 <option value="CI">\xc4\x8cair</option> 160 <option value="CA">\xc4\x8ca\xc5\xa1ka</option> 161 <option value="CH">\xc4\x8ce\xc5\xa1inovo-Oble\xc5\xa1evo</option> 162 <option value="CS">\xc4\x8cu\xc4\x8der-Sandevo</option> 163 <option value="ST">\xc5\xa0tip</option> 164 <option value="SO">\xc5\xa0uto Orizari</option> 165 </select>""" 166 167 168 self.assertEqual(str(self.form['municipality']), municipality_select_html) 169 -
tests/regressiontests/localflavor/tests.py
diff --git a/tests/regressiontests/localflavor/tests.py b/tests/regressiontests/localflavor/tests.py index e22fc0f..6a02d99 100644
a b from django.test import TestCase 2 2 from django.utils import unittest 3 3 4 4 # just import your tests here 5 from us.tests import *6 5 from au.tests import * 6 from mk.tests import * 7 from us.tests import * 8