diff --git a/Gemfile b/Gemfile index c779d12bc..c5dc609a7 100644 --- a/Gemfile +++ b/Gemfile @@ -56,6 +56,7 @@ gem 'nokogiri' # HTML/XML parser gem 'sneaky-save', git: 'git://github.com/einzige/sneaky-save.git' gem 'rails_autolink', '~> 1.1', '>= 1.1.6' gem 'delayed_paperclip' +gem 'rubyzip' gem 'paperclip', '~> 4.3' # File attachment, image attachment library gem 'aws-sdk', '~> 2.2.8' diff --git a/app/controllers/protocols_controller.rb b/app/controllers/protocols_controller.rb index 625da49a7..4d70fd057 100644 --- a/app/controllers/protocols_controller.rb +++ b/app/controllers/protocols_controller.rb @@ -560,13 +560,38 @@ class ProtocolsController < ApplicationController end def export + #respond_to do |format| + # format.json { + # render json: { + # protocols: export_protocols(@protocols) + # }, status: :ok + # } + #end + + # Make a zip output stream and send it to the client respond_to do |format| - format.json { - render json: { - protocols: export_protocols(@protocols) - }, status: :ok - } + format.html + format.zip do + Dir.mktmpdir do |tmp_dir| + + + end + + z_output_stream = Zip::OutputStream.write_buffer do |ostream| + ostream.put_next_entry('eln.xml') + ostream.print(protocol_xml) + ostream.put_next_entry("#{arch_dir}/scinote.xml") + ostream.print(envelope_xml) + ostream.put_next_entry("#{arch_dir}/scinote.xsd") + ostream.print(generate_envelope_xsd) + ostream.put_next_entry("#{arch_dir}/eln.xsd") + ostream.print(generate_eln_xsd) + end + z_output_stream.rewind + send_data compressed_filestream.read, filename: "protocol.eln" + end end + end def unlink_modal diff --git a/app/utilities/protocols_exporter.rb b/app/utilities/protocols_exporter.rb index ae0edc872..d3ef68e65 100644 --- a/app/utilities/protocols_exporter.rb +++ b/app/utilities/protocols_exporter.rb @@ -1,4 +1,5 @@ require 'tmpdir' +require 'zip' module ProtocolsExporter def export_protocols(protocols) @@ -117,7 +118,7 @@ module ProtocolsExporter # individual protocol, save it to protocol folder output_file = File.open("#{protocol_dir}/eln.xml", 'w') output_file.write(protocol_xml) - + output_file.close # Add protocol to the envelope envelope_xml << "#{protocol.name}\n" end @@ -126,7 +127,23 @@ module ProtocolsExporter # Save envelope to root directory in archive output_file = File.open("#{arch_dir}/scinote.xml", 'w') output_file.write(envelope_xml) + output_file.close + output_file = File.open("#{arch_dir}/scinote.xsd", 'w') + output_file.write(generate_envelope_xsd) + output_file.close + output_file = File.open("#{arch_dir}/eln.xsd", 'w') + output_file.write(generate_eln_xsd) + output_file.close puts `ls -la #{arch_dir}` + + # Now make zip output stream and send it to the client + zip_name = "#{tmp_dir}/protocol.eln" + Zip::File.open(zip_name, Zip::File::CREATE) do |zipfile| + zipfile.add("eln.xsd", "#{arch_dir}/eln.xsd") + zipfile.add("eln.xsd", "#{arch_dir}/scinote.xml") + zipfile.add("eln.xsd", "#{arch_dir}/scinote.xsd") + end + end end @@ -143,6 +160,138 @@ module ProtocolsExporter str1 + str2n end + def generate_envelope_xsd + envelope_xsd = "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd << "\n" + envelope_xsd + end + + def generate_eln_xsd + eln_xsd = "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << "\n" + eln_xsd << '' + end + def export_protocol(protocol) protocol_json = protocol.as_json(only: [ :id,