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:
parent
5516c6e7f5
commit
8657fec59e
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue