[FIX] res.partner.category: the relation table name was manually chosen, which breaks under _inherit, so we use the automatic one.

bzr revid: vmt@openerp.com-20120619151626-2xho611icmq7e1ky
This commit is contained in:
Vo Minh Thu 2012-06-19 17:16:26 +02:00
parent 877ec2d7a8
commit 575e234cd4
3 changed files with 14 additions and 10 deletions

View File

@ -836,7 +836,7 @@ class ir_model_data(osv.osv):
cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name)) cr.execute('UPDATE ir_values set value=%s WHERE model=%s and key=%s and name=%s'+where,(value, model, key, name))
return True return True
def _module_data_uninstall(self, cr, uid, ids, context=None): def _module_data_uninstall(self, cr, uid, modules_to_remove, context=None):
"""Deletes all the records referenced by the ir.model.data entries """Deletes all the records referenced by the ir.model.data entries
``ids`` along with their corresponding database backed (including ``ids`` along with their corresponding database backed (including
dropping tables, columns, FKs, etc, as long as there is no other dropping tables, columns, FKs, etc, as long as there is no other
@ -847,6 +847,8 @@ class ir_model_data(osv.osv):
This step is performed as part of the full uninstallation of a module. This step is performed as part of the full uninstallation of a module.
""" """
ids = self.search(cr, uid, [('module', 'in', modules_to_remove)])
if uid != 1 and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"): if uid != 1 and not self.pool.get('ir.model.access').check_groups(cr, uid, "base.group_system"):
raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module'))) raise except_orm(_('Permission Denied'), (_('Administrator access is required to uninstall a module')))
@ -888,7 +890,7 @@ class ir_model_data(osv.osv):
external_ids = self.search(cr, uid, [('model', '=', model),('res_id', '=', res_id)]) external_ids = self.search(cr, uid, [('model', '=', model),('res_id', '=', res_id)])
if (set(external_ids)-ids_set): if (set(external_ids)-ids_set):
# if other modules have defined this record, we must not delete it # if other modules have defined this record, we must not delete it
return continue
_logger.info('Deleting %s@%s', res_id, model) _logger.info('Deleting %s@%s', res_id, model)
try: try:
self.pool.get(model).unlink(cr, uid, [res_id], context=context) self.pool.get(model).unlink(cr, uid, [res_id], context=context)
@ -900,11 +902,18 @@ class ir_model_data(osv.osv):
if model not in ('ir.model','ir.model.fields')) if model not in ('ir.model','ir.model.fields'))
unlink_if_refcount((model, res_id) for model, res_id in to_unlink unlink_if_refcount((model, res_id) for model, res_id in to_unlink
if model == 'ir.model.fields') if model == 'ir.model.fields')
ir_model_relation = self.pool.get('ir.model.relation')
relation_ids = ir_model_relation.search(cr, uid, [('module', 'in', modules_to_remove)])
ir_model_relation._module_data_uninstall(cr, uid, relation_ids, context)
unlink_if_refcount((model, res_id) for model, res_id in to_unlink unlink_if_refcount((model, res_id) for model, res_id in to_unlink
if model == 'ir.model') if model == 'ir.model')
cr.commit() cr.commit()
self.unlink(cr, uid, ids, context)
def _process_end(self, cr, uid, modules): def _process_end(self, cr, uid, modules):
""" Clear records removed from updated module data. """ Clear records removed from updated module data.
This method is called at the end of the module loading process. This method is called at the end of the module loading process.

View File

@ -379,15 +379,10 @@ class module(osv.osv):
tables, columns, constraints, etc.""" tables, columns, constraints, etc."""
ir_model_data = self.pool.get('ir.model.data') ir_model_data = self.pool.get('ir.model.data')
ir_model_constraint = self.pool.get('ir.model.constraint') ir_model_constraint = self.pool.get('ir.model.constraint')
ir_model_relation = self.pool.get('ir.model.relation')
modules_to_remove = [m.name for m in self.browse(cr, uid, ids, context)] modules_to_remove = [m.name for m in self.browse(cr, uid, ids, context)]
constraint_ids = ir_model_constraint.search(cr, uid, [('module', 'in', modules_to_remove)]) constraint_ids = ir_model_constraint.search(cr, uid, [('module', 'in', modules_to_remove)])
ir_model_constraint._module_data_uninstall(cr, uid, constraint_ids, context) ir_model_constraint._module_data_uninstall(cr, uid, constraint_ids, context)
relation_ids = ir_model_relation.search(cr, uid, [('module', 'in', modules_to_remove)]) ir_model_data._module_data_uninstall(cr, uid, modules_to_remove, context)
ir_model_relation._module_data_uninstall(cr, uid, relation_ids, context)
data_ids = ir_model_data.search(cr, uid, [('module', 'in', modules_to_remove)])
ir_model_data._module_data_uninstall(cr, uid, data_ids, context)
ir_model_data.unlink(cr, uid, data_ids, context)
self.write(cr, uid, ids, {'state': 'uninstalled'}) self.write(cr, uid, ids, {'state': 'uninstalled'})
return True return True

View File

@ -87,7 +87,7 @@ class res_partner_category(osv.osv):
'active' : fields.boolean('Active', help="The active field allows you to hide the category without removing it."), 'active' : fields.boolean('Active', help="The active field allows you to hide the category without removing it."),
'parent_left' : fields.integer('Left parent', select=True), 'parent_left' : fields.integer('Left parent', select=True),
'parent_right' : fields.integer('Right parent', select=True), 'parent_right' : fields.integer('Right parent', select=True),
'partner_ids': fields.many2many('res.partner', 'res_partner_category_rel', 'category_id', 'partner_id', 'Partners'), 'partner_ids': fields.many2many('res.partner', id1='category_id', id2='partner_id', string='Partners'),
} }
_constraints = [ _constraints = [
(osv.osv._check_recursion, 'Error ! You can not create recursive categories.', ['parent_id']) (osv.osv._check_recursion, 'Error ! You can not create recursive categories.', ['parent_id'])
@ -142,7 +142,7 @@ class res_partner(osv.osv):
'website': fields.char('Website',size=64, help="Website of Partner or Company"), 'website': fields.char('Website',size=64, help="Website of Partner or Company"),
'comment': fields.text('Notes'), 'comment': fields.text('Notes'),
'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), # should be removed in version 7, but kept until then for backward compatibility 'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), # should be removed in version 7, but kept until then for backward compatibility
'category_id': fields.many2many('res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', 'Tags'), 'category_id': fields.many2many('res.partner.category', id1='partner_id', id2='category_id', string='Tags'),
'credit_limit': fields.float(string='Credit Limit'), 'credit_limit': fields.float(string='Credit Limit'),
'ean13': fields.char('EAN13', size=13), 'ean13': fields.char('EAN13', size=13),
'active': fields.boolean('Active'), 'active': fields.boolean('Active'),