diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index 6c466355d07..cb2e8f191ed 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -15,6 +15,7 @@ import urllib2 import urlparse import re +import pytz import werkzeug.urls import werkzeug.utils from dateutil import parser @@ -153,15 +154,15 @@ class DateTime(orm.AbstractModel): def attributes(self, cr, uid, field_name, record, options, source_element, g_att, t_att, qweb_context, context=None): - column = record._model._all_columns[field_name].column value = record[field_name] if isinstance(value, basestring): value = datetime.datetime.strptime( value, DEFAULT_SERVER_DATETIME_FORMAT) if value: + # convert from UTC (server timezone) to user timezone value = fields.datetime.context_timestamp( cr, uid, timestamp=value, context=context) - value = value.strftime(openerp.tools.DEFAULT_SERVER_DATETIME_FORMAT) + value = value.strftime(DEFAULT_SERVER_DATETIME_FORMAT) attrs = super(DateTime, self).attributes( cr, uid, field_name, record, options, source_element, g_att, t_att, @@ -171,11 +172,31 @@ class DateTime(orm.AbstractModel): ]) def from_html(self, cr, uid, model, column, element, context=None): + if context is None: context = {} value = element.text_content().strip() if not value: return False - datetime.datetime.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT) - return value + # parse from string to datetime + dt = datetime.datetime.strptime(value, DEFAULT_SERVER_DATETIME_FORMAT) + + # convert back from user's timezone to UTC + tz_name = context.get('tz') \ + or self.pool['res.users'].read(cr, openerp.SUPERUSER_ID, uid, ['tz'], context=context)['tz'] + if tz_name: + try: + user_tz = pytz.timezone(tz_name) + utc = pytz.utc + + dt = user_tz.localize(dt).astimezone(utc) + except Exception: + logger.warn( + "Failed to convert the value for a field of the model" + " %s back from the user's timezone (%s) to UTC", + model, tz_name, + exc_info=True) + + # format back to string + return dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) class Text(orm.AbstractModel): _name = 'website.qweb.field.text' diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index e24d74e0625..57961a1d32c 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -422,7 +422,7 @@ class datetime(_column): tz_name = registry.get('res.users').read(cr, SUPERUSER_ID, uid, ['tz'])['tz'] if tz_name: try: - utc = pytz.timezone('UTC') + utc = pytz.utc context_tz = pytz.timezone(tz_name) utc_timestamp = utc.localize(timestamp, is_dst=False) # UTC = no DST return utc_timestamp.astimezone(context_tz)