Naresh(OpenERP) has proposed merging
lp:~openerp-dev/openobject-server/trunk-bug-729690-nch into
lp:openobject-server.
Requested reviews:
Vo Minh Thu (OpenERP) (vmt-openerp)
Olivier Dony (OpenERP) (odo-openerp)
Related bugs:
Bug #729690 in OpenERP Server: "[reports] Date format should not rely on the
locale of the OpenERP server (e.g for month names)"
https://bugs.launchpad.net/openobject-server/+bug/729690
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-729690-nch/+merge/78833
--
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-bug-729690-nch/+merge/78833
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-server/trunk-bug-729690-nch.
=== modified file 'openerp/osv/orm.py'
--- openerp/osv/orm.py 2011-10-07 14:49:44 +0000
+++ openerp/osv/orm.py 2011-10-10 13:01:29 +0000
@@ -397,17 +397,17 @@
# TODO: improve this, very slow for reports
if self._fields_process:
lang = self._context.get('lang', 'en_US') or 'en_US'
+ timezone = self._context.get('tz', 'UTC') or 'UTC'
lang_obj_ids = self.pool.get('res.lang').search(self._cr, self._uid, [('code', '=', lang)])
if not lang_obj_ids:
raise Exception(_('Language with code "%s" is not defined in your system !\nDefine it through the Administration menu.') % (lang,))
lang_obj = self.pool.get('res.lang').browse(self._cr, self._uid, lang_obj_ids[0])
-
for field_name, field_column in fields_to_fetch:
if field_column._type in self._fields_process:
for result_line in field_values:
result_line[field_name] = self._fields_process[field_column._type](result_line[field_name])
if result_line[field_name]:
- result_line[field_name].set_value(self._cr, self._uid, result_line[field_name], self, field_column, lang_obj)
+ result_line[field_name].set_value(self._cr, self._uid, result_line[field_name], self, field_column, lang_obj, timezone)
if not field_values:
# Where did those ids come from? Perhaps old entries in ir_model_dat?
=== modified file 'openerp/report/printscreen/ps_list.py'
--- openerp/report/printscreen/ps_list.py 2011-06-23 09:04:57 +0000
+++ openerp/report/printscreen/ps_list.py 2011-10-10 13:01:29 +0000
@@ -26,7 +26,6 @@
from lxml import etree
from openerp.report import render, report_sxw
import locale
-
import time, os
from operator import itemgetter
from datetime import datetime
@@ -137,7 +136,7 @@
_append_node('company', pooler.get_pool(self.cr.dbname).get('res.users').browse(self.cr,uid,uid).company_id.name)
rpt_obj = pooler.get_pool(self.cr.dbname).get('res.users')
- rml_obj=report_sxw.rml_parse(self.cr, uid, rpt_obj._name,context)
+ rml_obj=report_sxw.rml_parse(self.cr, uid, rpt_obj._name, context=context)
_append_node('header-date', str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")))
l = []
t = 0
@@ -198,9 +197,7 @@
if fields[f]['type'] == 'date' and line[f]:
new_d1 = line[f]
if not line.get('__group'):
- format = str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'))
- d1 = datetime.strptime(line[f],'%Y-%m-%d')
- new_d1 = d1.strftime(format)
+ new_d1 = rml_obj.formatLang(value = line[f], date=True)
line[f] = new_d1
if fields[f]['type'] == 'time' and line[f]:
@@ -214,12 +211,9 @@
if fields[f]['type'] == 'datetime' and line[f]:
new_d1 = line[f]
if not line.get('__group'):
- format = str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'))+' '+str(locale.nl_langinfo(locale.T_FMT))
- d1 = datetime.strptime(line[f], '%Y-%m-%d %H:%M:%S')
- new_d1 = d1.strftime(format)
+ new_d1 = rml_obj.formatLang(value =line[f], date_time=True)
line[f] = new_d1
-
if line.get('__group'):
col = etree.SubElement(node_line, 'col', para='group', tree='no')
else:
=== modified file 'openerp/report/report_sxw.py'
--- openerp/report/report_sxw.py 2011-09-21 23:21:50 +0000
+++ openerp/report/report_sxw.py 2011-10-10 13:01:29 +0000
@@ -72,12 +72,16 @@
return len((datetime.now()).strftime(date_format))
class _format(object):
- def set_value(self, cr, uid, name, object, field, lang_obj):
+ def set_value(self, cr, uid, name, object, field, lang_obj, tz='UTC'):
self.object = object
self._field = field
self.name = name
self.lang_obj = lang_obj
-
+ self.date_fmt = re.sub(tools.babel_fmt_pattern, tools.fmt_sub, self.lang_obj.date_format)
+ self.time_fmt = re.sub(tools.babel_fmt_pattern, tools.fmt_sub, self.lang_obj.time_format)
+ self.datetime_fmt = self.date_fmt + " " + self.time_fmt
+ self.locale_tz = tz
+
class _float_format(float, _format):
def __init__(self,value):
super(_float_format, self).__init__()
@@ -110,7 +114,7 @@
if self.val:
if getattr(self,'name', None):
date = datetime.strptime(self.name[:get_date_length()], DT_FORMAT)
- return date.strftime(str(self.lang_obj.date_format))
+ return tools.format_datetime(date, self.date_fmt, self.lang_obj.code, self.locale_tz)
return self.val
class _dttime_format(str, _format):
@@ -120,9 +124,8 @@
def __str__(self):
if self.val and getattr(self,'name', None):
- return datetime.strptime(self.name, DHM_FORMAT)\
- .strftime("%s %s"%(str(self.lang_obj.date_format),
- str(self.lang_obj.time_format)))
+ date = datetime.strptime(self.name, DHM_FORMAT)
+ return tools.format_datetime(date, self.datetime_fmt, self.lang_obj.code, self.locale_tz)
return self.val
@@ -289,22 +292,19 @@
self.lang_dict_called = True
if date or date_time:
- if not str(value):
- return ''
-
- date_format = self.lang_dict['date_format']
+ date_format = re.sub(tools.babel_fmt_pattern, tools.fmt_sub, self.lang_dict['date_format'])
+ datetime_format = re.sub(tools.babel_fmt_pattern, tools.fmt_sub, self.lang_dict['time_format'])
parse_format = DT_FORMAT
+ locale_lang = self.localcontext.get('lang', 'en_US') or 'en_US'
+ locale_tz = self.localcontext.get('tz', 'UTC') or 'UTC'
if date_time:
value=value.split('.')[0]
- date_format = date_format + " " + self.lang_dict['time_format']
+ date_format = date_format + " " + datetime_format
parse_format = DHM_FORMAT
if not isinstance(value, time.struct_time):
- return time.strftime(date_format, time.strptime(value[:get_date_length(parse_format)], parse_format))
-
- else:
- date = datetime(*value.timetuple()[:6])
- return date.strftime(date_format)
-
+ return tools.format_datetime(datetime.strptime(value[:get_date_length(parse_format)], parse_format)
+ ,date_format, locale_lang, locale_tz)
+ return tools.format_datetime(datetime(*value.timetuple()[:6]), date_format, locale_lang, locale_tz)
res = self.lang_dict['lang_obj'].format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary)
if currency_obj:
if currency_obj.position == 'after':
=== modified file 'openerp/tools/misc.py'
--- openerp/tools/misc.py 2011-09-22 09:54:43 +0000
+++ openerp/tools/misc.py 2011-10-10 13:01:29 +0000
@@ -38,6 +38,11 @@
import time
import warnings
import zipfile
+import babel.dates
+try:
+ import pytz
+except Exception:
+ pytz = None
from collections import defaultdict
from datetime import datetime
from email.MIMEText import MIMEText
@@ -935,9 +940,7 @@
Defaults to UTC if no working timezone can be found.
@return the timezone identifier as expected by pytz.timezone.
"""
- try:
- import pytz
- except Exception:
+ if pytz is None:
loglevels.Logger().notifyChannel("detect_server_timezone", loglevels.LOG_WARNING,
"Python pytz module is not available. Timezone will be set to UTC by default.")
return 'UTC'
@@ -993,6 +996,42 @@
DEFAULT_SERVER_DATE_FORMAT,
DEFAULT_SERVER_TIME_FORMAT)
+##TODO:remove this monkey patch when the bug is fixed in the babel
+## There is a bug when the format contains 'w', D','Y' in babel.dates.DateTimeFormat.get_day_of_year
+def get_day_of_year(self, date=None):
+ if date is None:
+ date = self.value
+ return (date - date.replace(day=1,month=1)).days + 1
+try:
+ babel.dates.format_datetime(datetime.utcnow(),'D')
+except TypeError:
+ babel.dates.DateTimeFormat.get_day_of_year = get_day_of_year
+
+##Format Conversion function used to convert from normal to babel format
+strftime_to_unicode = {'a':'E','A':'EEEE','b': 'MMM','B':'MMMM','c': 'E MMM d hh:mm:ss yyyy','d':'d','H': 'HH',
+ 'I': 'hh','j': 'D','m': 'MM','M': 'mm','p': 'a','S': 'ss','w': 'e','x': 'M/d/yy','X': 'hh:mm:ss',
+ 'y': 'yy','Y': 'yyyy','U': 'w','W': 'w'
+ }
+babel_fmt_pattern = r"(%%|%\w|[^%]+)"
+
+def fmt_sub(match):
+ if match.group(0) == '%%':
+ return '%'
+ if match.group(0).startswith('%'):
+ # do sub by looking up into dict
+ # + need to handle %x/%X separately as 'short' currently its replaced statically
+ return (strftime_to_unicode[match.group(0)[1]]).replace("'","")
+ return "'%s'" % match.group(0).replace("'","''")
+
+def format_datetime(value, format, locale='en_us', tz='UTC'):
+ if pytz is None:
+ return babel.dates.format_datetime(value, format, locale=locale)
+ try:
+ tz = pytz.timezone(tz)
+ except pytz.UnknownTimeZoneError:
+ tz = None
+ return babel.dates.format_datetime(value, format, locale=locale, tzinfo=tz)
+
# Python's strftime supports only the format directives
# that are available on the platform's libc, so in order to
# be cross-platform we map to the directives required by
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp