From 71b25c5addd81ba2af2196291a2f802327e176f9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 29 Nov 2013 09:52:56 +0100 Subject: [PATCH] [ADD] relative datetime qweb widget bzr revid: xmo@openerp.com-20131129085256-dwpcy0rd5v6bls9d --- openerp/addons/base/ir/ir_qweb.py | 19 ++++++++++++++++++- .../addons/test_converter/tests/test_html.py | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index bc8549ab63f..460833dbe17 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -812,7 +812,6 @@ class DurationConverter(osv.AbstractModel): locale = babel.Locale.parse( self.user_lang(cr, uid, context=context).code) - print locale factor = units[options['unit']] sections = [] @@ -826,6 +825,24 @@ class DurationConverter(osv.AbstractModel): sections.append(section) return u' '.join(sections) +class RelativeDatetimeConverter(osv.AbstractModel): + _name = 'ir.qweb.field.relative' + _inherit = 'ir.qweb.field' + + def value_to_html(self, cr, uid, value, column, options=None, context=None): + parse_format = openerp.tools.DEFAULT_SERVER_DATETIME_FORMAT + locale = babel.Locale.parse( + self.user_lang(cr, uid, context=context).code) + + if isinstance(value, basestring): + value = datetime.datetime.strptime(value, parse_format) + + # value should be a naive datetime in UTC. So is fields.datetime.now() + reference = datetime.datetime.strptime(column.now(), parse_format) + + return babel.dates.format_timedelta( + value - reference, add_direction=True, locale=locale) + def get_field_type(column, options): """ Gets a t-field's effective type from the field's column and its options diff --git a/openerp/tests/addons/test_converter/tests/test_html.py b/openerp/tests/addons/test_converter/tests/test_html.py index 98c784c39ef..71c08a412f4 100644 --- a/openerp/tests/addons/test_converter/tests/test_html.py +++ b/openerp/tests/addons/test_converter/tests/test_html.py @@ -2,6 +2,7 @@ import json import os import xml.dom.minidom +import datetime from openerp.tests import common from openerp.addons.base.ir import ir_qweb @@ -306,7 +307,7 @@ class TestDatetimeExport(TestBasicExport): class TestDurationExport(TestBasicExport): def setUp(self): super(TestDurationExport, self).setUp() - + # needs to have lang installed otherwise falls back on en_US self.registry('res.lang').load_lang(self.cr, self.uid, 'fr_FR') def test_negative(self): @@ -338,3 +339,19 @@ class TestDurationExport(TestBasicExport): result = converter(72, {'unit': 'second'}, {'lang': 'fr_FR'}) self.assertEqual(result, u"1 minute 12 secondes") + +class TestRelativeDatetime(TestBasicExport): + # not sure how a test based on "current time" should be tested. Even less + # so as it would mostly be a test of babel... + + def setUp(self): + super(TestRelativeDatetime, self).setUp() + # needs to have lang installed otherwise falls back on en_US + self.registry('res.lang').load_lang(self.cr, self.uid, 'fr_FR') + + def test_basic(self): + converter = self.get_converter('datetime', 'relative') + t = datetime.datetime.utcnow() - datetime.timedelta(hours=1) + + result = converter(t, context={'lang': 'fr_FR'}) + self.assertEqual(result, u"il y a 1 heure")