mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-03-29 16:32:51 +08:00
Added xml schemas and zip gem [SCI-742]
This commit is contained in:
parent
69f31a62e7
commit
1abd7fc574
3 changed files with 181 additions and 6 deletions
1
Gemfile
1
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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 id=\"#{protocol.id}\" guid=\"#{protocol_guid}\">#{protocol.name}</protocol>\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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
envelope_xsd << "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n"
|
||||
envelope_xsd << "<xs:element name=\"envelope\">\n"
|
||||
envelope_xsd << "<xs:complexType>\n"
|
||||
envelope_xsd << "<xs:sequence>\n"
|
||||
envelope_xsd << "<xs:element name=\"protocol\" maxOccurs=\"unbounded\">\n"
|
||||
envelope_xsd << "<xs:complexType>\n"
|
||||
envelope_xsd << "<xs:simpleContent>\n"
|
||||
envelope_xsd << "<xs:extension base=\"xs:string\">\n"
|
||||
envelope_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
envelope_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
envelope_xsd << "</xs:extension>\n"
|
||||
envelope_xsd << "</xs:simpleContent>\n"
|
||||
envelope_xsd << "</xs:complexType>\n"
|
||||
envelope_xsd << "</xs:element>\n"
|
||||
envelope_xsd << "</xs:sequence>\n"
|
||||
envelope_xsd << "<xs:attribute name=\"xmlns\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
envelope_xsd << "<xs:attribute name=\"version\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
envelope_xsd << "</xs:complexType>\n"
|
||||
envelope_xsd << "</xs:element>\n"
|
||||
envelope_xsd << "</xs:schema>\n"
|
||||
envelope_xsd
|
||||
end
|
||||
|
||||
def generate_eln_xsd
|
||||
eln_xsd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
eln_xsd << "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n"
|
||||
eln_xsd << "<xs:element name=\"eln\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"protocol\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"authors\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"created_at\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"updated_at\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"steps\" minOccurs=\"0\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:sequence>\n"
|
||||
eln_xsd << "<xs:element name=\"step\" maxOccurs=\"unbounded\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"checklists\" minOccurs=\"0\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:sequence>\n"
|
||||
eln_xsd << "<xs:element name=\"checklist\" maxOccurs=\"unbounded\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"name\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"items\" minOccurs=\"0\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:sequence>\n"
|
||||
eln_xsd << "<xs:element name=\"item\" maxOccurs=\"unbounded\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"text\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"position\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:sequence>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:sequence>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"assets\" minOccurs=\"0\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:sequence>\n"
|
||||
eln_xsd << "<xs:element name=\"asset\" maxOccurs=\"unbounded\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"fileName\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"fileType\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"fileRef\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:sequence>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "<xs:element name=\"elnTables\" minOccurs=\"0\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:sequence>\n"
|
||||
eln_xsd << "<xs:element name=\"elnTable\" maxOccurs=\"unbounded\">\n"
|
||||
eln_xsd << "<xs:complexType>\n"
|
||||
eln_xsd << "<xs:all>\n"
|
||||
eln_xsd << "<xs:element name=\"contents\" type=\"xs:string\"></xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:sequence>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"position\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:sequence>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"id\" type=\"xs:int\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"guid\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << "</xs:all>\n"
|
||||
eln_xsd << "<xs:attribute name=\"xmlns\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "<xs:attribute name=\"version\" type=\"xs:string\" use=\"required\"></xs:attribute>\n"
|
||||
eln_xsd << "</xs:complexType>\n"
|
||||
eln_xsd << "</xs:element>\n"
|
||||
eln_xsd << '</xs:schema>'
|
||||
end
|
||||
|
||||
def export_protocol(protocol)
|
||||
protocol_json = protocol.as_json(only: [
|
||||
:id,
|
||||
|
|
Loading…
Add table
Reference in a new issue