From cafa5e785420fb3ceeb8836652c5d38ef5598fcc Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 3 Feb 2014 13:33:11 +0100 Subject: [PATCH 1/3] [FIX] orm: read_group aggregates values on all columns instead of only the one of the parent model bzr revid: mat@openerp.com-20140203123311-38rwp7tfyc08flid --- openerp/osv/orm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index e7121bb4635..c8e7c92b1d8 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -2670,12 +2670,12 @@ class BaseModel(object): f for f in fields if f not in ('id', 'sequence') if fget[f]['type'] in ('integer', 'float') - if (f in self._columns and getattr(self._columns[f], '_classic_write'))] + if (f in self._all_columns and getattr(self._all_columns[f].column, '_classic_write'))] for f in aggregated_fields: group_operator = fget[f].get('group_operator', 'sum') if flist: flist += ', ' - qualified_field = '"%s"."%s"' % (self._table, f) + qualified_field = self._inherits_join_calc(groupby, query) flist += "%s(%s) AS %s" % (group_operator, qualified_field, f) gb = groupby and (' GROUP BY ' + qualified_groupby_field) or '' From 6ea8851fd07c3cdf216e0695f0a5aba987e7e625 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 3 Feb 2014 14:33:31 +0100 Subject: [PATCH 2/3] [ADD] test read_group on a column of _inherits model and group on right field bzr revid: mat@openerp.com-20140203133331-mujvv812zd971ci2 --- openerp/addons/base/tests/test_base.py | 17 +++++++++++++++++ openerp/osv/orm.py | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 7403c884410..2036f41be43 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -8,6 +8,7 @@ class test_base(common.TransactionCase): def setUp(self): super(test_base,self).setUp() self.res_partner = self.registry('res.partner') + self.res_users = self.registry('res.users') # samples use effective TLDs from the Mozilla public suffix # list at http://publicsuffix.org @@ -282,6 +283,22 @@ class test_base(common.TransactionCase): p0.refresh() self.assertEquals(p0.vat, sunhelmvat2, 'Commercial fields must be automatically synced') + def test_60_read_group(self): + cr, uid = self.cr, self.uid + company_id = self.registry("ir.model.data").get_object_reference(cr, uid, "base", "main_company")[1] + for user_data in [ + {'name': 'Alice', 'login': 'alice', 'color': 1, 'function': 'Friend'}, + {'name': 'Bob', 'login': 'bob', 'color': 2, 'function': 'Friend'}, + {'name': 'Eve', 'login': 'eve', 'color': 3, 'function': 'Eavesdropper'}, + ]: + self.res_users.create(cr, uid, user_data) + + groups_data = self.res_users.read_group(cr, uid, domain=[('login', 'in', ('alice', 'bob', 'eve'))], fields=['name', 'color', 'function'], groupby='function') + self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field") + for group_data in groups_data: + self.assertIn('color', group_data, "Aggregated data for the column 'color' is not present in read_group return values") + self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color' not present in read_group return values") + class test_partner_recursion(common.TransactionCase): def setUp(self): diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index c8e7c92b1d8..7f8748aa05b 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -2675,7 +2675,7 @@ class BaseModel(object): group_operator = fget[f].get('group_operator', 'sum') if flist: flist += ', ' - qualified_field = self._inherits_join_calc(groupby, query) + qualified_field = self._inherits_join_calc(f, query) flist += "%s(%s) AS %s" % (group_operator, qualified_field, f) gb = groupby and (' GROUP BY ' + qualified_groupby_field) or '' From 5f10bec1a0a5f3b6fb49e297b603fa9116c9c099 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 3 Feb 2014 14:40:51 +0100 Subject: [PATCH 3/3] [IMP] better assert message and cleaning bzr revid: mat@openerp.com-20140203134051-lgwo4v0rdntgxyor --- openerp/addons/base/tests/test_base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 2036f41be43..5001293867b 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -285,7 +285,6 @@ class test_base(common.TransactionCase): def test_60_read_group(self): cr, uid = self.cr, self.uid - company_id = self.registry("ir.model.data").get_object_reference(cr, uid, "base", "main_company")[1] for user_data in [ {'name': 'Alice', 'login': 'alice', 'color': 1, 'function': 'Friend'}, {'name': 'Bob', 'login': 'bob', 'color': 2, 'function': 'Friend'}, @@ -297,7 +296,7 @@ class test_base(common.TransactionCase): self.assertEqual(len(groups_data), 2, "Incorrect number of results when grouping on a field") for group_data in groups_data: self.assertIn('color', group_data, "Aggregated data for the column 'color' is not present in read_group return values") - self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color' not present in read_group return values") + self.assertEqual(group_data['color'], 3, "Incorrect sum for aggregated data for the column 'color'") class test_partner_recursion(common.TransactionCase):