diff --git a/app/services/model_exporters/experiment_exporter.rb b/app/services/model_exporters/experiment_exporter.rb index d3aa72059..69ca43a32 100644 --- a/app/services/model_exporters/experiment_exporter.rb +++ b/app/services/model_exporters/experiment_exporter.rb @@ -1,18 +1,40 @@ -require 'fileutils' +# frozen_string_literal: true module ModelExporters - class ExperimentExporter - def initialize(experiment) - @experiment = experiment + class ExperimentExporter < ModelExporter + def initialize(experiment_id) + @experiment = Experiment.find_by_id(experiment_id) raise StandardError, 'Can not load experiment' unless @experiment @assets_to_copy = [] end - def experiment() + def export_to_dir + @asset_counter = 0 + @experiment.transaction(isolation: :serializable) do + @dir_to_export = FileUtils.mkdir_p( + File.join("tmp/experiment_#{@experiment.id}" \ + "_export_#{Time.now.to_i}") + ).first + + # Writing JSON file with experiment structure + File.write( + File.join(@dir_to_export, 'experiment_export.json'), + experiment.to_json + ) + # Copying assets + copy_files(@assets_to_copy, :file, File.join(@dir_to_export, 'assets')) do + @asset_counter += 1 + end + puts "Exported assets: #{@asset_counter}" + puts 'Done!' + end + end + + def experiment return { experiment: @experiment, - my_modules: @experiment.my_modules.map { |m| my_module(m) }, + my_modules: @experiment.my_modules.map { |m| my_module(m) }, my_module_groups: @experiment.my_module_groups }, @assets_to_copy end @@ -60,6 +82,7 @@ module ModelExporters def table(table) return {} if table.nil? + table_json = table.as_json(except: %i(contents data_vector)) table_json['contents'] = Base64.encode64(table.contents) table_json['data_vector'] = Base64.encode64(table.data_vector) diff --git a/app/services/model_exporters/model_exporter.rb b/app/services/model_exporters/model_exporter.rb index 367493eae..3debf7527 100644 --- a/app/services/model_exporters/model_exporter.rb +++ b/app/services/model_exporters/model_exporter.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'fileutils' + module ModelExporters class ModelExporter def copy_files(assets, attachment_name, dir_name) diff --git a/app/services/model_exporters/team_exporter.rb b/app/services/model_exporters/team_exporter.rb index f99bb3f33..22ae064c6 100644 --- a/app/services/model_exporters/team_exporter.rb +++ b/app/services/model_exporters/team_exporter.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'fileutils' - module ModelExporters class TeamExporter < ModelExporter def initialize(team_id) @@ -93,7 +91,7 @@ module ModelExporters def project(project) experiments = project.experiments.map do |e| - experiment, assets = ExperimentExporter.new(e).experiment + experiment, assets = ExperimentExporter.new(e.id).experiment @assets_to_copy << assets experiment end diff --git a/lib/tasks/data.rake b/lib/tasks/data.rake index dbb553ed1..72fc94101 100644 --- a/lib/tasks/data.rake +++ b/lib/tasks/data.rake @@ -86,7 +86,7 @@ namespace :data do "Exporting team with ID:#{args[:team_id]} to directory in tmp" ) te = ModelExporters::TeamExporter.new(args[:team_id]) - te.export_to_dir if te + te&.export_to_dir end desc 'Import team from directory' @@ -104,6 +104,17 @@ namespace :data do ) team = Team.find_by_id(args[:team_id]) raise StandardError, 'Can not load team' unless team + UserDataDeletion.delete_team_data(team) if team end + + desc 'Export experiment to directory' + task :experiment_export, [:experiment_id] => [:environment] do |_, args| + Rails.logger.info( + "Exporting experiment with ID:#{args[:experiment_id]} to directory in tmp" + ) + ee = ModelExporters::ExperimentExporter.new(args[:experiment_id]) + ee&.export_to_dir + end + end