diff --git a/docs/authors.rst b/docs/authors.rst index ede3e6055..47538cffb 100644 --- a/docs/authors.rst +++ b/docs/authors.rst @@ -90,3 +90,4 @@ Authors * Tom Forbes * Venelin Stoykov * Vladimir Nani +* Sayed Mohammad Hossein Torabi diff --git a/docs/localflavor/ir.rst b/docs/localflavor/ir.rst new file mode 100644 index 000000000..b21813f04 --- /dev/null +++ b/docs/localflavor/ir.rst @@ -0,0 +1,13 @@ +IRAN (``ir``) +=============== + +Forms +----- + +.. automodule:: localflavor.ir.forms + :members: + +Data +---- + +.. autodata:: localflavor.ir.ir_provinces.PROVINCE_CHOICES diff --git a/localflavor/ir/__init__.py b/localflavor/ir/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/localflavor/ir/forms.py b/localflavor/ir/forms.py new file mode 100644 index 000000000..a211c8add --- /dev/null +++ b/localflavor/ir/forms.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +"""AR-specific Form helpers.""" + +from __future__ import unicode_literals + +from django.core.validators import EMPTY_VALUES +from django.forms import ValidationError +from django.forms.fields import CharField, RegexField, Select +from django.utils.translation import ugettext_lazy as _ + +from .ir_provinces import PROVINCE_CHOICES + + + + +class IRProvinceSelect(Select): + """A Select widget that uses a list of Iranian provinces/autonomous cities as its choices.""" + + def __init__(self, attrs=None): + super(IRProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) + + + + +class IRPostlCodeField(RegexField): + """ + A field that accepts a 'classic' XXXXXXXXXX Postal Code o. + + See: + https://en.wikipedia.org/wiki/List_of_postal_codes + """ + + default_error_messages = { + 'invlid': _("Enter a postal code in the format xxxxxxxxxx") + } + + def __init__(self, max_length=10, min_length=11, *args, **kwargs): + super(IRPostlCodeField,self).__init__(r'^\d{4}$|^[A-HJ-NP-Za-hj-np-z]\d{4}\D{3}$', + max_length, + min_length, + *args, + **kwargs + ) + + def clean(self, value): + value = super(IRPostlCodeField,self).clean(value) + if value in EMPTY_VALUES: + return '' + if len(value) != 10 : + raise ValidationError(self.error_messages['invalid']) + if len(value) == 10: + return '%s%s%s' % (value[0].upper(), value[1:5], value[5:].upper()) + return value + diff --git a/localflavor/ir/ir_provinces.py b/localflavor/ir/ir_provinces.py new file mode 100644 index 000000000..fb7fcb138 --- /dev/null +++ b/localflavor/ir/ir_provinces.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.utils.translation import ugettext_lazy as _ + +#: A list of Iranian provinces according to https://en.wikipedia.org/wiki/Provinces_of_Iran +PROVINCE_CHOICES = ( + ('ALB', _('Alborz')), + ('ARD', _('Ardabil')), + ('AZE', _('Azerbaijan, East')), + ('AZW', _('Azerbaijan, West')), + ('BSH', _('Bushehr')), + ('CMB', _('Chahar Mahaal and Bakhtiari')), + ('FAR', _('Fars')), + ('GIL', _('Gilan')), + ('GOL', _('Golestan')), + ('HAM', _('Hamadan')), + ('HOR'), _('Hormozgān'), + ('ILA', _('Ilam')), + ('ISF', _('Isfahan')), + ('KES', _('Kerman')), + ('KER', _('Kermanshah')), + ('KHN', _('Khorasan, North')), + ('KHR', _('Khorasan, Razavi')), + ('KHS', _('Khorasan, South')), + ('KHU', _('Khuzestan')), + ('KBA', _('Kohgiluyeh and Boyer-Ahmad')), + ('KUR', _('Kurdistan')), + ('LOR', _('Lorestan')), + ('MAR', _('Markazi')), + ('MAZ', _('Mazandaran')), + ('QAZ', _('Qazvin')), + ('QOM', _('Qom')), + ('SEM', _('Semnan')), + ('SBA'), _('Sistan and Baluchestan'), + ('TEH', _('Tehran')), + ('YZD', _('Yazd')), + ('ZNJ', _('Zanjan')) +) diff --git a/tests/test_ir.py b/tests/test_ir.py new file mode 100644 index 000000000..53b0a1b57 --- /dev/null +++ b/tests/test_ir.py @@ -0,0 +1,58 @@ +from __future__ import unicode_literals + +from django.test import SimpleTestCase + +from localflavor.ir.forms import IRPostlCodeField,IRProvinceSelect + +class IRLocalFlavourTests(SimpleTestCase): + def test_IRProvinceSelect(self): + f = IRProvinceSelect() + out ='''''' + self.assertHTMLEqual(f.render('provinces'),'ALB', out) + def test_IRPostalCodeField(self): + error_format = ['Enter a postal code in the format xxxxxxxxxx .'] + error_atmost = ['Ensure this value has at most 10 characters (it has 11).'] + error_atleast = ['Ensure this value has at least 10 characters (it has 9).'] + + valid = { + '5987456987' : '9874698741', + '5987456321' : '4895785787', + 'c464646464' : '4848748487', + } + + invalid = { + '4545' : error_atmost+error_format, + '464676467676' : error_atleast+error_format, + } + self.assertFieldOutput(IRPostlCodeField, valid, invalid)