Experiment exporting works

This commit is contained in:
Jure Grabnar 2019-01-16 08:37:05 +01:00
parent 0184c97c61
commit 5b496a85d3
4 changed files with 44 additions and 10 deletions

View file

@ -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)

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
require 'fileutils'
module ModelExporters
class ModelExporter
def copy_files(assets, attachment_name, dir_name)

View file

@ -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

View file

@ -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