summaryrefslogtreecommitdiff
path: root/odoo/fields.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-10-09 17:54:36 +0200
committerChristophe Simonis <chs@odoo.com>2017-10-09 17:54:36 +0200
commit446ff1baf82c5be1148d4bbdb3bdd960e427c353 (patch)
tree7e28b83489b81b73d4e84567a43b941d9bf421ac /odoo/fields.py
parent9241f7ea63f441b5e75a7f694896360ddf0a3278 (diff)
parentb60a41ce1404d4f527924345967e5ac2cc41dbe3 (diff)
[MERGE] forward port branch saas-15 up to b60a41ce140
Diffstat (limited to 'odoo/fields.py')
-rw-r--r--odoo/fields.py27
1 files changed, 16 insertions, 11 deletions
diff --git a/odoo/fields.py b/odoo/fields.py
index e7058891c49..6cb78ec26fb 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -56,18 +56,23 @@ def _check_value(value):
def copy_cache(records, env):
""" Recursively copy the cache of ``records`` to the environment ``env``. """
- todo, done = set(records), set()
+ src = records.env
+ todo = defaultdict(set) # {model_name: ids}
+ done = defaultdict(set) # {model_name: ids}
+ todo[records._name].update(records._ids)
while todo:
- record = todo.pop()
- if record not in done:
- done.add(record)
- target = record.with_env(env)
- for name in record._cache:
- field = record._fields[name]
- value = record[name]
- if isinstance(value, BaseModel):
- todo.update(value)
- target._cache[name] = field.convert_to_cache(value, target, validate=False)
+ 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)
def resolve_mro(model, name, predicate):