From f5f76094a79f515b1fcddfea9b4b2e73c4189c26 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 17 Sep 2014 13:32:30 +0200 Subject: [PATCH] [FIX] orm write: do not try to store computed & stored fields for relational records deleted by *2many fields opw-613772 --- openerp/osv/orm.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 07ed496000c..f934235d99d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -55,6 +55,7 @@ import simplejson import time import traceback import types +from collections import defaultdict import psycopg2 from lxml import etree @@ -4166,6 +4167,7 @@ class BaseModel(object): """ readonly = None self.check_field_access_rights(cr, user, 'write', vals.keys()) + deleted_related = defaultdict(list) for field in vals.copy(): fobj = None if field in self._columns: @@ -4174,6 +4176,10 @@ class BaseModel(object): fobj = self._inherit_fields[field][2] if not fobj: continue + if fobj._type in ['one2many', 'many2many'] and vals[field]: + for wtuple in vals[field]: + if isinstance(wtuple, (tuple, list)) and wtuple[0] == 2: + deleted_related[fobj._obj].append(wtuple[1]) groups = fobj.write if groups: @@ -4380,7 +4386,8 @@ class BaseModel(object): for id in ids_to_update: if id not in done[key]: done[key][id] = True - todo.append(id) + if id not in deleted_related[object]: + todo.append(id) self.pool.get(object)._store_set_values(cr, user, todo, fields_to_recompute, context) self._workflow_trigger(cr, user, ids, 'trg_write', context=context)