Merge lp:~openerp-dev/openobject-server/7.0-updatenoupdatenotest-chs into lp:openobject-server/7.0

Proposed by Christophe Simonis (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-server/7.0-updatenoupdatenotest-chs
Merge into: lp:openobject-server/7.0
Diff against target: 62 lines (+23/-13)
1 file modified
openerp/addons/base/ir/ir_model.py (+23/-13)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/7.0-updatenoupdatenotest-chs
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+164324@code.launchpad.net
To post a comment you must log in.

Unmerged revisions

4976. By Christophe Simonis (OpenERP)

[FIX] ir.model.data: _update_dummy() must also mark _inherits objects as loaded to avoid deletion when a record pass from noupdate=0 to noupdate=1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/addons/base/ir/ir_model.py'
2--- openerp/addons/base/ir/ir_model.py 2013-04-24 09:34:03 +0000
3+++ openerp/addons/base/ir/ir_model.py 2013-05-17 09:02:26 +0000
4@@ -3,7 +3,7 @@
5 ##############################################################################
6 #
7 # OpenERP, Open Source Business Applications
8-# Copyright (C) 2004-2012 OpenERP S.A. (<http://openerp.com>).
9+# Copyright (C) 2004-2013 OpenERP S.A. (<http://openerp.com>).
10 #
11 # This program is free software: you can redistribute it and/or modify
12 # it under the terms of the GNU Affero General Public License as
13@@ -879,15 +879,29 @@
14 raise ValueError('No record found for unique ID %s.%s. It may have been deleted.' % (module, xml_id))
15 return result
16
17- def _update_dummy(self,cr, uid, model, module, xml_id=False, store=True):
18+ def _mark_as_loaded(self, cr, uid, module, xml_id, model, res_id):
19 if not xml_id:
20 return False
21- try:
22- id = self.read(cr, uid, [self._get_id(cr, uid, module, xml_id)], ['res_id'])[0]['res_id']
23- self.loads[(module,xml_id)] = (model,id)
24- except:
25- id = False
26- return id
27+ if not res_id:
28+ try:
29+ res_id = self.read(cr, uid, [self._get_id(cr, uid, module, xml_id)], ['res_id'])[0]['res_id']
30+ except Exception:
31+ return False
32+
33+ self.loads[(module, xml_id)] = (model, res_id)
34+ model_obj = self.pool[model]
35+
36+ f2t = dict((v, k) for k, v in model_obj._inherits.iteritems())
37+ if f2t:
38+ data = model_obj.read(cr, uid, res_id, f2t.keys())
39+ for field, table in f2t.iteritems():
40+ inherit_id = data[field]
41+ self.loads[(module, xml_id + '_' + table.replace('.', '_'))] = (table, inherit_id)
42+
43+ return res_id
44+
45+ def _update_dummy(self, cr, uid, model, module, xml_id=False, store=True):
46+ return self._mark_as_loaded(cr, uid, module, xml_id, model, res_id=False)
47
48 def clear_caches(self):
49 """ Clears all orm caches on the object's methods
50@@ -981,11 +995,7 @@
51 'noupdate': noupdate,
52 },context=context)
53 if xml_id and res_id:
54- self.loads[(module, xml_id)] = (model, res_id)
55- for table, inherit_field in model_obj._inherits.iteritems():
56- inherit_id = model_obj.read(cr, uid, res_id,
57- [inherit_field])[inherit_field]
58- self.loads[(module, xml_id + '_' + table.replace('.', '_'))] = (table, inherit_id)
59+ self._mark_as_loaded(cr, uid, module, xml_id, model, res_id)
60 return res_id
61
62 def ir_set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None, xml_id=False):