diff --git a/openerp/api.py b/openerp/api.py index b377076cf55..62dd2e5f0f3 100644 --- a/openerp/api.py +++ b/openerp/api.py @@ -907,6 +907,13 @@ class Environment(object): finally: self.all.recompute = tmp + @property + def recompute_old(self): + return self.all.recompute_old + + def clear_recompute_old(self): + del self.all.recompute_old[:] + class Environments(object): """ A common object for all environments in a request. """ @@ -915,6 +922,7 @@ class Environments(object): self.todo = {} # recomputations {field: [records]} self.mode = False # flag for draft/onchange self.recompute = True + self.recompute_old = [] # list of old api compute fields to recompute def add(self, env): """ Add the environment `env`. """ diff --git a/openerp/models.py b/openerp/models.py index f584c72ada6..858993f94d4 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -3994,10 +3994,10 @@ class BaseModel(object): recs.invalidate_cache(['parent_left', 'parent_right']) result += self._store_get_values(cr, user, ids, vals.keys(), context) - result.sort() done = {} - for order, model_name, ids_to_update, fields_to_recompute in result: + recs.env.recompute_old.extend(result) + for order, model_name, ids_to_update, fields_to_recompute in sorted(recs.env.recompute_old): key = (model_name, tuple(fields_to_recompute)) done.setdefault(key, {}) # avoid to do several times the same computation @@ -4008,6 +4008,7 @@ class BaseModel(object): if id not in deleted_related[model_name]: todo.append(id) self.pool[model_name]._store_set_values(cr, user, todo, fields_to_recompute, context) + recs.env.clear_recompute_old() # recompute new-style fields if recs.env.recompute and context.get('recompute', True): @@ -4257,16 +4258,18 @@ class BaseModel(object): # check Python constraints recs._validate_fields(vals) - if recs.env.recompute and context.get('recompute', True): - result += self._store_get_values(cr, user, [id_new], + result += self._store_get_values(cr, user, [id_new], list(set(vals.keys() + self._inherits.values())), context) - result.sort() + recs.env.recompute_old.extend(result) + + if recs.env.recompute and context.get('recompute', True): done = [] - for order, model_name, ids, fields2 in result: + for order, model_name, ids, fields2 in sorted(recs.env.recompute_old): if not (model_name, ids, fields2) in done: self.pool[model_name]._store_set_values(cr, user, ids, fields2, context) done.append((model_name, ids, fields2)) + recs.env.clear_recompute_old() # recompute new-style fields recs.recompute()