From cb581bc14f9fdb10dbc8a58574f1a4760f435ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20M=C3=B6hn?= Date: Thu, 13 Oct 2016 17:13:33 +0900 Subject: [PATCH] [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. --- openerp/api.py | 10 ++++++++-- 1 file 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``. """