scinote-web/app/controllers/experiments_controller.rb

348 lines
9.9 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
class ExperimentsController < ApplicationController
include SampleActions
include TeamsHelper
include InputSanitizeHelper
2017-04-06 20:55:18 +08:00
include ActionView::Helpers::TextHelper
include ApplicationHelper
include Rails.application.routes.url_helpers
2016-10-12 15:30:55 +08:00
2016-08-08 21:04:02 +08:00
before_action :set_experiment,
except: %i(new create)
2016-08-08 21:04:02 +08:00
before_action :set_project,
only: %i(new create samples_index samples module_archive
clone_modal move_modal delete_samples)
before_action :load_projects_tree, only: %i(canvas samples module_archive)
2016-08-08 21:04:02 +08:00
before_action :check_view_permissions,
only: %i(canvas module_archive)
before_action :check_manage_permissions, only: :edit
before_action :check_archive_permissions, only: :archive
before_action :check_clone_permissions, only: %i(clone_modal clone)
before_action :check_move_permissions, only: %i(move_modal move)
before_action :set_inline_name_editing, only: %i(canvas module_archive)
layout 'fluid'.freeze
2016-07-28 17:30:34 +08:00
# Action defined in SampleActions
DELETE_SAMPLES = 'Delete'.freeze
def new
@experiment = Experiment.new
2016-07-28 20:44:44 +08:00
respond_to do |format|
2016-07-29 16:41:08 +08:00
format.json do
render json: {
html: render_to_string(
partial: 'new_modal.html.erb'
)
2016-07-28 20:44:44 +08:00
}
2016-07-29 16:41:08 +08:00
end
2016-07-28 20:44:44 +08:00
end
end
def create
@experiment = Experiment.new(experiment_params)
@experiment.created_by = current_user
2016-07-28 20:44:44 +08:00
@experiment.last_modified_by = current_user
@experiment.project = @project
if @experiment.save
2017-04-06 20:55:18 +08:00
experiment_annotation_notification
2019-03-05 18:39:57 +08:00
log_activity(:create_experiment)
2016-08-03 15:34:10 +08:00
flash[:success] = t('experiments.create.success_flash',
experiment: @experiment.name)
respond_to do |format|
format.json do
2017-04-20 23:55:28 +08:00
render json: { path: canvas_experiment_url(@experiment) }, status: :ok
end
end
else
respond_to do |format|
format.json do
render json: @experiment.errors, status: :unprocessable_entity
end
end
end
end
2016-07-28 15:01:44 +08:00
def canvas
@project = @experiment.project
@active_modules = @experiment.active_modules
.includes(:tags, :inputs, :outputs)
current_team_switch(@project.team)
end
2016-08-03 15:34:10 +08:00
def edit
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'edit_modal.html.erb'
)
}
end
end
end
def update
render_403 && return unless if experiment_params[:archived] == 'false'
can_restore_experiment?(@experiment)
else
can_manage_experiment?(@experiment)
end
2017-04-06 20:55:18 +08:00
old_text = @experiment.description
2019-09-12 23:21:48 +08:00
@experiment.update(experiment_params)
@experiment.last_modified_by = current_user
if @experiment.save
experiment_annotation_notification(old_text) if old_text
2019-03-15 18:12:10 +08:00
activity_type = if experiment_params[:archived] == 'false'
:restore_experiment
else
:edit_experiment
end
2019-03-05 18:39:57 +08:00
log_activity(activity_type)
2016-09-02 20:13:59 +08:00
respond_to do |format|
format.json do
render json: {}, status: :ok
end
format.html do
flash[:success] = t('experiments.update.success_flash',
experiment: @experiment.name)
redirect_to project_path(@experiment.project)
end
2016-09-02 20:13:59 +08:00
end
else
2016-09-02 20:13:59 +08:00
respond_to do |format|
format.json do
render json: @experiment.errors, status: :unprocessable_entity
end
format.html do
flash[:alert] = t('experiments.update.error_flash')
2017-12-08 00:59:23 +08:00
redirect_back(fallback_location: root_path)
end
2016-09-02 20:13:59 +08:00
end
end
end
2016-08-03 15:34:10 +08:00
def archive
@experiment.archived = true
@experiment.archived_by = current_user
@experiment.archived_on = DateTime.now
if @experiment.save
2019-03-05 18:39:57 +08:00
log_activity(:archive_experiment)
2016-08-03 15:34:10 +08:00
flash[:success] = t('experiments.archive.success_flash',
experiment: @experiment.name)
2016-08-03 15:34:10 +08:00
redirect_to project_path(@experiment.project)
else
flash[:alert] = t('experiments.archive.error_flash')
2017-12-08 00:59:23 +08:00
redirect_back(fallback_location: root_path)
end
end
# GET: clone_modal_experiment_path(id)
def clone_modal
2016-08-16 14:49:24 +08:00
@projects = @experiment.projects_with_role_above_user(current_user)
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'clone_modal.html.erb'
)
}
end
end
end
# POST: clone_experiment(id)
def clone
service = Experiments::CopyExperimentAsTemplateService
.call(experiment_id: @experiment.id,
project_id: move_experiment_param,
user_id: current_user.id)
2016-08-11 23:00:33 +08:00
if service.succeed?
flash[:success] = t('experiments.clone.success_flash',
experiment: @experiment.name)
redirect_to canvas_experiment_path(service.cloned_experiment)
else
flash[:error] = t('experiments.clone.error_flash',
2016-08-16 15:15:29 +08:00
experiment: @experiment.name)
redirect_to project_path(@experiment.project)
end
end
# GET: move_modal_experiment_path(id)
def move_modal
2016-08-16 14:49:24 +08:00
@projects = @experiment.moveable_projects(current_user)
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'move_modal.html.erb'
)
}
end
end
end
# POST: move_experiment(id)
def move
service = Experiments::MoveToProjectService
.call(experiment_id: @experiment.id,
project_id: move_experiment_param,
user_id: current_user.id)
2016-08-16 14:49:24 +08:00
if service.succeed?
flash[:success] = t('experiments.move.success_flash',
experiment: @experiment.name)
path = canvas_experiment_url(@experiment)
status = :ok
else
message = t('experiments.move.error_flash',
experiment: escape_input(@experiment.name))
status = :unprocessable_entity
end
render json: { message: message, path: path }, status: status
end
2016-08-08 21:04:02 +08:00
def module_archive
end
def samples
2016-08-02 15:13:30 +08:00
@samples_index_link = samples_index_experiment_path(@experiment,
format: :json)
@team = @experiment.project.team
end
def samples_index
@team = @experiment.project.team
respond_to do |format|
format.html
2016-08-02 15:13:30 +08:00
format.json do
render json: ::SampleDatatable.new(view_context,
@team,
nil,
nil,
@experiment,
current_user)
2016-08-02 15:13:30 +08:00
end
end
end
2016-08-19 21:36:12 +08:00
def updated_img
if @experiment.workflowimg.attached? && !@experiment.workflowimg_exists?
@experiment.workflowimg.purge
@experiment.generate_workflow_img
end
2016-08-19 21:36:12 +08:00
respond_to do |format|
format.json do
if @experiment.workflowimg.attached?
2016-08-19 21:36:12 +08:00
render json: {}, status: 200
else
render json: {}, status: 404
end
end
end
end
def fetch_workflow_img
2016-08-19 21:36:12 +08:00
respond_to do |format|
format.json do
render json: {
workflowimg: render_to_string(
partial: 'projects/show/workflow_img.html.erb'
)
2016-08-19 21:36:12 +08:00
}
end
end
end
private
def set_experiment
@experiment = Experiment.find_by_id(params[:id])
2016-07-28 16:15:58 +08:00
render_404 unless @experiment
end
def set_project
@project = Project.find_by_id(params[:project_id]) || @experiment.project
2016-07-28 16:15:58 +08:00
render_404 unless @project
end
def experiment_params
params.require(:experiment).permit(:name, :description, :archived)
end
2016-07-28 17:00:56 +08:00
def move_experiment_param
params.require(:experiment).require(:project_id)
end
def load_projects_tree
# Switch to correct team
current_team_switch(@experiment.project.team) unless @experiment.project.nil?
@projects_tree = current_user.projects_tree(current_team, nil)
2018-03-22 18:41:33 +08:00
end
2016-07-28 16:15:58 +08:00
def check_view_permissions
render_403 unless can_read_experiment?(@experiment)
2016-08-08 21:04:02 +08:00
end
def check_manage_permissions
render_403 unless can_manage_experiment?(@experiment)
end
def check_archive_permissions
render_403 unless can_archive_experiment?(@experiment)
end
def check_clone_permissions
render_403 unless can_clone_experiment?(@experiment)
end
def check_move_permissions
render_403 unless can_move_experiment?(@experiment)
end
def set_inline_name_editing
return unless can_manage_experiment?(@experiment)
@inline_editable_title_config = {
name: 'title',
params_group: 'experiment',
item_id: @experiment.id,
field_to_udpate: 'name',
path_to_update: experiment_path(@experiment)
}
end
2017-04-06 20:55:18 +08:00
def experiment_annotation_notification(old_text = nil)
smart_annotation_notification(
old_text: old_text,
new_text: @experiment.description,
title: t('notifications.experiment_annotation_title',
experiment: @experiment.name,
user: current_user.full_name),
message: t('notifications.experiment_annotation_message_html',
project: link_to(@experiment.project.name,
project_url(@experiment.project)),
experiment: link_to(@experiment.name,
canvas_experiment_url(@experiment)))
)
end
2019-03-05 18:39:57 +08:00
def log_activity(type_of)
Activities::CreateActivityService
.call(activity_type: type_of,
owner: current_user,
team: @experiment.project.team,
project: @experiment.project,
subject: @experiment,
message_items: { experiment: @experiment.id })
end
end