Skip to content

Commit

Permalink
Merge PR #204 into master
Browse files Browse the repository at this point in the history
Signed-off-by pedrobaeza
  • Loading branch information
OCA-git-bot committed Apr 25, 2020
2 parents 7e3a442 + 0dea859 commit 1028a8a
Showing 1 changed file with 41 additions and 32 deletions.
73 changes: 41 additions & 32 deletions openupgradelib/openupgrade_merge_records.py
Expand Up @@ -37,20 +37,21 @@ def _change_foreign_key_refs(env, model_name, record_ids, target_record_id,
if (table, column) in exclude_columns:
continue
# Try one big swoop first
env.cr.execute('SAVEPOINT sp1') # can't use env.cr.savepoint() in base
try:
with env.cr.savepoint():
logged_query(
env.cr, """UPDATE %(table)s
SET "%(column)s" = %(target_record_id)s
WHERE "%(column)s" in %(record_ids)s
""", {
'table': AsIs(table),
'column': AsIs(column),
'record_ids': record_ids,
'target_record_id': target_record_id,
}, skip_no_result=True,
)
logged_query(
env.cr, """UPDATE %(table)s
SET "%(column)s" = %(target_record_id)s
WHERE "%(column)s" in %(record_ids)s
""", {
'table': AsIs(table),
'column': AsIs(column),
'record_ids': record_ids,
'target_record_id': target_record_id,
}, skip_no_result=True,
)
except (ProgrammingError, IntegrityError) as error:
env.cr.execute('ROLLBACK TO SAVEPOINT sp1')
if error.pgcode != UNIQUE_VIOLATION:
raise
# Fallback on setting each row separately
Expand All @@ -65,22 +66,25 @@ def _change_foreign_key_refs(env, model_name, record_ids, target_record_id,
},
)
for row in list(set([x[0] for x in env.cr.fetchall()])):
env.cr.execute('SAVEPOINT sp2')
try:
with env.cr.savepoint():
logged_query(
env.cr, """UPDATE %(table)s
SET "%(column)s" = %(target_record_id)s
WHERE %(target_column)s = %(record_id)s""", {
'target_column': AsIs(target_column),
'table': AsIs(table),
'column': AsIs(column),
'record_id': row,
'target_record_id': target_record_id,
},
)
logged_query(
env.cr, """UPDATE %(table)s
SET "%(column)s" = %(target_record_id)s
WHERE %(target_column)s = %(record_id)s""", {
'target_column': AsIs(target_column),
'table': AsIs(table),
'column': AsIs(column),
'record_id': row,
'target_record_id': target_record_id,
},
)
except (ProgrammingError, IntegrityError) as error:
env.cr.execute('ROLLBACK TO SAVEPOINT sp2')
if error.pgcode != UNIQUE_VIOLATION:
raise
else:
env.cr.execute('RELEASE SAVEPOINT sp2')
if m2m_table:
# delete remaining values that could not be merged
logged_query(
Expand All @@ -92,6 +96,8 @@ def _change_foreign_key_refs(env, model_name, record_ids, target_record_id,
'record_ids': record_ids,
}, skip_no_result=True,
)
else:
env.cr.execute('RELEASE SAVEPOINT sp1')


def _change_many2one_refs_orm(env, model_name, record_ids, target_record_id,
Expand Down Expand Up @@ -465,19 +471,20 @@ def _change_generic(env, model_name, record_ids, target_record_id,
).format(**format_args), query_args, skip_no_result=True)


def _delete_records_sql(env, model_name, record_ids, target_record_id):
def _delete_records_sql(env, model_name, record_ids, target_record_id,
model_table=None):
if not model_table:
model_table = env[model_name]._table
logged_query(
env.cr, "DELETE FROM ir_model_data WHERE model = %s AND id IN %s",
(env[model_name]._table, tuple(record_ids)),
(model_name, tuple(record_ids)),
)
logged_query(
env.cr, "DELETE FROM ir_attachment WHERE res_model = %s AND id IN %s",
(env[model_name]._table, tuple(record_ids)),
)
logged_query(
env.cr, "DELETE FROM %s WHERE id IN %s",
(AsIs(env[model_name]._table), tuple(record_ids)),
(model_name, tuple(record_ids)),
)
logged_query(env.cr, sql.SQL("DELETE FROM {} WHERE id IN %s").format(
sql.Identifier(model_table)), (tuple(record_ids), ))


def _delete_records_orm(env, model_name, record_ids, target_record_id):
Expand Down Expand Up @@ -558,4 +565,6 @@ def merge_records(env, model_name, record_ids, target_record_id,
_change_translations_sql(*args)
# TODO: Adjust values of the merged records through SQL
if delete:
_delete_records_sql(env, model_name, record_ids, target_record_id)
_delete_records_sql(
env, model_name, record_ids, target_record_id,
model_table=model_table)

0 comments on commit 1028a8a

Please sign in to comment.