changeset d2328dec9188 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=d2328dec9188
description:
        Add format_timedelta in report

        issue7443
        review42151002
diffstat:

 trytond/report/report.py     |  47 ++++++++++++++++++++++++++++++++++++++++++++
 trytond/tests/test_report.py |  38 +++++++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 0 deletions(-)

diffs (113 lines):

diff -r 6aa537cd2ea7 -r d2328dec9188 trytond/report/report.py
--- a/trytond/report/report.py  Sun Jul 28 16:05:45 2019 +0200
+++ b/trytond/report/report.py  Wed Jul 31 11:08:18 2019 +0200
@@ -7,6 +7,7 @@
 import tempfile
 import warnings
 import zipfile
+import operator
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 from io import BytesIO
@@ -245,6 +246,7 @@
         report_context['records'] = records
         report_context['record'] = records[0] if records else None
         report_context['format_date'] = cls.format_date
+        report_context['format_timedelta'] = cls.format_timedelta
         report_context['format_currency'] = cls.format_currency
         report_context['format_number'] = cls.format_number
         report_context['datetime'] = datetime
@@ -340,6 +342,51 @@
         return lang.strftime(value, format=format)
 
     @classmethod
+    def format_timedelta(cls, value, converter=None, lang=None,
+            skip_zeros=False):
+        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
+
+        text = []
+        value = value.total_seconds()
+        sign = '-' if value < 0 else ''
+        value = abs(value)
+        converter = sorted(
+            converter.items(), key=operator.itemgetter(1), reverse=True)
+        values = []
+        for k, v in converter:
+            part, value = divmod(value, v)
+            values.append(part)
+
+        for (k, _), v in zip(converter[:-3], values):
+            if v:
+                text.append(lang.format('%d', v, True) + k)
+        if not skip_zeros:
+            time = '%02d:%02d' % tuple(values[-3:-1])
+            if values[-1] or value:
+                time += ':%02d' % values[-1]
+            text.append(time)
+        text = sign + ' '.join(text)
+        if value:
+            if not any(values[-3:]):
+                # Add space if no time
+                text += ' '
+            text += ('%.6f' % value)[1:]
+        return text
+
+    @classmethod
     def format_currency(cls, value, lang, currency, symbol=True,
             grouping=True):
         pool = Pool()
diff -r 6aa537cd2ea7 -r d2328dec9188 trytond/tests/test_report.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/trytond/tests/test_report.py      Wed Jul 31 11:08:18 2019 +0200
@@ -0,0 +1,38 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import datetime
+from trytond.tests.test_tryton import activate_module, with_transaction
+from trytond.report.report import Report
+
+
+class ReportTestCase(unittest.TestCase):
+    'Test Report'
+
+    @classmethod
+    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')
+
+        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')
+
+
+def suite():
+    suite = unittest.TestSuite()
+    loader = unittest.TestLoader()
+    suite.addTests(loader.loadTestsFromTestCase(ReportTestCase))
+    return suite

Reply via email to