diff --git a/mis_builder/CHANGES.rst b/mis_builder/CHANGES.rst index b9992b1d..ca880d82 100644 --- a/mis_builder/CHANGES.rst +++ b/mis_builder/CHANGES.rst @@ -13,6 +13,9 @@ Part of the work for this release has been done at the Sorrento sprint April 26-29, 2016. The rest (ie a major refactoring) has been done in the weeks after. +* [CHG] The divider suffix (k, M, etc) is not inserted automatically anymore + because it is inconsistent when working with prefixes; you need to add it + manually in the suffix * [IMP] AccountingExpressionProcessor now supports 'balu' expressions to obtain the unallocated profit/loss of previous fiscal years; get_unallocated_pl is the corresponding convenience method diff --git a/mis_builder/models/mis_report.py b/mis_builder/models/mis_report.py index 136f5c67..352b1571 100644 --- a/mis_builder/models/mis_report.py +++ b/mis_builder/models/mis_report.py @@ -621,20 +621,22 @@ class MisReportKpi(models.Model): def _render_num(self, lang, value, divider, dp, prefix, suffix, sign='-'): - divider_label = _get_selection_label( - self._columns['divider'].selection, divider) - if divider_label == '1': - divider_label = '' # format number following user language value = round(value / float(divider or 1), dp) or 0 value = lang.format( '%%%s.%df' % (sign, dp), value, grouping=True) - value = u'%s\N{NO-BREAK SPACE}%s\N{NO-BREAK SPACE}%s%s' % \ - (prefix or '', value, divider_label, suffix or '') value = value.replace('-', u'\N{NON-BREAKING HYPHEN}') - return value + if prefix: + prefix = prefix + u'\N{NO-BREAK SPACE}' + else: + prefix = '' + if suffix: + suffix = u'\N{NO-BREAK SPACE}' + suffix + else: + suffix = '' + return prefix + value + suffix class MisReportSubkpi(models.Model): diff --git a/mis_builder/tests/__init__.py b/mis_builder/tests/__init__.py index d6e30b64..21f45540 100644 --- a/mis_builder/tests/__init__.py +++ b/mis_builder/tests/__init__.py @@ -7,5 +7,6 @@ from . import test_aep from . import test_aggregate from . import test_fetch_query from . import test_mis_safe_eval +from . import test_render from . import test_simple_array from . import test_utc_midnight diff --git a/mis_builder/tests/test_fetch_query.py b/mis_builder/tests/test_fetch_query.py index 5b802b1c..cbb43fc5 100644 --- a/mis_builder/tests/test_fetch_query.py +++ b/mis_builder/tests/test_fetch_query.py @@ -21,7 +21,7 @@ class TestFetchQuery(common.TransactionCase): 'parent_row_id': None, 'row_id': u'total_test', 'cols': [{'val': 0, - 'val_r': u'\xa00\xa0', + 'val_r': u'0', 'val_c': u'total_test = len(test)', }] }], diff --git a/mis_builder/tests/test_render.py b/mis_builder/tests/test_render.py new file mode 100644 index 00000000..dbeff6b1 --- /dev/null +++ b/mis_builder/tests/test_render.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# © 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +import openerp.tests.common as common + +from ..models.accounting_none import AccountingNone + + +class TestRendering(common.TransactionCase): + + def setUp(self): + super(TestRendering, self).setUp() + self.kpi = self.env['mis.report.kpi'].create(dict( + name='testkpi', + description='Test KPI', + type='num', + dp=0, + )) + self.lang = self.env['res.lang'].search([('code', '=', 'en_US')])[0] + + def test_render(self): + self.assertEquals(u'1', self.kpi.render(self.lang, 1)) + self.assertEquals(u'1', self.kpi.render(self.lang, 1.1)) + self.assertEquals(u'2', self.kpi.render(self.lang, 1.6)) + self.kpi.dp = 2 + self.assertEquals(u'1.00', self.kpi.render(self.lang, 1)) + self.assertEquals(u'1.10', self.kpi.render(self.lang, 1.1)) + self.assertEquals(u'1.60', self.kpi.render(self.lang, 1.6)) + self.assertEquals(u'1.61', self.kpi.render(self.lang, 1.606)) + self.assertEquals(u'12,345.67', self.kpi.render(self.lang, 12345.67)) + + def test_render_negative(self): + # non breaking hyphen + self.assertEquals(u'\u20111', self.kpi.render(self.lang, -1)) + + def test_render_zero(self): + self.assertEquals(u'0', self.kpi.render(self.lang, 0)) + self.assertEquals(u'', self.kpi.render(self.lang, None)) + self.assertEquals(u'', self.kpi.render(self.lang, AccountingNone)) + + def test_render_suffix(self): + self.kpi.suffix = u'€' + self.assertEquals(u'1\xa0€', self.kpi.render(self.lang, 1)) + self.kpi.suffix = u'k€' + self.kpi.divider = '1e3' + self.assertEquals(u'1\xa0k€', self.kpi.render(self.lang, 1000)) + + def test_render_prefix(self): + self.kpi.prefix = u'$' + self.assertEquals(u'$\xa01', self.kpi.render(self.lang, 1)) + self.kpi.prefix = u'k$' + self.kpi.divider = '1e3' + self.assertEquals(u'k$\xa01', self.kpi.render(self.lang, 1000)) + + def test_render_divider(self): + self.kpi.divider = '1e3' + self.kpi.dp = 0 + self.assertEquals(u'1', self.kpi.render(self.lang, 1000)) + self.kpi.divider = '1e6' + self.kpi.dp = 3 + self.assertEquals(u'0.001', self.kpi.render(self.lang, 1000)) + self.kpi.divider = '1e-3' + self.kpi.dp = 0 + self.assertEquals(u'1,000', self.kpi.render(self.lang, 1)) + self.kpi.divider = '1e-6' + self.kpi.dp = 0 + self.assertEquals(u'1,000,000', self.kpi.render(self.lang, 1)) + + def test_render_pct(self): + self.kpi.type = 'pct' + self.assertEquals(u'100\xa0%', self.kpi.render(self.lang, 1)) + self.assertEquals(u'50\xa0%', self.kpi.render(self.lang, 0.5)) + self.kpi.dp = 2 + self.assertEquals(u'51.23\xa0%', self.kpi.render(self.lang, 0.5123)) + + def test_render_string(self): + self.kpi.type = 'str' + self.assertEquals(u'', self.kpi.render(self.lang, '')) + self.assertEquals(u'', self.kpi.render(self.lang, None)) + self.assertEquals(u'abcdé', self.kpi.render(self.lang, u'abcdé'))