changeset ca0465b43a33 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=ca0465b43a33
description:
        Improve Report.format_timedelta

        - Use static default converter
        - Remove skip_zeros as alignment will not work any way
        - Manage None value
        - Translate labels
        - Split tests

        issue7443
        review257891002
diffstat:

 CHANGELOG                    |   1 +
 trytond/ir/message.xml       |  21 +++++++++++++++++++++
 trytond/report/report.py     |  38 ++++++++++++++++++++++++--------------
 trytond/tests/test_report.py |  42 ++++++++++++++++++++++++++++--------------
 4 files changed, 74 insertions(+), 28 deletions(-)

diffs (165 lines):

diff -r a28208cc50a0 -r ca0465b43a33 CHANGELOG
--- a/CHANGELOG Fri Aug 09 17:03:11 2019 +0200
+++ b/CHANGELOG Sun Aug 18 19:08:11 2019 +0200
@@ -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 -r a28208cc50a0 -r ca0465b43a33 trytond/ir/message.xml
--- a/trytond/ir/message.xml    Fri Aug 09 17:03:11 2019 +0200
+++ b/trytond/ir/message.xml    Sun Aug 18 19:08:11 2019 +0200
@@ -197,5 +197,26 @@
         <record model="ir.message" id="msg_html_editor_save_fail">
             <field name="text">Failed to save, please retry.</field>
         </record>
+        <record model="ir.message" id="msg_timedelta_Y">
+            <field name="text">Y</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_M">
+            <field name="text">M</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_w">
+            <field name="text">w</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_d">
+            <field name="text">d</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_h">
+            <field name="text">h</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_m">
+            <field name="text">m</field>
+        </record>
+        <record model="ir.message" id="msg_timedelta_s">
+            <field name="text">s</field>
+        </record>
     </data>
 </tryton>
diff -r a28208cc50a0 -r ca0465b43a33 trytond/report/report.py
--- a/trytond/report/report.py  Fri Aug 09 17:03:11 2019 +0200
+++ b/trytond/report/report.py  Sun Aug 18 19:08:11 2019 +0200
@@ -25,6 +25,8 @@
 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 @@
     '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 @@
         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 @@
 
         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 -r a28208cc50a0 -r ca0465b43a33 trytond/tests/test_report.py
--- a/trytond/tests/test_report.py      Fri Aug 09 17:03:11 2019 +0200
+++ b/trytond/tests/test_report.py      Sun Aug 18 19:08:11 2019 +0200
@@ -13,22 +13,36 @@
     def setUpClass(cls):
         activate_module('tests')
 
-    @with_transaction()
-    def test_format_timedelta(self):
-        "format_timedelta returns a string with the input time"
 
-        timedelta = Report.format_timedelta(
-            datetime.timedelta(days=400, hours=5))
-        self.assertEqual(timedelta, '1Y 1M 5d 05:00')
+def create_test_format_timedelta(i, in_, out):
+    @with_transaction()
+    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))
-        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():

Reply via email to