summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Garcia <garcia.marc@gmail.com>2009-08-14 14:10:14 +0000
committerMarc Garcia <garcia.marc@gmail.com>2009-08-14 14:10:14 +0000
commita7beb20bf02b93b3beb6d694d888c904be9bc9ea (patch)
tree6df7bde8fc02d026bcd67b61db4f499c565602b1
parentad9f56aad62d4f5e623fa5f553e84971832a39ee (diff)
[soc2009/i18n] Tests improved, and bugs fixed on and because of tests. All tests now validate.
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/i18n-improvements@11451 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/conf/locale/ca/formats.py2
-rw-r--r--django/conf/locale/fr/formats.py2
-rw-r--r--django/forms/extras/widgets.py19
-rw-r--r--django/forms/fields.py12
-rw-r--r--django/utils/formats.py32
-rw-r--r--django/views/i18n.py2
-rw-r--r--tests/regressiontests/i18n/tests.py35
7 files changed, 65 insertions, 39 deletions
diff --git a/django/conf/locale/ca/formats.py b/django/conf/locale/ca/formats.py
index 464882a6ae..aebaea3d07 100644
--- a/django/conf/locale/ca/formats.py
+++ b/django/conf/locale/ca/formats.py
@@ -4,7 +4,7 @@
DATE_FORMAT = 'j \de F \de Y'
TIME_FORMAT = 'G:i:s'
-DATETIME_FORMAT = 'j \de F \de Y \a \le\s G:i'
+DATETIME_FORMAT = 'j \de F \de Y \\a \le\s G:i'
YEAR_MONTH_FORMAT = 'F \de\l Y'
MONTH_DAY_FORMAT = 'j \de F'
SHORT_DATE_FORMAT = 'd/m/Y'
diff --git a/django/conf/locale/fr/formats.py b/django/conf/locale/fr/formats.py
index 965f21304d..1d670d7f6a 100644
--- a/django/conf/locale/fr/formats.py
+++ b/django/conf/locale/fr/formats.py
@@ -14,5 +14,5 @@ SHORT_DATETIME_FORMAT = 'j M Y H:i:s'
# TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = ' '
+THOUSAND_SEPARATOR = ' '
# NUMBER_GROUPING =
diff --git a/django/forms/extras/widgets.py b/django/forms/extras/widgets.py
index 4e9e9aca29..04ad24d97b 100644
--- a/django/forms/extras/widgets.py
+++ b/django/forms/extras/widgets.py
@@ -9,6 +9,7 @@ from django.forms.widgets import Widget, Select
from django.utils.dates import MONTHS
from django.utils.safestring import mark_safe
from django.utils.formats import getformat
+from django.conf import settings
__all__ = ('SelectDateWidget',)
@@ -54,9 +55,14 @@ class SelectDateWidget(Widget):
day_html = self.create_select(name, self.day_field, value, day_val, choices)
format = getformat('DATE_FORMAT')
+ escaped = False
output = []
for char in format:
- if char in 'Yy':
+ if escaped:
+ escaped = False
+ elif char == '\\':
+ escaped = True
+ elif char in 'Yy':
output.append(year_html)
elif char in 'bFMmNn':
output.append(month_html)
@@ -75,7 +81,16 @@ class SelectDateWidget(Widget):
if y == m == d == "0":
return None
if y and m and d:
- return '%s-%s-%s' % (y, m, d)
+ if settings.USE_FORMAT_I18N:
+ input_format = getformat('DATE_INPUT_FORMATS')[0]
+ try:
+ date_value = datetime.date(int(y), int(m), int(d))
+ except ValueError:
+ pass
+ else:
+ return date_value.strftime(input_format)
+ else:
+ return '%s-%s-%s' % (y, m, d)
return data.get(name, None)
def create_select(self, name, field, value, val, choices):
diff --git a/django/forms/fields.py b/django/forms/fields.py
index c9a069edfd..fb40f87248 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -285,7 +285,7 @@ class DateField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(DateField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or getformat('DATE_INPUT_FORMATS')
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -299,7 +299,7 @@ class DateField(Field):
return value.date()
if isinstance(value, datetime.date):
return value
- for format in self.input_formats:
+ for format in self.input_formats or getformat('DATE_INPUT_FORMATS'):
try:
return datetime.date(*time.strptime(value, format)[:3])
except ValueError:
@@ -314,7 +314,7 @@ class TimeField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(TimeField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or getformat('TIME_INPUT_FORMATS')
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -326,7 +326,7 @@ class TimeField(Field):
return None
if isinstance(value, datetime.time):
return value
- for format in self.input_formats:
+ for format in self.input_formats or getformat('TIME_INPUT_FORMATS'):
try:
return datetime.time(*time.strptime(value, format)[3:6])
except ValueError:
@@ -341,7 +341,7 @@ class DateTimeField(Field):
def __init__(self, input_formats=None, *args, **kwargs):
super(DateTimeField, self).__init__(*args, **kwargs)
- self.input_formats = input_formats or getformat('DATETIME_INPUT_FORMATS')
+ self.input_formats = input_formats
def clean(self, value):
"""
@@ -361,7 +361,7 @@ class DateTimeField(Field):
if len(value) != 2:
raise ValidationError(self.error_messages['invalid'])
value = '%s %s' % tuple(value)
- for format in self.input_formats:
+ for format in self.input_formats or getformat('DATETIME_INPUT_FORMATS'):
try:
return datetime.datetime(*time.strptime(value, format)[:6])
except ValueError:
diff --git a/django/utils/formats.py b/django/utils/formats.py
index cf6f2a1fc2..8ad0afdd34 100644
--- a/django/utils/formats.py
+++ b/django/utils/formats.py
@@ -7,14 +7,6 @@ from django.utils.importlib import import_module
from django.utils import dateformat
from django.utils import numberformat
-def getformat_null(format_type):
- """
- For a specific format type, returns the default format as
- set on the settings.
- format_type is the name of the format, for example 'DATE_FORMAT'
- """
- return getattr(settings, format_type)
-
def project_formats_module():
"""
Returns the formats module for the current locale, defined
@@ -37,26 +29,20 @@ def django_formats_module():
except ImportError:
return None
-def getformat_real(format_type):
+def getformat(format_type):
"""
For a specific format type, returns the format for the
current language (locale) defaulting to the format on settings.
format_type is the name of the format, for example 'DATE_FORMAT'
"""
- for module in (project_formats_module(), django_formats_module()):
- if module:
- try:
- return getattr(module, format_type)
- except AttributeError:
- pass
- return getformat_null(format_type)
-
-# getformat will just return the value on setings if
-# we don't use i18n in our project
-if settings.USE_I18N and settings.USE_FORMAT_I18N:
- getformat = getformat_real
-else:
- getformat = getformat_null
+ if settings.USE_I18N and settings.USE_FORMAT_I18N:
+ for module in (project_formats_module(), django_formats_module()):
+ if module:
+ try:
+ return getattr(module, format_type)
+ except AttributeError:
+ pass
+ return getattr(settings, format_type)
def date_format(value, format=None):
"""
diff --git a/django/views/i18n.py b/django/views/i18n.py
index 4a19e4b31c..e70cd3eca3 100644
--- a/django/views/i18n.py
+++ b/django/views/i18n.py
@@ -208,7 +208,7 @@ def javascript_catalog(request, domain='djangojs', packages=None):
for k, v in pdict.items():
src.append("catalog['%s'] = [%s];\n" % (javascript_quote(k), ','.join(["''"]*(v+1))))
for k, v in get_formats().items():
- src.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(unicode(v)).encode('utf-8')))
+ src.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(unicode(v))))
src.extend(csrc)
src.append(LibFoot)
src.append(InterPolate)
diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py
index 693a3adacf..e07f8bf249 100644
--- a/tests/regressiontests/i18n/tests.py
+++ b/tests/regressiontests/i18n/tests.py
@@ -105,6 +105,8 @@ Localization of dates and numbers
... date_field = forms.DateField()
... datetime_field = forms.DateTimeField()
... time_field = forms.TimeField()
+>>> class SelectDateForm(forms.Form):
+... date_field = forms.DateField(widget=SelectDateWidget)
Locale independent
@@ -152,9 +154,9 @@ u'66666.666'
>>> template.Template('{{ f }}').render(ctxt)
u'99999.999'
>>> template.Template('{{ d }}').render(ctxt)
-u'desembre 31, 2009'
+u'2009-12-31'
>>> template.Template('{{ dt }}').render(ctxt)
-u'desembre 31, 2009, 8:50 p.m.'
+u'2009-12-31 20:50:00'
>>> template.Template('{{ n|floatformat:2 }}').render(ctxt)
u'66666.67'
>>> template.Template('{{ f|floatformat }}').render(ctxt)
@@ -163,9 +165,22 @@ u'100000.0'
u'12/31/2009'
>>> template.Template('{{ dt|date:"SHORT_DATETIME_FORMAT" }}').render(ctxt)
u'12/31/2009 8:50 p.m.'
->>> form = I18nForm({'decimal_field': u'66666,666', 'float_field': u'99999,999', 'date_field': u'12/31/2009', 'datetime_field': u'12/31/2009 20:50', 'time_field': u'20:50'})
+>>> form = I18nForm({'decimal_field': u'66666,666', 'float_field': u'99999,999', 'date_field': u'31/12/2009', 'datetime_field': u'31/12/2009 20:50', 'time_field': u'20:50'})
>>> form.is_valid()
False
+>>> form.errors['float_field']
+[u'Introdu\xefu un n\xfamero.']
+>>> form.errors['decimal_field']
+[u'Introdu\xefu un n\xfamero.']
+>>> form.errors['date_field']
+[u'Introdu\xefu una data v\xe0lida.']
+>>> form.errors['datetime_field']
+[u'Introdu\xefu una data/hora v\xe0lides.']
+>>> form2 = SelectDateForm({'date_field_month': u'12', 'date_field_day': u'31', 'date_field_year': u'2009'})
+>>> form2.is_valid()
+True
+>>> form2.cleaned_data['date_field']
+datetime.date(2009, 12, 31)
>>> SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))
u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>'
@@ -174,7 +189,7 @@ Catalan locale
>>> settings.USE_FORMAT_I18N = True
>>> activate('ca')
>>> getformat('DATE_FORMAT')
-'j \de N \de Y'
+'j \\de F \\de Y'
>>> getformat('FIRST_DAY_OF_WEEK')
1
>>> getformat('DECIMAL_SEPARATOR')
@@ -182,7 +197,7 @@ Catalan locale
>>> date_format(d)
u'31 de desembre de 2009'
>>> date_format(d, 'YEAR_MONTH_FORMAT')
-u'desembre de 2009'
+u'desembre del 2009'
>>> date_format(dt, 'SHORT_DATETIME_FORMAT')
u'31/12/2009 20:50'
>>> localize('No localizable')
@@ -236,6 +251,11 @@ datetime.date(2009, 12, 31)
datetime.datetime(2009, 12, 31, 20, 50)
>>> form.cleaned_data['time_field']
datetime.time(20, 50)
+>>> form2 = SelectDateForm({'date_field_month': u'12', 'date_field_day': u'31', 'date_field_year': u'2009'})
+>>> form2.is_valid()
+True
+>>> form2.cleaned_data['date_field']
+datetime.date(2009, 12, 31)
>>> SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))
u'<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_month" id="id_mydate_month">\n<option value="1">gener</option>\n<option value="2">febrer</option>\n<option value="3">mar\xe7</option>\n<option value="4">abril</option>\n<option value="5">maig</option>\n<option value="6">juny</option>\n<option value="7">juliol</option>\n<option value="8">agost</option>\n<option value="9">setembre</option>\n<option value="10">octubre</option>\n<option value="11">novembre</option>\n<option value="12" selected="selected">desembre</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>'
@@ -306,6 +326,11 @@ datetime.date(2009, 12, 31)
datetime.datetime(2009, 12, 31, 20, 50)
>>> form.cleaned_data['time_field']
datetime.time(20, 50)
+>>> form2 = SelectDateForm({'date_field_month': u'12', 'date_field_day': u'31', 'date_field_year': u'2009'})
+>>> form2.is_valid()
+True
+>>> form2.cleaned_data['date_field']
+datetime.date(2009, 12, 31)
>>> SelectDateWidget().render('mydate', datetime.date(2009, 12, 31))
u'<select name="mydate_month" id="id_mydate_month">\n<option value="1">January</option>\n<option value="2">February</option>\n<option value="3">March</option>\n<option value="4">April</option>\n<option value="5">May</option>\n<option value="6">June</option>\n<option value="7">July</option>\n<option value="8">August</option>\n<option value="9">September</option>\n<option value="10">October</option>\n<option value="11">November</option>\n<option value="12" selected="selected">December</option>\n</select>\n<select name="mydate_day" id="id_mydate_day">\n<option value="1">1</option>\n<option value="2">2</option>\n<option value="3">3</option>\n<option value="4">4</option>\n<option value="5">5</option>\n<option value="6">6</option>\n<option value="7">7</option>\n<option value="8">8</option>\n<option value="9">9</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n<option value="24">24</option>\n<option value="25">25</option>\n<option value="26">26</option>\n<option value="27">27</option>\n<option value="28">28</option>\n<option value="29">29</option>\n<option value="30">30</option>\n<option value="31" selected="selected">31</option>\n</select>\n<select name="mydate_year" id="id_mydate_year">\n<option value="2009" selected="selected">2009</option>\n<option value="2010">2010</option>\n<option value="2011">2011</option>\n<option value="2012">2012</option>\n<option value="2013">2013</option>\n<option value="2014">2014</option>\n<option value="2015">2015</option>\n<option value="2016">2016</option>\n<option value="2017">2017</option>\n<option value="2018">2018</option>\n</select>'