Skip to content

Commit

Permalink
[IMP] merge_records: delete before update
Browse files Browse the repository at this point in the history
We want to delete the origin records before update to avoid constraints
like unique keys which would make the merge fail.
  • Loading branch information
chienandalu committed Feb 21, 2025
1 parent 03d0990 commit a892f26
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions openupgradelib/openupgrade_merge_records.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ def apply_operations_by_field_type(


def _adjust_merged_values_orm(
env, model_name, record_ids, target_record_id, field_spec
env, model_name, record_ids, target_record_id, field_spec, delete=True
):
"""This method deals with the values on the records to be merged +
the target record, performing operations that make sense on the meaning
Expand Down Expand Up @@ -650,6 +650,8 @@ def _adjust_merged_values_orm(
else:
if [x[1] for x in vals[f]] not in getattr(target_record, f).ids:
new_vals[f] = vals[f]
if delete:
_delete_records_orm(env, model_name, record_ids, target_record_id)
if new_vals:
target_record.write(new_vals)
logger.debug(
Expand All @@ -661,7 +663,7 @@ def _adjust_merged_values_orm(


def _adjust_merged_values_sql(
env, model_name, record_ids, target_record_id, model_table, field_spec
env, model_name, record_ids, target_record_id, model_table, field_spec, delete=True
):
"""This method deals with the values on the records to be merged +
the target record, performing operations that make sense on the meaning
Expand Down Expand Up @@ -746,6 +748,10 @@ def _adjust_merged_values_sql(
if vals[column] != record_vals[0]:
new_vals[column] = vals[column]
if new_vals:
if delete:
_delete_records_sql(
env, model_name, record_ids, target_record_id, model_table=model_table
)
ident_dict = {x: sql.Identifier(x) for x in new_vals.keys()}
query = sql.SQL(
"UPDATE {table} SET {set_value} WHERE {id} = %(target_record_id)s"
Expand Down Expand Up @@ -1053,16 +1059,14 @@ def merge_records(
_change_many2many_refs_orm(*args)
_change_reference_refs_orm(*args)
_change_translations_orm(*args)
args2 = args0 + (field_spec,)
args2 = args0 + (field_spec,) + (delete,)
# TODO: serialized fields
with env.norecompute():
_adjust_merged_values_orm(*args2)
if version_info[0] > 15:
env[model_name].flush_model()
else:
env[model_name].recompute()
if delete:
_delete_records_orm(env, model_name, record_ids, target_record_id)
else:
# Check which records to be merged exist
if not model_table:
Expand All @@ -1088,9 +1092,10 @@ def merge_records(
_change_reference_refs_sql(*args)
_change_translations_sql(*args)
if field_spec is not None:
args4 = args0 + (model_table,) + (field_spec,)
args4 = args0 + (model_table,) + (field_spec,) + (delete,)
_adjust_merged_values_sql(*args4)
if delete:
# Ensure that we delete the origin records
elif delete:
_delete_records_sql(
env, model_name, record_ids, target_record_id, model_table=model_table
)

0 comments on commit a892f26

Please sign in to comment.