summaryrefslogtreecommitdiff
path: root/odoo/addons/test_read_group
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2018-03-26 10:37:53 +0200
committerRaphael Collet <rco@odoo.com>2018-03-30 11:01:08 +0200
commit31025540c49dc236fe33d329a5802660237ca521 (patch)
tree3a8fe56ace643c0255e26aee9a199f3b811b6049 /odoo/addons/test_read_group
parentfce1a799fc688771d9247673bccccf186063297d (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.csv1
-rw-r--r--odoo/addons/test_read_group/models.py11
-rw-r--r--odoo/addons/test_read_group/tests/test_group_operator.py84
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)],
+ }])