diff options
| author | Raphael Collet <rco@odoo.com> | 2018-03-26 10:37:53 +0200 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2018-03-30 11:01:08 +0200 |
| commit | 31025540c49dc236fe33d329a5802660237ca521 (patch) | |
| tree | 3a8fe56ace643c0255e26aee9a199f3b811b6049 /odoo/addons/test_read_group | |
| parent | fce1a799fc688771d9247673bccccf186063297d (diff) | |
[IMP] models: user-specified field aggregator in `read_group`
The caller of `read_group` can now provide the aggregating function to use for
a given field:
# set aggregating operator for fields 'foo' and 'bar'
model.read_group(domain, ['foo:sum', 'bar:avg'], ...)
One can also aggregate the same field several times, by giving a specific
output name for each:
# aggregate 'foo' with both 'min' and 'max'
model.read_group(domain, ['foomin:min(foo)', 'foomax:max(foo)'], ...)
Diffstat (limited to 'odoo/addons/test_read_group')
| -rw-r--r-- | odoo/addons/test_read_group/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | odoo/addons/test_read_group/models.py | 11 | ||||
| -rw-r--r-- | odoo/addons/test_read_group/tests/test_group_operator.py | 84 |
3 files changed, 96 insertions, 0 deletions
diff --git a/odoo/addons/test_read_group/ir.model.access.csv b/odoo/addons/test_read_group/ir.model.access.csv index af7209767df..9dc2f6abec2 100644 --- a/odoo/addons/test_read_group/ir.model.access.csv +++ b/odoo/addons/test_read_group/ir.model.access.csv @@ -1,4 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" access_test_read_group_on_date,access_test_read_group_on_date,model_test_read_group_on_date,,1,0,0,0 access_test_read_group_aggregate_boolean,access_test_read_group_aggregate_boolean,model_test_read_group_aggregate_boolean,,1,0,0,0 +access_test_read_group_aggregate,access_test_read_group_aggregate,model_test_read_group_aggregate,,1,0,0,0 access_test_read_group_on_selection,access_test_read_group_on_selection,model_test_read_group_on_selection,,1,0,0,0 diff --git a/odoo/addons/test_read_group/models.py b/odoo/addons/test_read_group/models.py index db67a964013..97909a83495 100644 --- a/odoo/addons/test_read_group/models.py +++ b/odoo/addons/test_read_group/models.py @@ -8,6 +8,7 @@ class GroupOnDate(models.Model): date = fields.Date("Date") value = fields.Integer("Value") + class BooleanAggregate(models.Model): _name = 'test_read_group.aggregate.boolean' _order = 'key DESC' @@ -17,6 +18,16 @@ class BooleanAggregate(models.Model): bool_or = fields.Boolean(default=False, group_operator='bool_or') bool_array = fields.Boolean(default=False, group_operator='array_agg') + +class Aggregate(models.Model): + _name = 'test_read_group.aggregate' + _order = 'id' + + key = fields.Integer() + value = fields.Integer("Value") + partner_id = fields.Many2one('res.partner') + + class GroupOnSelection(models.Model): _name = 'test_read_group.on_selection' diff --git a/odoo/addons/test_read_group/tests/test_group_operator.py b/odoo/addons/test_read_group/tests/test_group_operator.py index 1d5e2e8a547..7340970bb10 100644 --- a/odoo/addons/test_read_group/tests/test_group_operator.py +++ b/odoo/addons/test_read_group/tests/test_group_operator.py @@ -196,3 +196,87 @@ class TestGroupBooleans(common.TransactionCase): '__domain': ['&', ('bool_and', '=', True), ('key', '=', 3)] } ], groups) + + +class TestAggregate(common.TransactionCase): + def setUp(self): + super(TestAggregate, self).setUp() + + self.foo = self.env['res.partner'].create({'name': 'Foo'}) + self.bar = self.env['res.partner'].create({'name': 'Bar'}) + + self.Model = self.env['test_read_group.aggregate'] + self.Model.create({'key': 1, 'value': 1, 'partner_id': False}) + self.Model.create({'key': 1, 'value': 2, 'partner_id': self.foo.id}) + self.Model.create({'key': 1, 'value': 3, 'partner_id': self.foo.id}) + self.Model.create({'key': 1, 'value': 4, 'partner_id': self.bar.id}) + + def test_agg_default(self): + """ test default aggregation on fields """ + fields = ['key', 'value', 'partner_id'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value': 10, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + + def test_agg_explicit(self): + """ test explicit aggregation on fields """ + fields = ['key', 'value:max', 'partner_id'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value': 4, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + fields = ['key', 'value', 'partner_id:array_agg'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value': 10, + 'partner_id': [None, self.foo.id, self.foo.id, self.bar.id], + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + fields = ['key', 'value', 'partner_id:count'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value': 10, + 'partner_id': 3, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + fields = ['key', 'value', 'partner_id:count_distinct'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value': 10, + 'partner_id': 2, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + + def test_agg_multi(self): + """ test multiple aggregation on fields """ + fields = ['key', 'value_min:min(value)', 'value_max:max(value)', 'partner_id'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'value_min': 1, + 'value_max': 4, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) + + fields = ['key', 'ids:array_agg(id)'] + groups = self.Model.read_group([], fields, ['key']) + self.assertEqual(groups, [{ + 'key': 1, + 'ids': self.Model.search([]).ids, + 'key_count': 4, + '__domain': [('key', '=', 1)], + }]) |
