2016-07-21 19:11:15 +08:00
class ProtocolsController < ApplicationController
include RenamingUtil
include ProtocolsImporter
include ProtocolsExporter
2017-01-04 22:04:12 +08:00
include InputSanitizeHelper
2016-07-21 19:11:15 +08:00
before_action :check_create_permissions , only : [
:create_new_modal ,
:create
]
before_action :check_clone_permissions , only : [ :clone ]
before_action :check_view_permissions , only : [
:protocol_status_bar ,
:updated_at_label ,
2016-12-13 17:39:18 +08:00
:preview ,
2016-07-21 19:11:15 +08:00
:linked_children ,
:linked_children_datatable
]
before_action :check_edit_permissions , only : [
:edit ,
:update_metadata ,
:update_keywords ,
:edit_name_modal ,
:edit_keywords_modal ,
:edit_authors_modal ,
:edit_description_modal
]
before_action :check_view_all_permissions , only : [
:index ,
:datatable
]
before_action :check_unlink_permissions , only : [
:unlink ,
:unlink_modal
]
before_action :check_revert_permissions , only : [
:revert ,
:revert_modal
]
before_action :check_update_parent_permissions , only : [
:update_parent ,
:update_parent_modal
]
before_action :check_update_from_parent_permissions , only : [
:update_from_parent ,
:update_from_parent_modal
]
before_action :check_load_from_repository_views_permissions , only : [
:load_from_repository_modal ,
:load_from_repository_datatable
]
before_action :check_load_from_repository_permissions , only : [
:load_from_repository
]
before_action :check_load_from_file_permissions , only : [
:load_from_file
]
before_action :check_copy_to_repository_permissions , only : [
:copy_to_repository ,
:copy_to_repository_modal
]
before_action :check_make_private_permissions , only : [ :make_private ]
before_action :check_publish_permissions , only : [ :publish ]
before_action :check_archive_permissions , only : [ :archive ]
before_action :check_restore_permissions , only : [ :restore ]
before_action :check_import_permissions , only : [ :import ]
before_action :check_export_permissions , only : [ :export ]
2017-09-20 21:31:10 +08:00
2016-07-21 19:11:15 +08:00
def index
end
def datatable
respond_to do | format |
format . json {
render json : :: ProtocolsDatatable . new (
view_context ,
2017-01-24 23:57:14 +08:00
@current_team ,
2016-07-21 19:11:15 +08:00
@type ,
current_user
)
}
end
end
2016-12-13 17:39:18 +08:00
def preview
respond_to do | format |
format . json do
render json : {
title : I18n . t ( 'protocols.index.preview.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-12-13 17:39:18 +08:00
html : render_to_string (
partial : 'protocols/index/protocol_preview_modal_body.html.erb' ,
locals : { protocol : @protocol }
2017-01-03 17:04:14 +08:00
) ,
footer : render_to_string (
partial : 'protocols/index/protocol_preview_modal_footer.html.erb' ,
locals : { protocol : @protocol }
2016-12-13 17:39:18 +08:00
)
}
end
end
end
2016-07-21 19:11:15 +08:00
def linked_children
respond_to do | format |
format . json {
render json : {
2017-01-04 22:04:12 +08:00
title : I18n . t ( 'protocols.index.linked_children.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-07-21 19:11:15 +08:00
html : render_to_string ( {
partial : " protocols/index/linked_children_modal_body.html.erb " ,
locals : { protocol : @protocol }
} )
}
}
end
end
def linked_children_datatable
respond_to do | format |
format . json {
render json : :: ProtocolLinkedChildrenDatatable . new (
view_context ,
@protocol ,
current_user ,
self
)
}
end
end
def make_private
move_protocol ( " make_private " )
end
def publish
move_protocol ( " publish " )
end
def archive
move_protocol ( " archive " )
end
def restore
move_protocol ( " restore " )
end
def edit
end
def update_metadata
@protocol . record_timestamps = false
@protocol . assign_attributes ( metadata_params )
respond_to do | format |
if @protocol . save
format . json {
render json : {
updated_at_label : render_to_string (
partial : " protocols/header/updated_at_label.html.erb "
) ,
name_label : render_to_string (
partial : " protocols/header/name_label.html.erb "
) ,
authors_label : render_to_string (
partial : " protocols/header/authors_label.html.erb "
) ,
description_label : render_to_string (
partial : " protocols/header/description_label.html.erb "
)
}
}
else
format . json {
render json : @protocol . errors ,
status : :unprocessable_entity
}
end
end
end
def update_keywords
respond_to do | format |
2016-12-29 22:15:29 +08:00
# sanitize user input
params [ :keywords ] . collect! do | keyword |
2017-01-11 22:50:11 +08:00
escape_input ( keyword )
2016-12-29 22:15:29 +08:00
end
2016-07-21 19:11:15 +08:00
if @protocol . update_keywords ( params [ :keywords ] )
format . json {
render json : {
updated_at_label : render_to_string (
partial : " protocols/header/updated_at_label.html.erb "
) ,
keywords_label : render_to_string (
partial : " protocols/header/keywords_label.html.erb "
)
}
}
else
format . json { render json : { } , status : :unprocessable_entity }
end
end
end
def create
@protocol = Protocol . new (
2017-01-24 23:57:14 +08:00
team : @current_team ,
2016-07-21 19:11:15 +08:00
protocol_type : Protocol . protocol_types [ @type == :public ? :in_repository_public : :in_repository_private ] ,
added_by : current_user
)
@protocol . assign_attributes ( create_params )
ts = Time . now
@protocol . record_timestamps = false
@protocol . created_at = ts
@protocol . updated_at = ts
if @type == :public
@protocol . published_on = ts
end
respond_to do | format |
if @protocol . save
format . json {
render json : {
url : edit_protocol_path (
@protocol ,
2017-01-24 23:57:14 +08:00
team : @current_team ,
2016-07-21 19:11:15 +08:00
type : @type
)
}
}
else
format . json {
render json : @protocol . errors ,
status : :unprocessable_entity
}
end
end
end
def clone
cloned = nil
Protocol . transaction do
begin
cloned = @original . deep_clone_repository ( current_user )
rescue Exception
raise ActiveRecord :: Rollback
end
end
respond_to do | format |
if cloned != nil
flash [ :success ] = t (
" protocols.index.clone.success_flash " ,
original : @original . name ,
new : cloned . name
)
flash . keep ( :success )
format . json { render json : { } , status : :ok }
else
flash [ :error ] = t (
" protocols.index.clone.error_flash " ,
original : @original . name
)
flash . keep ( :error )
format . json { render json : { } , status : :bad_request }
end
end
end
def copy_to_repository
link_protocols = can_link_copied_protocol_in_repository ( @protocol ) && params [ :link ]
respond_to do | format |
transaction_error = false
Protocol . transaction do
begin
@new = @protocol . copy_to_repository (
copy_to_repository_params [ :name ] ,
copy_to_repository_params [ :protocol_type ] ,
link_protocols ,
current_user
)
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
end
if transaction_error
# Bad request error
format . json {
render json : {
message : t ( " my_modules.protocols.copy_to_repository_modal.error_400 " )
} ,
status : :bad_request
}
elsif @new . invalid?
# Render errors
format . json {
render json : @new . errors ,
status : :unprocessable_entity
}
else
# Everything good, render 200
format . json { render json : { refresh : link_protocols } , status : :ok }
end
end
end
def unlink
respond_to do | format |
transaction_error = false
Protocol . transaction do
begin
@protocol . unlink
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
end
if transaction_error
# Bad request error
format . json {
render json : {
message : t ( " my_modules.protocols.unlink_error " )
} ,
status : :bad_request
}
else
# Everything good, display flash & render 200
flash [ :success ] = t (
" my_modules.protocols.unlink_flash " ,
)
flash . keep ( :success )
format . json { render json : { } , status : :ok }
end
end
end
def revert
respond_to do | format |
2016-10-06 22:13:35 +08:00
if @protocol . can_destroy?
transaction_error = false
Protocol . transaction do
begin
# Revert is basically update from parent
@protocol . update_from_parent ( current_user )
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
2016-07-21 19:11:15 +08:00
end
2016-10-06 22:13:35 +08:00
if transaction_error
# Bad request error
format . json do
render json : {
message : t ( 'my_modules.protocols.revert_error' )
} ,
status : :bad_request
end
else
# Everything good, display flash & render 200
flash [ :success ] = t (
'my_modules.protocols.revert_flash'
)
flash . keep ( :success )
format . json { render json : { } , status : :ok }
end
2016-07-21 19:11:15 +08:00
else
2016-10-06 22:13:35 +08:00
format . json do
render json : {
message : t ( 'my_modules.protocols.revert_error_locked' )
} , status : :bad_request
end
2016-07-21 19:11:15 +08:00
end
end
end
def update_parent
respond_to do | format |
2016-10-06 22:13:35 +08:00
if @protocol . parent . can_destroy?
transaction_error = false
Protocol . transaction do
begin
@protocol . update_parent ( current_user )
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
2016-07-21 19:11:15 +08:00
end
2016-10-06 22:13:35 +08:00
if transaction_error
# Bad request error
format . json {
render json : {
message : t ( " my_modules.protocols.update_parent_error " )
} ,
status : :bad_request
}
else
2017-01-03 23:35:25 +08:00
# Everything good, record activity, display flash & render 200
Activity . create (
type_of : :revert_protocol ,
project : @protocol . my_module . experiment . project ,
2017-04-20 16:56:25 +08:00
experiment : @protocol . my_module . experiment ,
2017-01-03 23:35:25 +08:00
my_module : @protocol . my_module ,
user : current_user ,
message : I18n . t (
'activities.revert_protocol' ,
user : current_user . full_name ,
protocol : @protocol . name
)
2016-11-02 16:18:06 +08:00
)
2016-10-06 22:13:35 +08:00
flash [ :success ] = t (
" my_modules.protocols.update_parent_flash " ,
)
flash . keep ( :success )
format . json { render json : { } , status : :ok }
end
2016-07-21 19:11:15 +08:00
else
2016-10-06 22:13:35 +08:00
format . json do
render json : {
message : t ( 'my_modules.protocols.update_parent_error_locked' )
} , status : :bad_request
end
2016-07-21 19:11:15 +08:00
end
end
end
def update_from_parent
respond_to do | format |
2016-10-06 22:13:35 +08:00
if @protocol . can_destroy?
transaction_error = false
Protocol . transaction do
begin
@protocol . update_from_parent ( current_user )
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
2016-07-21 19:11:15 +08:00
end
2016-10-06 22:13:35 +08:00
if transaction_error
# Bad request error
format . json {
render json : {
message : t ( " my_modules.protocols.update_from_parent_error " )
} ,
status : :bad_request
}
else
# Everything good, display flash & render 200
flash [ :success ] = t (
" my_modules.protocols.update_from_parent_flash " ,
)
flash . keep ( :success )
format . json { render json : { } , status : :ok }
end
2016-07-21 19:11:15 +08:00
else
2016-10-06 22:13:35 +08:00
format . json do
render json : {
message : t ( 'my_modules.protocols.update_from_parent_error_locked' )
} , status : :bad_request
end
2016-07-21 19:11:15 +08:00
end
end
end
def load_from_repository
2017-09-19 21:02:16 +08:00
2016-07-21 19:11:15 +08:00
respond_to do | format |
2016-10-06 22:13:35 +08:00
if @protocol . can_destroy?
transaction_error = false
Protocol . transaction do
begin
@protocol . load_from_repository ( @source , current_user )
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
2016-07-21 19:11:15 +08:00
end
2016-10-06 22:13:35 +08:00
if transaction_error
# Bad request error
2016-12-21 23:52:15 +08:00
format . json do
2016-10-06 22:13:35 +08:00
render json : {
2016-12-21 23:52:15 +08:00
message : t ( 'my_modules.protocols.load_from_repository_error' )
2016-10-06 22:13:35 +08:00
} ,
status : :bad_request
2016-12-21 23:52:15 +08:00
end
2016-10-06 22:13:35 +08:00
else
2017-01-03 23:35:25 +08:00
# Everything good, record activity, display flash & render 200
Activity . create (
type_of : :load_protocol_from_repository ,
project : @protocol . my_module . experiment . project ,
2017-04-20 16:56:25 +08:00
experiment : @protocol . my_module . experiment ,
2017-01-03 23:35:25 +08:00
my_module : @protocol . my_module ,
user : current_user ,
message : I18n . t (
'activities.load_protocol_from_repository' ,
user : current_user . full_name ,
protocol : @source . name
)
2016-11-02 16:18:06 +08:00
)
2016-12-21 23:52:15 +08:00
flash [ :success ] = t ( 'my_modules.protocols.load_from_repository_flash' )
2016-10-06 22:13:35 +08:00
flash . keep ( :success )
format . json { render json : { } , status : :ok }
end
2016-07-21 19:11:15 +08:00
else
2016-10-06 22:13:35 +08:00
format . json do
render json : {
message : t ( 'my_modules.protocols.load_from_repository_error_locked' )
} , status : :bad_request
end
2016-07-21 19:11:15 +08:00
end
end
end
def load_from_file
# This is actually very similar to import
2017-09-19 21:02:16 +08:00
2016-07-21 19:11:15 +08:00
respond_to do | format |
2016-10-06 22:13:35 +08:00
if @protocol . can_destroy?
transaction_error = false
Protocol . transaction do
begin
2017-03-22 23:24:48 +08:00
import_into_existing (
@protocol , @protocol_json , current_user , current_team
)
2016-10-06 22:13:35 +08:00
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
2016-07-21 19:11:15 +08:00
end
2016-10-06 22:13:35 +08:00
if transaction_error
format . json {
render json : { status : :error } , status : :bad_request
}
else
2017-01-03 23:35:25 +08:00
# Everything good, record activity, display flash & render 200
Activity . create (
type_of : :load_protocol_from_file ,
project : @protocol . my_module . experiment . project ,
2017-04-20 16:56:25 +08:00
experiment : @protocol . my_module . experiment ,
2017-01-03 23:35:25 +08:00
my_module : @protocol . my_module ,
user : current_user ,
message : I18n . t (
'activities.load_protocol_from_file' ,
user : current_user . full_name ,
protocol : @protocol_json [ :name ]
)
2016-11-02 16:18:06 +08:00
)
2016-10-06 22:13:35 +08:00
flash [ :success ] = t (
2017-01-03 23:35:25 +08:00
'my_modules.protocols.load_from_file_flash' ,
2016-10-06 22:13:35 +08:00
)
flash . keep ( :success )
format . json {
render json : { status : :ok } , status : :ok
}
end
2016-07-21 19:11:15 +08:00
else
2016-10-06 22:13:35 +08:00
format . json do
render json : { status : :locked } , status : :bad_request
end
2016-07-21 19:11:15 +08:00
end
end
end
2017-09-19 21:02:16 +08:00
def import #tega uporabi .eln import
2016-07-21 19:11:15 +08:00
protocol = nil
respond_to do | format |
transaction_error = false
Protocol . transaction do
begin
2017-01-24 23:57:14 +08:00
protocol = import_new_protocol ( @protocol_json , @team , @type , current_user )
2016-07-21 19:11:15 +08:00
rescue Exception
transaction_error = true
raise ActiveRecord :: Rollback
end
end
2017-01-11 22:50:11 +08:00
p_name =
if @protocol_json [ 'name' ] . present? && ! @protocol_json [ 'name' ] . empty?
escape_input ( @protocol_json [ 'name' ] )
else
t ( 'protocols.index.no_protocol_name' )
end
2016-07-21 19:11:15 +08:00
if transaction_error
format . json {
render json : { name : p_name , status : :bad_request } , status : :bad_request
}
else
format . json {
render json : {
name : p_name , new_name : protocol . name , status : :ok
} ,
status : :ok
}
end
end
end
2017-09-13 21:15:08 +08:00
#
#tule
def protocolsio_import_create
2017-09-15 21:52:55 +08:00
2017-09-13 21:15:08 +08:00
json_file_contents = File . read ( params [ :json_file ] . path )
2017-09-19 21:02:16 +08:00
json_file_contents . gsub! '\"' , " ' "
2017-09-20 14:58:00 +08:00
@json_object = JSON . parse ( json_file_contents )
2017-09-14 20:42:04 +08:00
@protocol = Protocol . new
2017-09-14 17:30:53 +08:00
respond_to do | format |
2017-09-20 14:58:00 +08:00
#format.html {}
2017-09-14 20:42:04 +08:00
format . js { }
2017-09-14 17:30:53 +08:00
end
2017-09-13 21:15:08 +08:00
end
2017-09-19 21:02:16 +08:00
2017-09-15 21:52:55 +08:00
def protocolsio_import_save
#@temp_json=JsonTemp.new
2017-09-20 14:58:00 +08:00
@json_object = JSON . parse ( params [ " json_object " ] )
2017-09-20 15:32:31 +08:00
@import_object = Hash . new
@import_object [ " name " ] = params [ " protocol " ] [ " name " ]
@import_object [ " description " ] = params [ " protocol " ] [ " description " ]
2017-09-20 21:31:10 +08:00
# will have to fit various things in here (guidelines, manuscript citations etc etc)
2017-09-20 15:32:31 +08:00
@import_object [ " authors " ] = params [ " protocol " ] [ " authors " ]
@import_object [ " created_at " ] = params [ " protocol " ] [ " created_at " ]
@import_object [ " updated_at " ] = params [ " protocol " ] [ " last_modified " ]
2017-09-20 21:31:10 +08:00
#@import_object["steps"]
@import_object [ " steps " ] = Hash . new
counter = 0
step_pos = - 1
#these whitelists are there to not let some useless step components true, that always have data set to null (data doesnt get imported over to json)
whitelist_simple = [ " 1 " , " 6 " , " 17 " ] #(simple to map) id 1= step description, id 6= section (title), id 17= expected result
whitelist_complex = [ " 8 " , " 9 " , " 15 " , " 18 " , " 19 " , " 20 " ] #(complex mapping with nested hashes) id 8 = software package, id 9 = dataset, id 15 = command, id 18 = attached sub protocol
# id 19= safety information ,id 20= regents (materials, like scinote samples kind of)
@json_object [ " steps " ] . each do | step |
#@import_object["steps"][step_pos.to_s]=step
step_pos += 1
counter += 1
@import_object [ " steps " ] [ step_pos . to_s ] = Hash . new
@import_object [ " steps " ] [ step_pos . to_s ] [ " position " ] = step_pos
2017-09-21 14:40:05 +08:00
2017-09-20 21:31:10 +08:00
step [ " components " ] . each do | key , value |
if counter > 1 #here i made an if to distinguish the first step from the others, because the first step
#sometimes has weird nesting that requires different handling
if whitelist_simple . include? ( key [ " component_type_id " ] )
case key [ " component_type_id " ]
when " 1 "
if ! key [ " data " ] . nil? && key [ " data " ] != " "
@import_object [ " steps " ] [ step_pos . to_s ] [ " description " ] = key [ " data " ]
else
@import_object [ " steps " ] [ step_pos . to_s ] [ " description " ] = " Description missing! "
end
when " 6 "
if ! key [ " data " ] . nil? && key [ " data " ] != " "
@import_object [ " steps " ] [ step_pos . to_s ] [ " name " ] = key [ " data " ]
else
@import_object [ " steps " ] [ step_pos . to_s ] [ " name " ] = " Protocols.io "
end
when " 17 "
else
end
2017-09-21 14:40:05 +08:00
elsif key && whitelist_complex . include? ( key [ " component_type_id " ] )
case key [ " component_type_id " ]
when " 8 "
2017-09-20 21:31:10 +08:00
2017-09-21 14:40:05 +08:00
when " 9 "
2017-09-20 21:31:10 +08:00
when " 15 "
when " 18 "
if key [ " source_data " ] [ " link " ] && key [ " source_data " ] [ " link " ] != " "
2017-09-21 14:40:05 +08:00
2017-09-20 21:31:10 +08:00
end
when " 19 "
when " 20 "
else
end
end #finished step component loop
else #it is first step
unless value
value = key #some json files have random empty arrays in beggining of step components
end
if whitelist_simple . include? ( value [ " component_type_id " ] )
case value [ " component_type_id " ]
when " 1 "
if ! value [ " data " ] . nil? && value [ " data " ] != " "
@import_object [ " steps " ] [ step_pos . to_s ] [ " description " ] = value [ " data " ]
else
@import_object [ " steps " ] [ step_pos . to_s ] [ " description " ] = " Description missing! "
end
when " 6 "
if ! value [ " data " ] . nil? && value [ " data " ] != " "
@import_object [ " steps " ] [ step_pos . to_s ] [ " name " ] = value [ " data " ]
else
@import_object [ " steps " ] [ step_pos . to_s ] [ " name " ] = " Protocols.io "
end
when " 17 "
else
end
elsif value && whitelist_complex . include? ( value [ " component_type_id " ] )
2017-09-21 14:40:05 +08:00
2017-09-20 21:31:10 +08:00
case value [ " component_type_id " ]
when " 8 "
when " 9 "
when " 15 "
when " 18 "
if value [ " source_data " ] [ " link " ] && value [ " source_data " ] [ " link " ] != " "
end
when " 19 "
when " 20 "
else
end
end #if statement to check if its first step or not
end #finished step component looping, onto next step component
end #finished looping over step components
end #steps
2017-09-19 21:02:16 +08:00
protocol = nil
2017-09-15 21:52:55 +08:00
respond_to do | format |
2017-09-19 21:02:16 +08:00
transaction_error = false
2017-09-20 21:31:10 +08:00
#@steps_object=JSON.parse(params["steps"]["steps_object"])
2017-09-19 21:02:16 +08:00
Protocol . transaction do
begin
2017-09-20 21:31:10 +08:00
#byebug
protocol = import_new_protocol ( @import_object , current_team , params [ :type ] . to_sym , current_user )
2017-09-19 21:02:16 +08:00
rescue Exception
2017-09-20 21:31:10 +08:00
2017-09-19 21:02:16 +08:00
transaction_error = true
raise ActiveRecord :: Rollback
end
end
p_name =
2017-09-20 21:31:10 +08:00
if @import_object [ 'name' ] . present? && ! @import_object [ 'name' ] . empty?
escape_input ( @import_object [ 'name' ] )
2017-09-19 21:02:16 +08:00
else
t ( 'protocols.index.no_protocol_name' )
end
2017-09-20 21:31:10 +08:00
2017-09-19 21:02:16 +08:00
if transaction_error
2017-09-21 14:40:05 +08:00
2017-09-19 21:02:16 +08:00
format . json {
render json : { name : p_name , status : :bad_request } , status : :bad_request
}
2017-09-21 14:40:05 +08:00
format . js { }
2017-09-20 22:04:52 +08:00
2017-09-20 21:31:10 +08:00
#:location => root_url
2017-09-20 22:04:52 +08:00
# protocolsDatatable.ajax.reload();
# $('#modal-import-json-protocol-preview').modal('hide');
2017-09-19 21:02:16 +08:00
else
format . json {
render json : {
name : p_name , new_name : protocol . name , status : :ok
2017-09-20 22:04:52 +08:00
} ,
2017-09-19 21:02:16 +08:00
status : :ok
}
2017-09-21 14:40:05 +08:00
format . js { }
2017-09-19 21:02:16 +08:00
end
2017-09-15 21:52:55 +08:00
end
end
2017-09-20 21:31:10 +08:00
2017-09-13 21:15:08 +08:00
#
2016-07-21 19:11:15 +08:00
def export
2016-12-09 06:21:13 +08:00
# Make a zip output stream and send it to the client
2016-07-21 19:11:15 +08:00
respond_to do | format |
2016-12-12 22:33:21 +08:00
format . html do
2016-12-09 06:21:13 +08:00
z_output_stream = Zip :: OutputStream . write_buffer do | ostream |
2016-12-12 22:33:21 +08:00
ostream . put_next_entry ( 'scinote.xml' )
ostream . print ( generate_envelope_xml ( @protocols ) )
ostream . put_next_entry ( 'scinote.xsd' )
2016-12-09 06:21:13 +08:00
ostream . print ( generate_envelope_xsd )
2016-12-12 22:33:21 +08:00
ostream . put_next_entry ( 'eln.xsd' )
2016-12-09 06:21:13 +08:00
ostream . print ( generate_eln_xsd )
2016-12-12 22:33:21 +08:00
# Create folder and xml file for each protocol and populate it
@protocols . each do | protocol |
protocol_dir = get_guid ( protocol . id ) . to_s
ostream . put_next_entry ( " #{ protocol_dir } /eln.xml " )
ostream . print ( generate_protocol_xml ( protocol ) )
# Add assets to protocol folder
2017-01-09 23:19:44 +08:00
next if protocol . steps . count < = 0
protocol . steps . order ( :id ) . each do | step |
step_guid = get_guid ( step . id )
step_dir = " #{ protocol_dir } / #{ step_guid } "
next if step . assets . count < = 0
step . assets . order ( :id ) . each do | asset |
asset_guid = get_guid ( asset . id )
asset_file_name = asset_guid . to_s +
File . extname ( asset . file_file_name ) . to_s
ostream . put_next_entry ( " #{ step_dir } / #{ asset_file_name } " )
input_file = asset . open
ostream . print ( input_file . read )
input_file . close
2016-12-12 22:33:21 +08:00
end
end
end
2016-12-09 06:21:13 +08:00
end
z_output_stream . rewind
2016-12-12 22:33:21 +08:00
protocol_name = get_protocol_name ( @protocols [ 0 ] )
# Now generate filename of the archive and send file to user
if @protocols . count == 1
# Try to construct an OS-safe file name
file_name = 'protocol.eln'
unless protocol_name . nil?
2017-01-09 23:19:44 +08:00
escaped_name = protocol_name . gsub ( / [^0-9a-zA-Z \ -.,_] /i , '_' )
. downcase [ 0 .. Constants :: NAME_MAX_LENGTH ]
2016-12-12 22:33:21 +08:00
file_name = escaped_name + '.eln' unless escaped_name . empty?
end
elsif @protocols . length > 1
file_name = 'protocols.eln'
end
send_data ( z_output_stream . read , filename : file_name )
2016-12-09 06:21:13 +08:00
end
2016-07-21 19:11:15 +08:00
end
end
def unlink_modal
respond_to do | format |
format . json {
render json : {
title : t ( " my_modules.protocols.confirm_link_update_modal.unlink_title " ) ,
message : t ( " my_modules.protocols.confirm_link_update_modal.unlink_message " ) ,
btn_text : t ( " my_modules.protocols.confirm_link_update_modal.unlink_btn_text " ) ,
url : unlink_protocol_path ( @protocol )
}
}
end
end
def revert_modal
respond_to do | format |
format . json {
render json : {
title : t ( " my_modules.protocols.confirm_link_update_modal.revert_title " ) ,
message : t ( " my_modules.protocols.confirm_link_update_modal.revert_message " ) ,
btn_text : t ( " my_modules.protocols.confirm_link_update_modal.revert_btn_text " ) ,
url : revert_protocol_path ( @protocol )
}
}
end
end
def update_parent_modal
respond_to do | format |
format . json {
render json : {
title : t ( " my_modules.protocols.confirm_link_update_modal.update_parent_title " ) ,
message : t ( " my_modules.protocols.confirm_link_update_modal.update_parent_message " ) ,
btn_text : t ( " general.update " ) ,
url : update_parent_protocol_path ( @protocol )
}
}
end
end
def update_from_parent_modal
respond_to do | format |
format . json {
render json : {
title : t ( " my_modules.protocols.confirm_link_update_modal.update_self_title " ) ,
message : t ( " my_modules.protocols.confirm_link_update_modal.update_self_message " ) ,
btn_text : t ( " general.update " ) ,
url : update_from_parent_protocol_path ( @protocol )
}
}
end
end
def load_from_repository_datatable
@protocol = Protocol . find_by_id ( params [ :id ] )
@type = ( params [ :type ] || " public " ) . to_sym
respond_to do | format |
format . json {
render json : :: LoadFromRepositoryProtocolsDatatable . new (
view_context ,
2017-01-24 23:57:14 +08:00
@protocol . team ,
2016-07-21 19:11:15 +08:00
@type ,
current_user
)
}
end
end
def load_from_repository_modal
@protocol = Protocol . find_by_id ( params [ :id ] )
respond_to do | format |
format . json {
render json : {
html : render_to_string ( {
partial : " my_modules/protocols/load_from_repository_modal_body.html.erb "
} )
}
}
end
end
def copy_to_repository_modal
@new = Protocol . new
@original = Protocol . find ( params [ :id ] )
respond_to do | format |
format . json {
render json : {
html : render_to_string ( {
partial : " my_modules/protocols/copy_to_repository_modal_body.html.erb "
} )
}
}
end
end
def protocol_status_bar
respond_to do | format |
format . json {
render json : {
html : render_to_string ( {
partial : " my_modules/protocols/protocol_status_bar.html.erb "
} )
}
}
end
end
def updated_at_label
respond_to do | format |
format . json {
render json : {
html : render_to_string ( {
partial : " protocols/header/updated_at_label.html.erb "
} )
}
}
end
end
def create_new_modal
@new_protocol = Protocol . new
respond_to do | format |
format . json {
render json : {
html : render_to_string ( {
partial : " protocols/index/create_new_modal_body.html.erb "
} )
}
}
end
end
def edit_name_modal
respond_to do | format |
format . json {
render json : {
2017-01-04 22:04:12 +08:00
title : I18n . t ( 'protocols.header.edit_name_modal.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-07-21 19:11:15 +08:00
html : render_to_string ( {
partial : " protocols/header/edit_name_modal_body.html.erb "
} )
}
}
end
end
def edit_keywords_modal
respond_to do | format |
format . json {
render json : {
2017-01-04 22:04:12 +08:00
title : I18n . t ( 'protocols.header.edit_keywords_modal.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-07-21 19:11:15 +08:00
html : render_to_string ( {
partial : " protocols/header/edit_keywords_modal_body.html.erb "
} ) ,
2017-01-24 23:57:14 +08:00
keywords : @protocol . team . protocol_keywords_list
2016-07-21 19:11:15 +08:00
}
}
end
end
def edit_authors_modal
respond_to do | format |
format . json {
render json : {
2017-01-04 22:04:12 +08:00
title : I18n . t ( 'protocols.header.edit_authors_modal.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-07-21 19:11:15 +08:00
html : render_to_string ( {
partial : " protocols/header/edit_authors_modal_body.html.erb "
} )
}
}
end
end
def edit_description_modal
respond_to do | format |
format . json {
render json : {
2017-01-04 22:04:12 +08:00
title : I18n . t ( 'protocols.header.edit_description_modal.title' ,
2017-01-11 22:50:11 +08:00
protocol : escape_input ( @protocol . name ) ) ,
2016-07-21 19:11:15 +08:00
html : render_to_string ( {
partial : " protocols/header/edit_description_modal_body.html.erb "
} )
}
}
end
end
private
def move_protocol ( action )
rollbacked = false
results = [ ]
begin
Protocol . transaction do
@protocols . find_each do | protocol |
result = {
name : protocol . name
}
success = protocol . method ( action ) . call ( current_user )
# Try renaming protocol
unless success
rename_record ( protocol , :name )
success = protocol . method ( action ) . call ( current_user )
end
result [ :new_name ] = protocol . name
result [ :type ] = protocol . protocol_type
result [ :success ] = success
results << result
end
end
rescue
rollbacked = true
end
respond_to do | format |
unless rollbacked
format . json {
render json : {
html : render_to_string ( {
partial : " protocols/index/results_modal_body.html.erb " ,
locals : { results : results , en_action : " #{ action } _results " }
} )
}
}
else
format . json {
render json : { } , status : :bad_request
}
end
end
end
2017-01-24 23:57:14 +08:00
def load_team_and_type
@current_team = current_team
2016-07-21 19:11:15 +08:00
# :public, :private or :archive
@type = ( params [ :type ] || " public " ) . to_sym
end
def check_view_all_permissions
2017-01-24 23:57:14 +08:00
load_team_and_type
2016-07-21 19:11:15 +08:00
2017-02-01 21:09:26 +08:00
render_403 unless can_view_team_protocols ( @current_team )
2016-07-21 19:11:15 +08:00
end
def check_view_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_view_protocol ( @protocol )
respond_to { | f | f . json { render json : { } , status : :unauthorized } }
end
end
def check_create_permissions
2017-01-24 23:57:14 +08:00
load_team_and_type
2016-07-21 19:11:15 +08:00
2017-01-24 23:57:14 +08:00
if ! can_create_new_protocol ( @current_team ) || @type == :archive
2016-07-21 19:11:15 +08:00
render_403
end
end
def check_clone_permissions
2017-01-24 23:57:14 +08:00
load_team_and_type
2016-07-21 19:11:15 +08:00
@original = Protocol . find_by_id ( params [ :id ] )
if @original . blank? ||
! can_clone_protocol ( @original ) || @type == :archive
render_403
end
end
def check_edit_permissions
2017-01-24 23:57:14 +08:00
load_team_and_type
2016-07-21 19:11:15 +08:00
@protocol = Protocol . find_by_id ( params [ :id ] )
unless can_edit_protocol ( @protocol )
render_403
end
end
def check_unlink_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_unlink_protocol ( @protocol )
render_403
end
end
def check_revert_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_revert_protocol ( @protocol )
render_403
end
end
def check_update_parent_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_update_parent_protocol ( @protocol )
render_403
end
end
def check_update_from_parent_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_update_protocol_from_parent ( @protocol )
render_403
end
end
def check_load_from_repository_views_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
if @protocol . blank? || ! can_view_protocol ( @protocol )
render_403
end
end
def check_load_from_repository_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
@source = Protocol . find_by_id ( params [ :source_id ] )
if @protocol . blank? || @source . blank? || ! can_load_protocol_from_repository ( @protocol , @source )
render_403
end
end
def check_load_from_file_permissions
@protocol_json = params [ :protocol ]
@protocol = Protocol . find_by_id ( params [ :id ] )
@my_module = @protocol . my_module
if @protocol_json . blank? ||
@protocol . blank? ||
@my_module . blank? ||
! can_load_protocol_into_module ( @my_module )
render_403
end
end
def check_copy_to_repository_permissions
@protocol = Protocol . find_by_id ( params [ :id ] )
@my_module = @protocol . my_module
if @my_module . blank? or ! can_copy_protocol_to_repository ( @my_module )
render_403
end
end
def check_make_private_permissions
@protocols = Protocol . where ( id : params [ :protocol_ids ] )
@protocols . find_each do | protocol |
unless can_make_protocol_private ( protocol ) then
respond_to { | f | f . json { render json : { } , status : :unauthorized } }
return
end
end
end
def check_publish_permissions
@protocols = Protocol . where ( id : params [ :protocol_ids ] )
@protocols . find_each do | protocol |
unless can_publish_protocol ( protocol ) then
respond_to { | f | f . json { render json : { } , status : :unauthorized } }
return
end
end
end
def check_archive_permissions
@protocols = Protocol . where ( id : params [ :protocol_ids ] )
@protocols . find_each do | protocol |
unless can_archive_protocol ( protocol ) then
respond_to { | f | f . json { render json : { } , status : :unauthorized } }
return
end
end
end
def check_restore_permissions
@protocols = Protocol . where ( id : params [ :protocol_ids ] )
@protocols . find_each do | protocol |
unless can_restore_protocol ( protocol ) then
respond_to { | f | f . json { render json : { } , status : :unauthorized } }
return
end
end
end
def check_import_permissions
@protocol_json = params [ :protocol ]
2017-01-25 00:06:51 +08:00
@team = Team . find ( params [ :team_id ] )
2016-07-21 19:11:15 +08:00
@type = params [ :type ] ? params [ :type ] . to_sym : nil
if ! (
@protocol_json . present? &&
2017-01-24 23:57:14 +08:00
@team . present? &&
2016-07-21 19:11:15 +08:00
( @type == :public || @type == :private ) &&
2017-01-24 23:57:14 +08:00
can_import_protocols ( @team )
2016-07-21 19:11:15 +08:00
)
render_403
end
end
def check_export_permissions
@protocols = Protocol . where ( id : params [ :protocol_ids ] )
if @protocols . blank? || @protocols . any? { | p | ! can_export_protocol ( p ) }
render_403
end
end
def copy_to_repository_params
params . require ( :protocol ) . permit ( :name , :protocol_type )
end
def create_params
params . require ( :protocol ) . permit ( :name )
end
def metadata_params
params . require ( :protocol ) . permit ( :name , :authors , :description )
end
2016-08-12 22:31:40 +08:00
end