Add ondelete_{target,origin} on Many2Many

Rename id{1,2} into target, origin
This commit is contained in:
Cédric Krier committed 2008-09-19 19:36:45 +02:00
1 parent b1b8771fa1
commit 8b8b033afd
3 files changed
+39 -33

No files matched your search

+27 -24
View File
@@ -52,7 +52,7 @@ class Column(object):
def __init__(self, string='unknown', required=False, readonly=False,
domain=None, context='', states=None, priority=0,
change_default=False, size=None, ondelete="set null",
change_default=False, size=None, ondelete="SET NULL",
translate=False, select=0, on_change=None, on_change_with=None,
**args):
self.states = states or {}
@@ -447,13 +447,16 @@ class Many2Many(Column):
_classic_write = False
_type = 'many2many'
def __init__(self, obj, rel, id1, id2, string='unknown', limit=None,
order=None, **args):
def __init__(self, obj, rel, origin, target, string='unknown', limit=None,
order=None, ondelete_origin='CASCADE', ondelete_target='RESTRICT',
**args):
Column.__init__(self, string=string, **args)
self._obj = obj
self._rel = rel
self._id1 = id1
self._id2 = id2
self.origin = origin
self.ondelete_origin = ondelete_origin
self.target = target
self.ondelete_target = ondelete_target
self._limit = limit
self._order = order
@@ -476,12 +479,12 @@ class Many2Many(Column):
domain1 = ' and '+domain1
#TODO fix order: can have many fields
cursor.execute('SELECT ' + self._rel + '.' + self._id2 + ', ' + \
self._rel + '.' + self._id1 + ' ' \
cursor.execute('SELECT ' + self._rel + '.' + self.target + ', ' + \
self._rel + '.' + self.origin + ' ' \
'FROM "' + self._rel + '" , "' + obj._table + '" ' \
'WHERE ' + \
self._rel + '.' + self._id1 + ' IN (' + ids_s + ') ' \
'AND ' + self._rel + '.' + self._id2 + ' = ' + \
self._rel + '.' + self.origin + ' IN (' + ids_s + ') ' \
'AND ' + self._rel + '.' + self.target + ' = ' + \
obj._table + '.id ' + domain1 + \
limit_str + ' ORDER BY ' + \
','.join([obj._table + '.' + x[0] + ' ' + x[1] \
@@ -499,7 +502,7 @@ class Many2Many(Column):
if act[0] == 'create':
idnew = obj.create(cursor, user, act[1], context=context)
cursor.execute('INSERT INTO "' + self._rel + '" ' \
'(' + self._id1 + ', ' + self._id2 + ') ' \
'(' + self.origin + ', ' + self.target + ') ' \
'VALUES (%s, %s)', (obj_id, idnew))
elif act[0] == 'write':
obj.write(cursor, user, act[1] , act[2], context=context)
@@ -513,8 +516,8 @@ class Many2Many(Column):
if not ids:
continue
cursor.execute('DELETE FROM "' + self._rel + '" ' \
'WHERE "' + self._id1 + '" = %s ' \
'AND "'+ self._id2 + '" IN (' \
'WHERE "' + self.origin + '" = %s ' \
'AND "'+ self.target + '" IN (' \
+ ','.join(['%s' for x in ids]) + ')',
[obj_id] + ids)
elif act[0] == 'add':
@@ -522,10 +525,10 @@ class Many2Many(Column):
ids = [act[1]]
else:
ids = list(act[1])
cursor.execute('SELECT "' + self._id2 + '" ' \
cursor.execute('SELECT "' + self.target + '" ' \
'FROM "' + self._rel + '" ' \
'WHERE ' + self._id1 + ' = %s ' \
'AND ' + self._id2 + ' IN (' + \
'WHERE ' + self.origin + ' = %s ' \
'AND ' + self.target + ' IN (' + \
','.join(['%s' for x in ids]) + ')',
[obj_id] + ids)
existing_ids = []
@@ -534,12 +537,12 @@ class Many2Many(Column):
new_ids = [x for x in ids if x not in existing_ids]
for new_id in new_ids:
cursor.execute('INSERT INTO "' + self._rel + '" ' \
'("' + self._id1 + '", "' + self._id2 + '") ' \
'("' + self.origin + '", "' + self.target + '") ' \
'VALUES (%s, %s)', (obj_id, new_id))
elif act[0] == 'unlink_all':
cursor.execute('UPDATE "' + self._rel + '" ' \
'SET "' + self._id2 + '" = NULL ' \
'WHERE "' + self._id2 + '" = %s', (obj_id,))
'SET "' + self.target + '" = NULL ' \
'WHERE "' + self.target + '" = %s', (obj_id,))
elif act[0] == 'set':
if not act[1]:
ids = []
@@ -550,18 +553,18 @@ class Many2Many(Column):
if domain1:
domain1 = ' AND ' + domain1
cursor.execute('DELETE FROM "' + self._rel + '" ' \
'WHERE "' + self._id1 + '" = %s ' \
'AND "' + self._id2 + '" IN (' \
'SELECT ' + self._rel + '.' + self._id2 + ' ' \
'WHERE "' + self.origin + '" = %s ' \
'AND "' + self.target + '" IN (' \
'SELECT ' + self._rel + '.' + self.target + ' ' \
'FROM "' + self._rel + '", "' + obj._table + '" ' \
'WHERE ' + self._rel + '.' + self._id1 + ' = %s ' \
'AND ' + self._rel + '.' + self._id2 + ' = ' + \
'WHERE ' + self._rel + '.' + self.origin + ' = %s ' \
'AND ' + self._rel + '.' + self.target + ' = ' + \
obj._table + '.id ' + domain1 + ')',
[obj_id, obj_id] + domain2)
for new_id in ids:
cursor.execute('INSERT INTO "' + self._rel + '" ' \
'("' + self._id1 + '", "' + self._id2 + '") ' \
'("' + self.origin + '", "' + self.target + '") ' \
'VALUES (%s, %s)', (obj_id, new_id))
else:
raise Exception('Bad arguments')
+8 -6
View File
@@ -537,7 +537,9 @@ class ORM(object):
ref = field._obj.replace('.','_')
else:
ref = self.pool.get(field._obj)._table
table.add_m2m(field_name, ref, field._rel, field._id1, field._id2)
table.add_m2m(field_name, ref, field._rel, field.origin,
field.target, field.ondelete_origin,
field.ondelete_target)
elif not isinstance(field, (fields.One2Many, fields.Function)):
raise Exception('Unknow field type !')
@@ -2427,9 +2429,9 @@ class ORM(object):
ids2 = self.pool.get(field._obj).search(cursor, user,
[(args[i][3], 'child_of', ids2)],
context=context)
query1 = 'SELECT "' + field._id1 + '" ' \
query1 = 'SELECT "' + field.origin + '" ' \
'FROM "' + field._rel + '" ' \
'WHERE "' + field._id2 + '" IN (' + \
'WHERE "' + field.target + '" IN (' + \
','.join(['%s' for x in ids2]) + ')'
query2 = [str(x) for x in ids2]
args[i] = ('id', 'inselect', (query1, query2))
@@ -2444,7 +2446,7 @@ class ORM(object):
else:
res_ids = args[i][2]
if res_ids == True or res_ids == False:
query1 = 'SELECT "' + field._id1 + '" ' \
query1 = 'SELECT "' + field.origin + '" ' \
'FROM "' + field._rel + '"'
query2 = []
clause = 'inselect'
@@ -2454,9 +2456,9 @@ class ORM(object):
elif not res_ids:
args[i] = ('id', '=', '0')
else:
query1 = 'SELECT "' + field._id1 + '" ' \
query1 = 'SELECT "' + field.origin + '" ' \
'FROM "' + field._rel + '" ' \
'WHERE "' + field._id2 + '" IN (' + \
'WHERE "' + field.target + '" IN (' + \
','.join(['%s' for x in res_ids]) + ')'
query2 = [str(x) for x in res_ids]
args[i] = ('id', 'inselect', (query1, query2))
+4 -3
View File
@@ -388,7 +388,8 @@ class table_handler:
self.update_definitions()
def add_m2m(self, column_name, other_table, relation_table, rtable_from, rtable_to):
def add_m2m(self, column_name, other_table, relation_table, rtable_from, rtable_to,
on_delete_from, on_delete_to):
if not table_exist(self.cursor, other_table):
raise Exception("table %s not found"%other_table)
rtable = table_handler(
@@ -397,8 +398,8 @@ class table_handler:
from osv.fields import Integer
rtable.add_raw_column(rtable_from, ('int4', 'int4'), Integer._symbol_set)
rtable.add_raw_column(rtable_to, ('int4', 'int4'), Integer._symbol_set)
rtable.add_fk(rtable_from, self.table_name)
rtable.add_fk(rtable_to, other_table)
rtable.add_fk(rtable_from, self.table_name, on_delete=on_delete_from)
rtable.add_fk(rtable_to, other_table, on_delete=on_delete_to)
rtable.not_null_action(rtable_from)
rtable.not_null_action(rtable_to)
rtable.index_action(rtable_from, 'add')