From baab0528fd79fe377432f9f6ad36ea4f1f3257a7 Mon Sep 17 00:00:00 2001 From: Florian Damhaut Date: Tue, 15 Feb 2022 10:53:25 +0000 Subject: [PATCH] [FIX] base: negative duration correct html render Step to reproduce: - Render negative duration with the duration widget Example V15: - Create timesheet entry with negative duration (e.g. -00:30) - Print the timesheet entry Current Behaviour: - Time is rendered as Time-1h (in e.g. -01:30) Behaviour after PR: - Time is correctly rendered (in e.g. -00:30) opw-2731186 closes odoo/odoo#86360 X-original-commit: a45e2c03e26034f683a692d9c93e26925f7c2a21 Signed-off-by: Damhaut Florian (flda) --- odoo/addons/base/models/ir_qweb_fields.py | 17 +++++++++-------- odoo/addons/test_converter/tests/test_html.py | 5 +++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py index 6ee26f0c085..d08c8c14cd8 100644 --- a/odoo/addons/base/models/ir_qweb_fields.py +++ b/odoo/addons/base/models/ir_qweb_fields.py @@ -577,6 +577,10 @@ class DurationConverter(models.AbstractModel): r = round((value * factor) / round_to) * round_to sections = [] + sign = '' + if value < 0: + r = -r + sign = '-' if options.get('digital'): for unit, label, secs_per_unit in TIMEDELTA_UNITS: @@ -585,14 +589,9 @@ class DurationConverter(models.AbstractModel): v, r = divmod(r, secs_per_unit) if not v and (secs_per_unit > factor or secs_per_unit < round_to): continue - if len(sections): - sections.append(':') - sections.append("%02.0f" % int(round(v))) - return ''.join(sections) + sections.append(u"%02.0f" % int(round(v))) + return sign + u':'.join(sections) - if value < 0: - r = -r - sections.append('-') for unit, label, secs_per_unit in TIMEDELTA_UNITS: v, r = divmod(r, secs_per_unit) if not v: @@ -607,7 +606,9 @@ class DurationConverter(models.AbstractModel): if section: sections.append(section) - return ' '.join(sections) + if sign: + sections.insert(0, sign) + return u' '.join(sections) class RelativeDatetimeConverter(models.AbstractModel): diff --git a/odoo/addons/test_converter/tests/test_html.py b/odoo/addons/test_converter/tests/test_html.py index 9a56838585e..49544b84fba 100644 --- a/odoo/addons/test_converter/tests/test_html.py +++ b/odoo/addons/test_converter/tests/test_html.py @@ -333,6 +333,11 @@ class TestDurationExport(TestBasicExport): result = converter(72, {'unit': 'second'}, {'lang': 'fr_FR'}) self.assertEqual(result, u"1 minute 12 secondes") + def test_negative_digital(self): + converter = self.get_converter('float', 'duration') + result = converter(-90, {'unit': 'minute', 'round': 'minute', 'digital': True}, {'lang': 'fr_FR'}) + self.assertEqual(result, u'-01:30') + class TestRelativeDatetime(TestBasicExport): # not sure how a test based on "current time" should be tested. Even less