summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Möhn <richard.moehn@posteo.de>2016-10-13 17:13:33 +0900
committerRaphael Collet <rco@openerp.com>2016-10-13 10:13:33 +0200
commitcb581bc14f9fdb10dbc8a58574f1a4760f435ea8 (patch)
treeb90892fb91213c93d37787635ba3cf579e4aa343
parentd3609f7f19a5ec51d9add5add3c5d8befdd87173 (diff)
[FIX] api: in todo list, group records to recompute by environment (#11267)
The effect of this change is to trigger the recomputation of fields on larger recordsets. This takes advantage of batch computations within compute methods.
-rw-r--r--openerp/api.py10
1 files changed, 8 insertions, 2 deletions
diff --git a/openerp/api.py b/openerp/api.py
index 010299d2a6a..6406846f0aa 100644
--- a/openerp/api.py
+++ b/openerp/api.py
@@ -892,7 +892,8 @@ class Environment(object):
with all records to recompute for ``field``.
"""
if field in self.all.todo:
- return reduce(operator.or_, self.all.todo[field])
+ ids = set(rid for recs in self.all.todo[field] for rid in recs.ids)
+ return self[field.model_name].browse(ids)
def check_todo(self, field, record):
""" Check whether ``field`` must be recomputed on ``record``, and if so,
@@ -905,7 +906,12 @@ class Environment(object):
def add_todo(self, field, records):
""" Mark ``field`` to be recomputed on ``records``. """
recs_list = self.all.todo.setdefault(field, [])
- recs_list.append(records)
+ for i, recs in enumerate(recs_list):
+ if recs.env == records.env:
+ recs_list[i] |= records
+ break
+ else:
+ recs_list.append(records)
def remove_todo(self, field, records):
""" Mark ``field`` as recomputed on ``records``. """