From e1104ac344cbc349a46b22339b13dfe9cbab8bcb Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 10 Oct 2017 18:31:39 +0200 Subject: [PATCH] [FIX] core: revert cb1cfadda23cc1e1d73f4ef854ec82c294febd09 Due to Cache reimplementation, this commit can't be applied as-it in version 11.0 and need to be adapted correctly. Undo PR #19963 --- odoo/fields.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/odoo/fields.py b/odoo/fields.py index bef9ba4302a..f04c4139b6f 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -39,23 +39,18 @@ Default = object() # default value for __init__() methods def copy_cache(records, env): """ Recursively copy the cache of ``records`` to the environment ``env``. """ - src = records.env - todo = defaultdict(set) # {model_name: ids} - done = defaultdict(set) # {model_name: ids} - todo[records._name].update(records._ids) + src, dst = records.env.cache, env.cache + todo, done = set(records), set() while todo: - model_name = next(iter(todo)) - record_ids = todo.pop(model_name) - done[model_name] - done[model_name].update(record_ids) - for name, field in src[model_name]._fields.items(): - src_cache = src.cache[field] - dst_cache = env.cache[field] - for record_id in record_ids: - if record_id in src_cache: - # copy the cached value as such - value = dst_cache[record_id] = src_cache[record_id] - if field.relational and isinstance(value, tuple): - todo[field.comodel_name].update(value) + record = todo.pop() + if record not in done: + done.add(record) + target = record.with_env(env) + for field in src.get_fields(record): + value = src.get(record, field) + dst.set(target, field, value) + if value and field.type in ('many2one', 'one2many', 'many2many', 'reference'): + todo.update(field.convert_to_record(value, record)) def resolve_mro(model, name, predicate):