[FIX] ir_model: fix error when deleting internal references to deleted objects (ir_values, ir_model_data)

bzr revid: christophe@tinyerp.com-20090305121634-mylp56kdkigoohwu
This commit is contained in:
Christophe Simonis 2009-03-05 13:16:34 +01:00
parent 0f2f4d073b
commit 554b0fd269
1 changed files with 14 additions and 10 deletions

View File

@ -437,14 +437,16 @@ class ir_model_data(osv.osv):
if (not xml_id) and (not self.doinit): if (not xml_id) and (not self.doinit):
return False return False
action_id = False action_id = False
if xml_id: if xml_id:
cr.execute('select id,res_id from ir_model_data where module=%s and name=%s', (module,xml_id)) cr.execute('select id,res_id from ir_model_data where module=%s and name=%s', (module,xml_id))
results = cr.fetchall() results = cr.fetchall()
for action_id2,res_id2 in results: for action_id2,res_id2 in results:
cr.execute('select id from '+self.pool.get(model)._table+' where id=%s', (res_id2,)) cr.execute('select id from '+model_obj._table+' where id=%s', (res_id2,))
result3 = cr.fetchone() result3 = cr.fetchone()
if not result3: if not result3:
cr.execute('delete from ir_model_data where id=%s', (action_id2,)) cr.execute('delete from ir_model_data where id=%s', (action_id2,))
res_id = False
else: else:
res_id,action_id = res_id2,action_id2 res_id,action_id = res_id2,action_id2
@ -512,7 +514,7 @@ class ir_model_data(osv.osv):
#self.pool.get(model).unlink(cr, uid, ids) #self.pool.get(model).unlink(cr, uid, ids)
for id in ids: for id in ids:
self.unlink_mark[(model, id)]=False self.unlink_mark[(model, id)]=False
cr.execute('delete from ir_model_data where res_id=%s and model=\'%s\'', (id,model)) cr.execute('delete from ir_model_data where res_id=%s and model=%s', (id, model))
return True return True
def ir_set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None, xml_id=False): def ir_set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None, xml_id=False):
@ -563,18 +565,20 @@ class ir_model_data(osv.osv):
cr.commit() cr.commit()
if not config.get('import_partial', False): if not config.get('import_partial', False):
for (model,id) in self.unlink_mark.keys(): logger = netsvc.Logger()
for (model, res_id) in self.unlink_mark.keys():
if self.pool.get(model): if self.pool.get(model):
logger = netsvc.Logger() logger.notifyChannel('init', netsvc.LOG_INFO, 'Deleting %s@%s' % (res_id, model))
logger.notifyChannel('init', netsvc.LOG_INFO, 'Deleting %s@%s' % (id, model))
try: try:
self.pool.get(model).unlink(cr, uid, [id]) self.pool.get(model).unlink(cr, uid, [res_id])
if self.unlink_mark[(model,id)]: id = self.unlink_mark[(model, res_id)]
self.unlink(cr, uid, [self.unlink_mark[(model,id)]]) if id:
cr.execute('DELETE FROM ir_values WHERE value=%s', (model+','+str(id),)) self.unlink(cr, uid, [id])
cr.execute('DELETE FROM ir_values WHERE value=%s', ('%s,%s' % (model, res_id),))
cr.commit() cr.commit()
except: except:
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Could not delete id: %d of model %s\tThere should be some relation that points to this resource\tYou should manually fix this and restart --update=module' % (id, model)) cr.rollback()
logger.notifyChannel('init', netsvc.LOG_ERROR, 'Could not delete id: %d of model %s\nThere should be some relation that points to this resource\nYou should manually fix this and restart --update=module' % (res_id, model))
return True return True
ir_model_data() ir_model_data()