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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -197,5 +197,26 @@ this repository contains the full copyright notices and license terms. -->
|
||||
<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>
|
||||
|
||||
+24
-14
@@ -25,6 +25,8 @@ try:
|
||||
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 @@ FORMAT2EXT = {
|
||||
'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 @@ class Report(URLMixin, PoolBase):
|
||||
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 @@ class Report(URLMixin, PoolBase):
|
||||
|
||||
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]
|
||||
|
||||
@@ -13,22 +13,36 @@ class ReportTestCase(unittest.TestCase):
|
||||
def setUpClass(cls):
|
||||
activate_module('tests')
|
||||
|
||||
|
||||
def create_test_format_timedelta(i, in_, out):
|
||||
@with_transaction()
|
||||
def test_format_timedelta(self):
|
||||
"format_timedelta returns a string with the input time"
|
||||
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, 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')
|
||||
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():
|
||||
|
||||
Reference in New Issue
Block a user