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