From 8657fec59ecb56a9cc5aa6a926f6f6728f9bdbe8 Mon Sep 17 00:00:00 2001 From: ced <> Date: Mon, 31 Dec 2007 13:31:38 +0000 Subject: [PATCH] Fix ondelete on many2one Now change on the value of many2one are updated Fix difference in base module between sql definition and ORM object bzr revid: ced-8eb2888f04437d5e9edae98c9401d726f4122d47 --- bin/addons/base/base.sql | 4 ++-- bin/addons/base/ir/ir_model.py | 2 +- bin/addons/base/ir/workflow/workflow.py | 8 +++---- bin/addons/base/module/module.py | 2 +- bin/osv/orm.py | 31 +++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/bin/addons/base/base.sql b/bin/addons/base/base.sql index 6a2aa0aa5cb..958ea871031 100644 --- a/bin/addons/base/base.sql +++ b/bin/addons/base/base.sql @@ -53,7 +53,7 @@ CREATE TABLE ir_model_fields ( id serial, perm_id int references perm on delete set null, model varchar(64) DEFAULT ''::varchar NOT NULL, - model_id int references ir_model, + model_id int references ir_model on delete cascade, name varchar(64) DEFAULT ''::varchar NOT NULL, relation varchar(64), field_description varchar(256), @@ -260,7 +260,7 @@ create table wkf_transition create table wkf_instance ( id serial, - wkf_id int references wkf on delete set null, + wkf_id int references wkf on delete restrict, uid int default null, res_id int not null, res_type varchar(64) not null, diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 27b608ace22..f84a868f269 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -57,7 +57,7 @@ class ir_model_fields(osv.osv): # faire une jointure a chaque fois qu'on recherche vu que le client ne connait que le nom # de l'objet et pas son id 'relation': fields.char('Model Relation', size=64), - 'model_id': fields.many2one('ir.model', 'Model id', required=True, select=True), + 'model_id': fields.many2one('ir.model', 'Model id', required=True, select=True, ondelete='cascade'), # in fact, this is the field label 'field_description': fields.char('Field Description', size=256), 'ttype': fields.char('Field Type', size=64), diff --git a/bin/addons/base/ir/workflow/workflow.py b/bin/addons/base/ir/workflow/workflow.py index 80d3fca209c..f40093d0ede 100644 --- a/bin/addons/base/ir/workflow/workflow.py +++ b/bin/addons/base/ir/workflow/workflow.py @@ -65,7 +65,7 @@ class wkf_activity(osv.osv): _log_access = False _columns = { 'name': fields.char('Name', size=64, required=True), - 'wkf_id': fields.many2one('workflow', 'Workflow', required=True, select=True), + 'wkf_id': fields.many2one('workflow', 'Workflow', required=True, select=True, ondelete='cascade'), 'split_mode': fields.selection([('XOR', 'Xor'), ('OR','Or'), ('AND','And')], 'Split Mode', size=3, required=True), 'join_mode': fields.selection([('XOR', 'Xor'), ('AND', 'And')], 'Join Mode', size=3, required=True), 'kind': fields.selection([('dummy', 'Dummy'), ('function', 'Function'), ('subflow', 'Subflow'), ('stopall', 'Stop All')], 'Kind', size=64, required=True), @@ -95,8 +95,8 @@ class wkf_transition(osv.osv): 'signal': fields.char('Signal (button Name)', size=64), 'role_id': fields.many2one('res.roles', 'Role Required'), 'condition': fields.char('Condition', required=True, size=128), - 'act_from': fields.many2one('workflow.activity', 'Source Activity', required=True, select=True), - 'act_to': fields.many2one('workflow.activity', 'Destination Activity', required=True, select=True), + 'act_from': fields.many2one('workflow.activity', 'Source Activity', required=True, select=True, ondelete='cascade'), + 'act_to': fields.many2one('workflow.activity', 'Destination Activity', required=True, select=True, ondelete='cascade'), } _defaults = { 'condition': lambda *a: 'True', @@ -109,7 +109,7 @@ class wkf_instance(osv.osv): _rec_name = 'res_type' _log_access = False _columns = { - 'wkf_id': fields.many2one('workflow', 'Workflow', ondelete="cascade"), + 'wkf_id': fields.many2one('workflow', 'Workflow', ondelete='restrict'), 'uid': fields.integer('User ID'), 'res_id': fields.integer('Resource ID'), 'res_type': fields.char('Resource Model', size=64), diff --git a/bin/addons/base/module/module.py b/bin/addons/base/module/module.py index d7b27e9d8c7..027605401a4 100644 --- a/bin/addons/base/module/module.py +++ b/bin/addons/base/module/module.py @@ -544,7 +544,7 @@ class module_dependency(osv.osv): _columns = { 'name': fields.char('Name', size=128), - 'module_id': fields.many2one('ir.module.module', 'Module', select=True), + 'module_id': fields.many2one('ir.module.module', 'Module', select=True, ondelete='cascade'), 'state': fields.function(_state, method=True, type='selection', selection=[ ('uninstallable','Uninstallable'), ('uninstalled','Not Installed'), diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 6a0681edf42..6f826d7a7c5 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -465,6 +465,37 @@ class orm(object): if res and not f.select: cr.execute("DROP INDEX \"%s_%s_index\"" % (self._table, k)) cr.commit() + if isinstance(f, fields.many2one): + ref = self.pool.get(f._obj)._table + if ref != 'ir_actions': + cr.execute('SELECT confdeltype, conname FROM pg_constraint as con, pg_class as cl1, pg_class as cl2, ' \ + 'pg_attribute as att1, pg_attribute as att2 ' \ + 'WHERE con.conrelid = cl1.oid ' \ + 'AND cl1.relname = %s ' \ + 'AND con.confrelid = cl2.oid ' \ + 'AND cl2.relname = %s ' \ + 'AND array_lower(con.conkey, 1) = 1 ' \ + 'AND con.conkey[1] = att1.attnum ' \ + 'AND att1.attrelid = cl1.oid ' \ + 'AND att1.attname = %s ' \ + 'AND array_lower(con.confkey, 1) = 1 ' \ + 'AND con.confkey[1] = att2.attnum ' \ + 'AND att2.attrelid = cl2.oid ' \ + 'AND att2.attname = %s ' \ + 'AND con.contype = \'f\'', (self._table, ref, k, 'id')) + res = cr.dictfetchall() + if res: + confdeltype = { + 'RESTRICT': 'r', + 'NO ACTION': 'a', + 'CASCADE': 'c', + 'SET NULL': 'n', + 'SET DEFAULT': 'd', + } + if res[0]['confdeltype'] != confdeltype.get(f.ondelete.upper(), 'a'): + cr.execute('ALTER TABLE "' + self._table + '" DROP CONSTRAINT "' + res[0]['conname'] + '"') + cr.execute('ALTER TABLE "' + self._table + '" ADD FOREIGN KEY ("' + k + '") REFERENCES "' + ref + '" ON DELETE ' + f.ondelete) + cr.commit() else: print "ERROR" else: