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.

Reply via email to