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():