From 84d3c8a27979a5641e2f6cc22be0f6ab259bca54 Mon Sep 17 00:00:00 2001 From: Ivan Kljun Date: Thu, 21 Sep 2023 10:49:26 +0200 Subject: [PATCH] Fix team import/export to work with new result [SCI-9247] --- .../model_exporters/experiment_exporter.rb | 19 +++- app/services/team_importer.rb | 87 +++++++++++-------- 2 files changed, 67 insertions(+), 39 deletions(-) diff --git a/app/services/model_exporters/experiment_exporter.rb b/app/services/model_exporters/experiment_exporter.rb index 03a36e2f6..67167e78c 100644 --- a/app/services/model_exporters/experiment_exporter.rb +++ b/app/services/model_exporters/experiment_exporter.rb @@ -79,16 +79,27 @@ module ModelExporters end def result(result) - @assets_to_copy.push(result.asset) if result.asset.present? + @assets_to_copy.push(result.assets.to_a) if result.assets.present? { result: result, + result_orderable_elements: result.result_orderable_elements.map { |e| result_orderable_element(e) }, result_comments: result.result_comments, - asset: result_assets_data(result.asset), - table: table(result.table), - result_text: result.result_text + result_assets: result.result_assets, + assets: result.assets.map { |a| assets_data(a) } } end + def result_orderable_element(element) + element_json = element.as_json + case element.orderable_type + when 'ResultText' + element_json['step_text'] = element.orderable.as_json + when 'ResultTable' + element_json['table'] = table(element.orderable.table) + end + element_json + end + def result_assets_data(asset) return unless asset&.file&.attached? diff --git a/app/services/team_importer.rb b/app/services/team_importer.rb index b42f1657e..0f7ac59d9 100644 --- a/app/services/team_importer.rb +++ b/app/services/team_importer.rb @@ -245,9 +245,12 @@ class TeamImporter res.result_comments.each do |comment| comment.save! if update_annotation(comment.message) end - next unless res.result_text - res.save! if update_annotation(res.result_text.text) + res.result_orderable_elements.each do |element| + next unless element.orderable_type == 'ResultText' + + element.save! if update_annotation(element.orderable.text) + end end end end @@ -750,10 +753,18 @@ class TeamImporter def create_protocols(protocols_json, my_module = nil, team = nil, user_id = nil) + + sorted_protocols = protocols_json.sort_by { |p| p['id'] } + puts 'Creating protocols...' - protocols_json.each do |protocol_json| + sorted_protocols.each do |protocol_json| protocol = Protocol.new(protocol_json['protocol']) orig_protocol_id = protocol.id + protocol.last_modified_by_id = + user_id || find_user(protocol.last_modified_by_id) + protocol.published_by_id = + user_id || find_user(protocol.published_by_id) + if protocol.name protocol_name_unique = false original_name = protocol.name @@ -777,6 +788,7 @@ class TeamImporter end end end + protocol.id = nil protocol.added_by_id = find_user(protocol.added_by_id) protocol.added_by_id ||= my_module.present? ? my_module.created_by_id : team.created_by_id @@ -785,6 +797,7 @@ class TeamImporter protocol.restored_by_id = find_user(protocol.restored_by_id) protocol.my_module = my_module unless protocol.my_module_id.nil? protocol.skip_user_assignments = true + protocol.previous_version_id = @protocol_mappings[protocol.previous_version_id] if protocol.previous_version_id protocol.parent_id = @protocol_mappings[protocol.parent_id] unless protocol.parent_id.nil? protocol.save! @@ -879,38 +892,6 @@ class TeamImporter user_id || find_user(result.last_modified_by_id) result.archived_by_id = find_user(result.archived_by_id) result.restored_by_id = find_user(result.restored_by_id) - - if result_json['table'].present? - table = Table.new(result_json['table']) - orig_table_id = table.id - table.id = nil - table.created_by_id = user_id || find_user(table.created_by_id) - table.last_modified_by_id = - user_id || find_user(table.last_modified_by_id) - table.team = my_module.experiment.project.team - table.contents = Base64.decode64(table.contents) - table.data_vector = Base64.decode64(table.data_vector) - table.save! - @table_mappings[orig_table_id] = table.id - result.table = table - end - - if result_json['asset'].present? - asset = create_asset(result_json['asset'], - my_module.experiment.project.team, - user_id) - result.asset = asset - end - - if result_json['result_text'].present? - result_text = ResultText.new(result_json['result_text']) - orig_result_text_id = result_text.id - result_text.id = nil - result_text.result = result - result_text.save! - @result_text_mappings[orig_result_text_id] = result_text.id - end - result.save! @result_mappings[orig_result_id] = result.id @result_counter += 1 @@ -925,6 +906,42 @@ class TeamImporter result_comment.result = result result_comment.save! end + + result_json['result_orderable_elements'].each do |element_json| + if element_json['orderable_type'] == 'ResultText' + orderable = ResultText.new(element_json['result_text']) + orig_result_text_id = orderable.id + orderable.result_id = result.id + orderable.id = nil + orderable.save! + @result_text_mappings[orig_result_text_id] = orderable.id + elsif element_json['orderable_type'] == 'ResultTable' + table = Table.new(element_json['table']) + orig_table_id = table.id + table.id = nil + table.created_by_id = user_id || find_user(table.created_by_id) + table.last_modified_by_id = + user_id || find_user(table.last_modified_by_id) + table.team = my_module.experiment.project.team + table.contents = Base64.decode64(table.contents) + table.data_vector = Base64.decode64(table.data_vector) + table.save! + @table_mappings[orig_table_id] = table.id + orderable = ResultTable.create!(result: result, table: table) + end + ResultOrderableElement.create!( + position: element_json['position'], + result: result, + orderable: orderable + ) + end + + result_json['assets'].each do |asset_json| + asset = create_asset(asset_json, + my_module.experiment.project.team, + user_id) + ResultAsset.create!(result: result, asset: asset) + end end end