From bfb877a671561603a655ee53c1ea60f6f28dd659 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 18 Feb 2015 14:14:41 +0100 Subject: [PATCH] [FIX] ir.model.data: cleanup _process_end() Allow deletion of ir.model and ir.model.fields when updating modules Log xml id of deleted records Remove xml id of non-existing records --- openerp/addons/base/ir/ir_model.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index abd43777155..e00d80fe9a4 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -1230,20 +1230,25 @@ class ir_model_data(osv.osv): and a module in ir_model_data and noupdate set to false, but not present in self.loads. """ - if not modules: + if not modules or config.get('import_partial'): return True - to_unlink = [] + + bad_imd_ids = [] + context = {MODULE_UNINSTALL_FLAG: True} cr.execute("""SELECT id,name,model,res_id,module FROM ir_model_data - WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s ORDER BY id DESC""", - (tuple(modules), False)) + WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s ORDER BY id DESC + """, (tuple(modules), False)) for (id, name, model, res_id, module) in cr.fetchall(): - if (module,name) not in self.loads: - to_unlink.append((model,res_id)) - if not config.get('import_partial'): - for (model, res_id) in to_unlink: + if (module, name) not in self.loads: if model in self.pool: - _logger.info('Deleting %s@%s', res_id, model) - self.pool[model].unlink(cr, uid, [res_id]) + _logger.info('Deleting %s@%s (%s.%s)', res_id, model, module, name) + if self.pool[model].exists(cr, uid, [res_id], context=context): + self.pool[model].unlink(cr, uid, [res_id], context=context) + else: + bad_imd_ids.append(id) + if bad_imd_ids: + self.unlink(cr, uid, bad_imd_ids, context=context) + self.loads.clear() class wizard_model_menu(osv.osv_memory): _name = 'wizard.ir.model.menu.create'