diff options
| author | Lucas Lefèvre <lul@odoo.com> | 2019-10-10 11:08:51 +0200 |
|---|---|---|
| committer | fw-bot <otis@odoo.com> | 2019-10-16 15:49:49 +0000 |
| commit | 645ae69bb94bb810c7afc031d9eee9e89784a3df (patch) | |
| tree | 3801aa12b1a4419b03b03c84b154ec6bb9cb246e /addons/web/tests | |
| parent | e76c65e8b4a75df13e00f2b44e297deafa9e51e4 (diff) | |
[FIX] web: Correctly aggregate values in exported parent groups
When exporting a grouped list view with some nested groups, the aggregate value
of parent groups are not correct. It always sums aggregated values of children
whether the group operator is 'sum' or not (could be 'max', 'avg', ...).
This behavior is wrong and can even lead to a crash if the aggregated field is a
date field (e.g. with group_operator='max'). (Try two sum two dates...)
The quick fix 85cf47f was merged just before OXP to avoid any crash. This fix
limited the support of aggregates to only int and float fields.
This commit remove this limitation.
This commit correclty implements the aggregation for parent group for all
field types and all group_operator.
This commit also improves the export feature tests.
X-original-commit: 5e7e4fa98698967e3c4fd0903f4aa8e91981a6cd
Diffstat (limited to 'addons/web/tests')
| -rw-r--r-- | addons/web/tests/__init__.py | 1 | ||||
| -rw-r--r-- | addons/web/tests/test_export.py | 176 |
2 files changed, 0 insertions, 177 deletions
diff --git a/addons/web/tests/__init__.py b/addons/web/tests/__init__.py index b479a574e46..1ed329bafe1 100644 --- a/addons/web/tests/__init__.py +++ b/addons/web/tests/__init__.py @@ -6,4 +6,3 @@ from . import test_js from . import test_menu from . import test_serving_base from . import test_click_everywhere -from . import test_export diff --git a/addons/web/tests/test_export.py b/addons/web/tests/test_export.py deleted file mode 100644 index b0fed393e10..00000000000 --- a/addons/web/tests/test_export.py +++ /dev/null @@ -1,176 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from unittest.mock import patch -import json -from odoo import http -from odoo.tests import common, new_test_user -from odoo.addons.web.controllers.main import ExportXlsxWriter - - -class TestExport(common.HttpCase): - - def setUp(self): - super().setUp() - - # Archive demo partners - self.env['res.users'].search([]).active = False - self.env['res.partner'].search([]).active = False - new_test_user(self.env, login='fef', password='pwd') - self.authenticate('fef', 'pwd') - - self.env['res.partner'].create([{ - 'name': 'partner 1', - 'comment': 'yop', - 'website': 'yop.com', - 'credit_limit': 0, - },{ - 'name': 'partner 2', - 'comment': 'yop', - 'website': 'blop.com', - 'credit_limit': 3, - },{ - 'name': 'partner 3', - 'comment': 'yop', - 'website': 'blop.com', - 'credit_limit': 1, - }, { - 'name': 'partner 4', - 'comment': 'blop', - 'website': 'blop.com', - 'credit_limit': 2, - }]) - - self.worksheet = {} # mock worksheet - - self.default_params = { - 'domain': [], - 'fields': [{ - 'label': "Partner name", - 'name': 'name', - }, { - 'label': "Comment", - 'name': "comment", - }, { - 'label': 'Website', - 'name': 'website', - }], - 'groupby': [], - 'ids': False, - 'import_compat': False, - 'model': 'res.partner', - } - - def mock_write(self, row, column, value, style=None): - self.worksheet[row, column] = value - - def test_grouped_list_export(self): - - with patch.object(ExportXlsxWriter, 'write', self.mock_write): - self.default_params['groupby'] = ['comment', 'website'] - params = dict(self.default_params, **{ - 'groupby': ['comment', 'website'], - 'fields': [*self.default_params['fields'], {'label': "Credit Limit", 'name': 'credit_limit'}] - }) - self.url_open('/web/export/xlsx', data={ - 'data': json.dumps(params), - 'token': 'dummy', - 'csrf_token': http.WebRequest.csrf_token(self), - }) - - # Main header - self.assertEqual(self.worksheet[0, 0], "Partner name", "It should display the list header") - self.assertEqual(self.worksheet[0, 1], "Comment", "It should display the list header") - self.assertEqual(self.worksheet[0, 2], "Website", "It should display the list header") - self.assertEqual(self.worksheet[0, 3], "Credit Limit", "It should display the list header") - - # Header: Group Comment=blop - self.assertEqual(self.worksheet[1, 0], "blop (1)", "It should display the group header") - self.assertEqual(self.worksheet[1, 3], 2, "It should display the aggregated value") - - # Header: Group Comment=blop > Website=http://blop.com - self.assertEqual(self.worksheet[2, 0], " http://blop.com (1)", "It should display the group header") - self.assertEqual(self.worksheet[2, 3], 2, "It should display the aggregated value") - - # Data: Group Comment=blop > Website=http://blop.com - self.assertEqual(self.worksheet[3, 0], "partner 4") - self.assertEqual(self.worksheet[3, 1], "blop") - self.assertEqual(self.worksheet[3, 2], "http://blop.com") - self.assertEqual(self.worksheet[3, 3], 2) - - # Header: Group Comment=yop - self.assertEqual(self.worksheet[4, 0], "yop (3)", "It should display the group header") - self.assertEqual(self.worksheet[4, 3], 4, "It should display the aggregated value") - - # Header: Group Comment=yop > Website=http://blop.com - self.assertEqual(self.worksheet[5, 0], " http://blop.com (2)", "It should display the group header") - self.assertEqual(self.worksheet[5, 3], 4, "It should display the aggregated value") - - # Data: Group Comment=yop > Website=http://blop.com - self.assertEqual(self.worksheet[6, 0], "partner 2") - self.assertEqual(self.worksheet[6, 1], "yop") - self.assertEqual(self.worksheet[6, 2], "http://blop.com") - self.assertEqual(self.worksheet[6, 3], 3) - - self.assertEqual(self.worksheet[7, 0], "partner 3") - self.assertEqual(self.worksheet[7, 1], "yop") - self.assertEqual(self.worksheet[7, 2], "http://blop.com") - self.assertEqual(self.worksheet[7, 3], 1) - - # Header: Group Comment=yop > Website=http://yop.com - self.assertEqual(self.worksheet[8, 0], " http://yop.com (1)", "It should display the group header") - self.assertEqual(self.worksheet[8, 3], '', "It should not have any aggregated value") - - # Data: Group Comment=yop > Website=http://yop.com - self.assertEqual(self.worksheet[9, 0], "partner 1") - self.assertEqual(self.worksheet[9, 1], "yop") - self.assertEqual(self.worksheet[9, 2], "http://yop.com") - self.assertEqual(self.worksheet[9, 3], 0) - - # Header: Group Comment=False - self.assertEqual(self.worksheet[10, 0], "Undefined (1)", "It should display the group header") - self.assertEqual(self.worksheet[10, 3], '', "It should not have any aggregated value") - - # Header: Group Comment=False > Website=False - self.assertEqual(self.worksheet[11, 0], " Undefined (1)", "It should display the group header") - self.assertEqual(self.worksheet[11, 3], '', "It should not have any aggregated value") - - # Data: Group Comment=False > Website=False - self.assertEqual(self.worksheet[12, 0], "fef (base.group_user)") - self.assertEqual(self.worksheet[12, 1], "") - self.assertEqual(self.worksheet[12, 2], "") - self.assertEqual(self.worksheet[12, 3], 0) - - def test_list_export(self): - - with patch.object(ExportXlsxWriter, 'write', self.mock_write): - self.url_open('/web/export/xlsx', data={ - 'data': json.dumps(self.default_params), - 'token': 'dummy', - 'csrf_token': http.WebRequest.csrf_token(self), - }) - - # Main header - self.assertEqual(self.worksheet[0, 0], "Partner name", "It should display the list header") - self.assertEqual(self.worksheet[0, 1], "Comment", "It should display the list header") - self.assertEqual(self.worksheet[0, 2], "Website", "It should display the list header") - - self.assertEqual(self.worksheet[1, 0], "fef (base.group_user)") - self.assertEqual(self.worksheet[1, 1], "") - self.assertEqual(self.worksheet[1, 2], "") - - self.assertEqual(self.worksheet[2, 0], "partner 1") - self.assertEqual(self.worksheet[2, 1], "yop") - self.assertEqual(self.worksheet[2, 2], "http://yop.com") - - self.assertEqual(self.worksheet[3, 0], "partner 2") - self.assertEqual(self.worksheet[3, 1], "yop") - self.assertEqual(self.worksheet[3, 2], "http://blop.com") - - self.assertEqual(self.worksheet[4, 0], "partner 3") - self.assertEqual(self.worksheet[4, 1], "yop") - self.assertEqual(self.worksheet[4, 2], "http://blop.com") - - self.assertEqual(self.worksheet[5, 0], "partner 4") - self.assertEqual(self.worksheet[5, 1], "blop") - self.assertEqual(self.worksheet[5, 2], "http://blop.com") |
