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
This commit is contained in:
ced 2007-12-31 13:31:38 +00:00
parent 5516c6e7f5
commit 8657fec59e
5 changed files with 39 additions and 8 deletions

View File

@ -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,

View File

@ -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),

View File

@ -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),

View File

@ -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'),

View File

@ -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: