diff --git a/CHANGELOG b/CHANGELOG index e8380b6891..96c98176a3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add format_timedelta to Report * Add partial TO_CHAR support for date and datetime on SQLite * Setup default logging for WSGI app * Add format argument to report format_date function diff --git a/trytond/ir/message.xml b/trytond/ir/message.xml index ae5b44cb2d..77c49c2ef9 100644 --- a/trytond/ir/message.xml +++ b/trytond/ir/message.xml @@ -197,5 +197,26 @@ this repository contains the full copyright notices and license terms. --> Failed to save, please retry. + + Y + + + M + + + w + + + d + + + h + + + m + + + s + diff --git a/trytond/report/report.py b/trytond/report/report.py index 07e4cd0abd..748299848d 100644 --- a/trytond/report/report.py +++ b/trytond/report/report.py @@ -25,6 +25,8 @@ try: except ImportError: Manifest, MANIFEST = None, None from genshi.filters import Translator + +from trytond.i18n import gettext from trytond.pool import Pool, PoolBase from trytond.transaction import Transaction from trytond.url import URLMixin @@ -64,6 +66,16 @@ FORMAT2EXT = { 'xls95': 'xls', } +TIMEDELTA_DEFAULT_CONVERTER = { + 's': 1, + } +TIMEDELTA_DEFAULT_CONVERTER['m'] = TIMEDELTA_DEFAULT_CONVERTER['s'] * 60 +TIMEDELTA_DEFAULT_CONVERTER['h'] = TIMEDELTA_DEFAULT_CONVERTER['m'] * 60 +TIMEDELTA_DEFAULT_CONVERTER['d'] = TIMEDELTA_DEFAULT_CONVERTER['h'] * 24 +TIMEDELTA_DEFAULT_CONVERTER['w'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 7 +TIMEDELTA_DEFAULT_CONVERTER['M'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 30 +TIMEDELTA_DEFAULT_CONVERTER['Y'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 365 + class ReportFactory: @@ -342,22 +354,20 @@ class Report(URLMixin, PoolBase): return lang.strftime(value, format=format) @classmethod - def format_timedelta(cls, value, converter=None, lang=None, - skip_zeros=False): + def format_timedelta(cls, value, converter=None, lang=None): pool = Pool() Lang = pool.get('ir.lang') if lang is None: lang = Lang.get() - if converter is None: - converter = { - 's': 1, - } - converter['m'] = converter['s'] * 60 - converter['h'] = converter['m'] * 60 - converter['d'] = converter['h'] * 24 - converter['w'] = converter['d'] * 7 - converter['M'] = converter['d'] * 30 - converter['Y'] = converter['d'] * 365 + if not converter: + converter = TIMEDELTA_DEFAULT_CONVERTER + if value is None: + return '' + + def translate(k): + xml_id = 'ir.msg_timedelta_%s' % k + translation = gettext(xml_id) + return translation if translation != xml_id else k text = [] value = value.total_seconds() @@ -372,8 +382,8 @@ class Report(URLMixin, PoolBase): for (k, _), v in zip(converter[:-3], values): if v: - text.append(lang.format('%d', v, True) + k) - if not skip_zeros: + text.append(lang.format('%d', v, True) + translate(k)) + if any(values[-3:]) or not text: time = '%02d:%02d' % tuple(values[-3:-1]) if values[-1] or value: time += ':%02d' % values[-1] diff --git a/trytond/tests/test_report.py b/trytond/tests/test_report.py index 0e4084102b..848ad89591 100644 --- a/trytond/tests/test_report.py +++ b/trytond/tests/test_report.py @@ -13,22 +13,36 @@ class ReportTestCase(unittest.TestCase): def setUpClass(cls): activate_module('tests') + +def create_test_format_timedelta(i, in_, out): @with_transaction() - def test_format_timedelta(self): - "format_timedelta returns a string with the input time" + def test(self): + self.assertEqual(Report.format_timedelta(in_), out) + test.__name__ = 'test_format_timedelta_%d' % i + test.__doc__ = "test format_timedelta of %s" % in_ + return test - timedelta = Report.format_timedelta( - datetime.timedelta(days=400, hours=5)) - self.assertEqual(timedelta, '1Y 1M 5d 05:00') - timedelta = Report.format_timedelta( - datetime.timedelta(days=400)) - self.assertEqual(timedelta, '1Y 1M 5d 00:00') - - timedelta = Report.format_timedelta( - datetime.timedelta(days=400, hours=5, minutes=30, seconds=40), - skip_zeros=True) - self.assertEqual(timedelta, '1Y 1M 5d') +for i, (in_, out) in enumerate([ + (None, ''), + (datetime.timedelta(), '00:00'), + (datetime.timedelta(days=3, hours=5, minutes=30), '3d 05:30'), + (datetime.timedelta(weeks=48), '11M 6d'), + (datetime.timedelta(weeks=50), '11M 2w 6d'), + (datetime.timedelta(weeks=52), '12M 4d'), + (datetime.timedelta(days=360), '12M'), + (datetime.timedelta(days=364), '12M 4d'), + (datetime.timedelta(days=365), '1Y'), + (datetime.timedelta(days=366), '1Y 1d'), + (datetime.timedelta(hours=2, minutes=5, seconds=10), '02:05:10'), + (datetime.timedelta(minutes=15, microseconds=42), + '00:15:00.000042'), + (datetime.timedelta(days=1, microseconds=42), '1d .000042'), + (datetime.timedelta(seconds=-1), '-00:00:01'), + (datetime.timedelta(days=-1, hours=-5, minutes=-30), '-1d 05:30'), + ]): + test_method = create_test_format_timedelta(i, in_, out) + setattr(ReportTestCase, test_method.__name__, test_method) def suite():