Author: jezdez Date: 2010-10-11 18:35:23 -0500 (Mon, 11 Oct 2010) New Revision: 14160
Added: django/trunk/django/contrib/localflavor/be/ django/trunk/django/contrib/localflavor/be/__init__.py django/trunk/django/contrib/localflavor/be/be_provinces.py django/trunk/django/contrib/localflavor/be/be_regions.py django/trunk/django/contrib/localflavor/be/forms.py django/trunk/tests/regressiontests/forms/localflavor/be.py Modified: django/trunk/docs/ref/contrib/localflavor.txt django/trunk/tests/regressiontests/forms/tests.py Log: Fixed #14349 -- Added Belgium localflavor. Thanks for the report and patch, Laurent Luce. Added: django/trunk/django/contrib/localflavor/be/__init__.py =================================================================== Added: django/trunk/django/contrib/localflavor/be/be_provinces.py =================================================================== --- django/trunk/django/contrib/localflavor/be/be_provinces.py (rev 0) +++ django/trunk/django/contrib/localflavor/be/be_provinces.py 2010-10-11 23:35:23 UTC (rev 14160) @@ -0,0 +1,16 @@ +from django.utils.translation import ugettext_lazy as _ + +# ISO codes +PROVINCE_CHOICES = ( + ('VAN', _('Antwerp')), + ('BRU', _('Brussels')), + ('VOV', _('East Flanders')), + ('VBR', _('Flemish Brabant')), + ('WHT', _('Hainaut')), + ('WLG', _('Liege')), + ('VLI', _('Limburg')), + ('WLX', _('Luxembourg')), + ('WNA', _('Namur')), + ('WBR', _('Walloon Brabant')), + ('VWV', _('West Flanders')) +) Added: django/trunk/django/contrib/localflavor/be/be_regions.py =================================================================== --- django/trunk/django/contrib/localflavor/be/be_regions.py (rev 0) +++ django/trunk/django/contrib/localflavor/be/be_regions.py 2010-10-11 23:35:23 UTC (rev 14160) @@ -0,0 +1,8 @@ +from django.utils.translation import ugettext_lazy as _ + +# ISO codes +REGION_CHOICES = ( + ('BRU', _('Brussels Capital Region')), + ('VLG', _('Flemish Region')), + ('WAL', _('Wallonia')) +) Added: django/trunk/django/contrib/localflavor/be/forms.py =================================================================== --- django/trunk/django/contrib/localflavor/be/forms.py (rev 0) +++ django/trunk/django/contrib/localflavor/be/forms.py 2010-10-11 23:35:23 UTC (rev 14160) @@ -0,0 +1,71 @@ +""" +Belgium-specific Form helpers +""" +import re + +from django.core.validators import EMPTY_VALUES +from django.forms import ValidationError +from django.forms.fields import RegexField, Select +from django.utils.translation import ugettext_lazy as _ + +class BEPostalCodeField(RegexField): + """ + A form field that validates its input as a belgium postal code. + + Belgium postal code is a 4 digits string. The first digit indicates + the province (except for the 3ddd numbers that are shared by the + eastern part of Flemish Brabant and Limburg and the and 1ddd that + are shared by the Brussels Capital Region, the western part of + Flemish Brabant and Walloon Brabant) + """ + default_error_messages = { + 'invalid': _( + 'Enter a valid postal code in the range and format 1XXX - 9XXX.'), + } + + def __init__(self, *args, **kwargs): + super(BEPostalCodeField, self).__init__(r'^[1-9]\d{3}$', + max_length=None, min_length=None, *args, **kwargs) + +class BEPhoneNumberField(RegexField): + """ + A form field that validates its input as a belgium phone number. + + Landlines have a seven-digit subscriber number and a one-digit area code, + while smaller cities have a six-digit subscriber number and a two-digit + area code. Cell phones have a six-digit subscriber number and a two-digit + area code preceeded by the number 4. + 0d ddd dd dd, 0d/ddd.dd.dd, 0d.ddd.dd.dd, + 0dddddddd - dialling a bigger city + 0dd dd dd dd, 0dd/dd.dd.dd, 0dd.dd.dd.dd, + 0dddddddd - dialling a smaller city + 04dd ddd dd dd, 04dd/ddd.dd.dd, + 04dd.ddd.dd.dd, 04ddddddddd - dialling a mobile number + """ + default_error_messages = { + 'invalid': _('Enter a valid phone number in one of the formats ' + '0x xxx xx xx, 0xx xx xx xx, 04xx xx xx xx, ' + '0x/xxx.xx.xx, 0xx/xx.xx.xx, 04xx/xx.xx.xx, ' + '0x.xxx.xx.xx, 0xx.xx.xx.xx, 04xx.xx.xx.xx, ' + '0xxxxxxxx or 04xxxxxxxx.'), + } + + def __init__(self, *args, **kwargs): + super(BEPhoneNumberField, self).__init__(r'^[0]\d{1}[/. ]?\d{3}[. ]\d{2}[. ]?\d{2}$|^[0]\d{2}[/. ]?\d{2}[. ]?\d{2}[. ]?\d{2}$|^[0][4]\d{2}[/. ]?\d{2}[. ]?\d{2}[. ]?\d{2}$', + max_length=None, min_length=None, *args, **kwargs) + +class BERegionSelect(Select): + """ + A Select widget that uses a list of belgium regions as its choices. + """ + def __init__(self, attrs=None): + from be_regions import REGION_CHOICES + super(BERegionSelect, self).__init__(attrs, choices=REGION_CHOICES) + +class BEProvinceSelect(Select): + """ + A Select widget that uses a list of belgium provinces as its choices. + """ + def __init__(self, attrs=None): + from be_provinces import PROVINCE_CHOICES + super(BEProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) Modified: django/trunk/docs/ref/contrib/localflavor.txt =================================================================== --- django/trunk/docs/ref/contrib/localflavor.txt 2010-10-11 22:36:17 UTC (rev 14159) +++ django/trunk/docs/ref/contrib/localflavor.txt 2010-10-11 23:35:23 UTC (rev 14160) @@ -39,6 +39,7 @@ * Argentina_ * Australia_ * Austria_ + * Belgium_ * Brazil_ * Canada_ * Chile_ @@ -85,6 +86,7 @@ .. _Argentina: `Argentina (ar)`_ .. _Australia: `Australia (au)`_ .. _Austria: `Austria (at)`_ +.. _Belgium: `Belgium (be)`_ .. _Brazil: `Brazil (br)`_ .. _Canada: `Canada (ca)`_ .. _Chile: `Chile (cl)`_ @@ -182,6 +184,33 @@ A form field that validates its input as an Austrian social security number. +Belgium (``be``) +================ + +.. versionadded:: 1.3 + +.. class:: be.forms.BEPhoneNumberField + + A form field that validates input as a Belgium phone number, with one of + the formats 0x xxx xx xx, 0xx xx xx xx, 04xx xx xx xx, 0x/xxx.xx.xx, + 0xx/xx.xx.xx, 04xx/xx.xx.xx, 0x.xxx.xx.xx, 0xx.xx.xx.xx, 04xx.xx.xx.xx, + 0xxxxxxxx or 04xxxxxxxx. + +.. class:: be.forms.BEPostalCodeField + + A form field that validates input as a Belgium postal code, in the range + and format 1XXX-9XXX. + +.. class:: be.forms.BEProvinceSelect + + A ``Select`` widget that uses a list of Belgium provinces as its + choices. + +.. class:: be.forms.BERegionSelect + + A ``Select`` widget that uses a list of Belgium regions as its + choices. + Brazil (``br``) =============== Added: django/trunk/tests/regressiontests/forms/localflavor/be.py =================================================================== --- django/trunk/tests/regressiontests/forms/localflavor/be.py (rev 0) +++ django/trunk/tests/regressiontests/forms/localflavor/be.py 2010-10-11 23:35:23 UTC (rev 14160) @@ -0,0 +1,94 @@ +from django.test import TestCase +from django.forms import * + +from django.contrib.localflavor.be.forms import (BEPostalCodeField, + BEPhoneNumberField, BERegionSelect, BEProvinceSelect) + +class BETests(TestCase): + """ + Test case to validate BE localflavor + """ + def assertRaisesErrorWithMessage(self, error, message, callable, *args, **kwargs): + self.assertRaises(error, callable, *args, **kwargs) + try: + callable(*args, **kwargs) + except error, e: + self.assertEqual(message, str(e)) + + def test_postal_code_field(self): + f = BEPostalCodeField() + self.assertEqual(u'1451', f.clean('1451')) + self.assertEqual(u'2540', f.clean('2540')) + err_message = "[u'Enter a valid postal code in the range and format 1XXX - 9XXX.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '0287') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '14309') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '873') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '35 74') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '859A') + err_message = "[u'This field is required.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '') + f = BEPostalCodeField(required=False) + self.assertEqual(u'1451', f.clean('1451')) + self.assertEqual(u'2540', f.clean('2540')) + self.assertEqual(u'', f.clean('')) + err_message = "[u'Enter a valid postal code in the range and format 1XXX - 9XXX.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '0287') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '14309') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '873') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '35 74') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '859A') + + def test_phone_number_field(self): + f = BEPhoneNumberField() + self.assertEqual(u'01 234 56 78', f.clean('01 234 56 78')) + self.assertEqual(u'01/234.56.78', f.clean('01/234.56.78')) + self.assertEqual(u'01.234.56.78', f.clean('01.234.56.78')) + self.assertEqual(u'012 34 56 78', f.clean('012 34 56 78')) + self.assertEqual(u'012/34.56.78', f.clean('012/34.56.78')) + self.assertEqual(u'012.34.56.78', f.clean('012.34.56.78')) + self.assertEqual(u'0412 34 56 78', f.clean('0412 34 56 78')) + self.assertEqual(u'0412/34.56.78', f.clean('0412/34.56.78')) + self.assertEqual(u'0412.34.56.78', f.clean('0412.34.56.78')) + self.assertEqual(u'012345678', f.clean('012345678')) + self.assertEqual(u'0412345678', f.clean('0412345678')) + err_message = "[u'Enter a valid phone number in one of the formats 0x xxx xx xx, 0xx xx xx xx, 04xx xx xx xx, 0x/xxx.xx.xx, 0xx/xx.xx.xx, 04xx/xx.xx.xx, 0xxxxxxxx, 04xxxxxxxx, 0x.xxx.xx.xx, 0xx.xx.xx.xx, 04xx.xx.xx.xx.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '01234567') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '12/345.67.89') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/345.678.90') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/34.56.789') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '0123/45.67.89') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/345 678 90') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/34 56 789') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012.34 56 789') + err_message = "[u'This field is required.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '') + f = BEPhoneNumberField(required=False) + self.assertEqual(u'01 234 56 78', f.clean('01 234 56 78')) + self.assertEqual(u'01/234.56.78', f.clean('01/234.56.78')) + self.assertEqual(u'01.234.56.78', f.clean('01.234.56.78')) + self.assertEqual(u'012 34 56 78', f.clean('012 34 56 78')) + self.assertEqual(u'012/34.56.78', f.clean('012/34.56.78')) + self.assertEqual(u'012.34.56.78', f.clean('012.34.56.78')) + self.assertEqual(u'0412 34 56 78', f.clean('0412 34 56 78')) + self.assertEqual(u'0412/34.56.78', f.clean('0412/34.56.78')) + self.assertEqual(u'0412.34.56.78', f.clean('0412.34.56.78')) + self.assertEqual(u'012345678', f.clean('012345678')) + self.assertEqual(u'0412345678', f.clean('0412345678')) + self.assertEqual(u'', f.clean('')) + err_message = "[u'Enter a valid phone number in one of the formats 0x xxx xx xx, 0xx xx xx xx, 04xx xx xx xx, 0x/xxx.xx.xx, 0xx/xx.xx.xx, 04xx/xx.xx.xx, 0xxxxxxxx, 04xxxxxxxx, 0x.xxx.xx.xx, 0xx.xx.xx.xx, 04xx.xx.xx.xx.']" + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '01234567') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '12/345.67.89') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/345.678.90') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/34.56.789') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '0123/45.67.89') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/345 678 90') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012/34 56 789') + self.assertRaisesErrorWithMessage(ValidationError, err_message, f.clean, '012.34 56 789') + + def test_phone_number_field(self): + w = BERegionSelect() + self.assertEqual(u'<select name="regions">\n<option value="BRU">Brussels Capital Region</option>\n<option value="VLG" selected="selected">Flemish Region</option>\n<option value="WAL">Wallonia</option>\n</select>', w.render('regions', 'VLG')) + + def test_phone_number_field(self): + w = BEProvinceSelect() + self.assertEqual(u'<select name="provinces">\n<option value="VAN">Antwerp</option>\n<option value="BRU">Brussels</option>\n<option value="VOV">East Flanders</option>\n<option value="VBR">Flemish Brabant</option>\n<option value="WHT">Hainaut</option>\n<option value="WLG" selected="selected">Liege</option>\n<option value="VLI">Limburg</option>\n<option value="WLX">Luxembourg</option>\n<option value="WNA">Namur</option>\n<option value="WBR">Walloon Brabant</option>\n<option value="VWV">West Flanders</option>\n</select>', w.render('provinces', 'WLG')) Modified: django/trunk/tests/regressiontests/forms/tests.py =================================================================== --- django/trunk/tests/regressiontests/forms/tests.py 2010-10-11 22:36:17 UTC (rev 14159) +++ django/trunk/tests/regressiontests/forms/tests.py 2010-10-11 23:35:23 UTC (rev 14160) @@ -40,6 +40,7 @@ from fields import FieldsTests from validators import TestFieldWithValidators from widgets import WidgetTests, ClearableFileInputTests +from localflavor.be import BETests from input_formats import * -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.