From e388efd05941d50874c9f7ac1ca1226a4497e9f2 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Fri, 23 Aug 2019 09:08:42 +0000 Subject: [PATCH] [FIX] api: share `protected` among environments If a field is protected against recomputation, it must be protected in *all* environments. --- odoo/api.py | 3 ++- odoo/fields.py | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/odoo/api.py b/odoo/api.py index d0d33886454..41439486d35 100644 --- a/odoo/api.py +++ b/odoo/api.py @@ -452,7 +452,7 @@ class Environment(Mapping): self.cr, self.uid, self.context, self.su = self.args = args self.registry = Registry(cr.dbname) self.cache = envs.cache - self._protected = StackMap() # {field: ids, ...} + self._protected = envs.protected # proxy to shared data structure self.all = envs envs.add(self) return self @@ -668,6 +668,7 @@ class Environments(object): def __init__(self): self.envs = WeakSet() # weak set of environments self.cache = Cache() # cache for all records + self.protected = StackMap() # fields to protect {field: ids, ...} self.tocompute = defaultdict(set) # recomputations {field: ids} # updates {model: {id: {field: value}}} self.towrite = defaultdict(lambda: defaultdict(dict)) diff --git a/odoo/fields.py b/odoo/fields.py index a9cab8ae48a..183d2318e81 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -2569,9 +2569,6 @@ class _RelationalMulti(_Relational): cache.set(record, self, val) else: result = False - # DEEP FUCKING HACK TO FIX SOMEDAY: recs.env is different from - # records.env; we must trigger modifications in the original env - recs.env._protected = records.env._protected recs.modified([self.name]) return result