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

Reply via email to