[FIX] orm.unlink(): properly remove ir.values entries upon deletion

bzr revid: odo@openerp.com-20110322163007-sb1h5h7egp14nrwd
This commit is contained in:
Olivier Dony 2011-03-22 17:30:07 +01:00
parent 63ace375f0
commit 969d390126
1 changed files with 9 additions and 6 deletions

View File

@ -3232,18 +3232,21 @@ class orm(orm_template):
for sub_ids in cr.split_for_in_conditions(ids):
cr.execute('delete from ' + self._table + ' ' \
'where id IN %s', (sub_ids,))
# Removing the ir_model_data reference if the record being deleted is a record created by xml/csv file.
# Removing the ir_model_data reference if the record being deleted is a record created by xml/csv file,
# as these are not connected with real database foreign keys, and would be dangling references.
# Step 1. Calling unlink of ir_model_data only for the affected IDS.
referenced_ids = pool_model_data.search(cr, uid, [('res_id','in',list(sub_ids)),('model','=',self._name)], context=context)
# Step 2. Marching towards the real deletion of referenced records
pool_model_data.unlink(cr, uid, referenced_ids, context=context)
# For the same reason, removing the record relevant to ir_values
ir_value_ids = pool_ir_values.search(cr, uid, [('res_id','in',list(sub_ids)),('model','=',self._name)], context=context)
ir_value_ids = pool_ir_values.search(cr, uid,
[('value','in',['%s,%s' % (self._name, sid) for sid in sub_ids])],
context=context)
if ir_value_ids:
pool_ir_values.unlink(cr, uid, ir_value_ids, context=context)
for order, object, store_ids, fields in result_store:
if object != self._name:
obj = self.pool.get(object)
@ -3251,7 +3254,7 @@ class orm(orm_template):
rids = map(lambda x: x[0], cr.fetchall())
if rids:
obj._store_set_values(cr, uid, rids, fields, context)
return True
#