canvas-lms/app/controllers/question_banks_controller.rb

156 lines
6.2 KiB
Ruby

#
# Copyright (C) 2011 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
class QuestionBanksController < ApplicationController
before_action :require_context, :except => :bookmark
add_crumb(proc { t('#crumbs.question_banks', "Question Banks") }, :except => :bookmark) { |c| c.send :named_context_url, c.instance_variable_get("@context"), :context_question_banks_url }
include Api::V1::Outcome
def index
if @context == @current_user || authorized_action(@context, @current_user, :read_question_banks)
@question_banks = @context.assessment_question_banks.active.except(:preload).to_a
if params[:include_bookmarked] == '1'
@question_banks += @current_user.assessment_question_banks.active
end
if params[:inherited] == '1' && @context != @current_user
@question_banks += @context.inherited_assessment_question_banks.active
end
@question_banks = @question_banks.select{|b| b.grants_right?(@current_user, :manage) } if params[:managed] == '1'
@question_banks = Canvas::ICU.collate_by(@question_banks.uniq) { |b| b.title || CanvasSort::Last }
respond_to do |format|
format.html
format.json { render :json => @question_banks.map{ |b| b.as_json(methods: [:cached_context_short_name, :assessment_question_count]) }}
end
end
end
def questions
find_bank(params[:question_bank_id], params[:inherited] == '1') do
@questions = @bank.assessment_questions.active
url = polymorphic_url([@context, :question_bank_questions], :question_bank_id => @bank)
@questions = Api.paginate(@questions, self, url, default_per_page: 50)
render :json => {:pages => @questions.total_pages, :questions => @questions}
end
end
def reorder
@bank = @context.assessment_question_banks.find(params[:question_bank_id])
if authorized_action(@bank, @current_user, :update)
@bank.assessment_questions.active.first.update_order(params[:order].split(','))
render :json => {:reorder => true}
end
end
def show
@bank = @context.assessment_question_banks.find(params[:id])
js_env({
:CONTEXT_URL_ROOT => polymorphic_path([@context]),
:ROOT_OUTCOME_GROUP => outcome_group_json(@context.root_outcome_group, @current_user, session)
})
rce_js_env(:highrisk)
add_crumb(@bank.title)
if authorized_action(@bank, @current_user, :read)
@alignments = Canvas::ICU.collate_by(@bank.learning_outcome_alignments) { |a| a.learning_outcome.short_description }
@questions = @bank.assessment_questions.active.paginate(:per_page => 50, :page => 1)
end
end
def move_questions
@bank = @context.assessment_question_banks.find(params[:question_bank_id])
@new_bank = AssessmentQuestionBank.find(params[:assessment_question_bank_id])
if authorized_action(@bank, @current_user, :update) && authorized_action(@new_bank, @current_user, :manage)
ids = []
params[:questions].each do |key, value|
ids << key.to_i if value != '0' && key.to_i != 0
end
@questions = @bank.assessment_questions.where(:id => ids)
if params[:move] != '1'
attributes = @questions.columns.map(&:name) - %w{id created_at updated_at assessment_question_bank_id}
connection = @questions.connection
attributes = attributes.map { |attr| connection.quote_column_name(attr) }
now = connection.quote(Time.now.utc)
connection.insert(
"INSERT INTO #{AssessmentQuestion.quoted_table_name} (#{(%w{assessment_question_bank_id created_at updated_at} + attributes).join(', ')})" +
@questions.select(([@new_bank.id, now, now] + attributes).join(', ')).to_sql)
else
@questions.update_all(:assessment_question_bank_id => @new_bank.id)
end
[ @bank, @new_bank ].each(&:touch)
render :json => {}
end
end
def create
if authorized_action(@context.assessment_question_banks.temp_record, @current_user, :create)
@bank = @context.assessment_question_banks.build(bank_params)
respond_to do |format|
if @bank.save
@bank.bookmark_for(@current_user)
flash[:notice] = t :bank_success, "Question bank successfully created!"
format.html { redirect_to named_context_url(@context, :context_question_banks_url) }
format.json { render :json => @bank }
else
flash[:error] = t :bank_fail, "Question bank failed to create."
format.html { redirect_to named_context_url(@context, :context_question_banks_url) }
format.json { render :json => @bank.errors, :status => :bad_request }
end
end
end
end
def bookmark
@bank = AssessmentQuestionBank.find(params[:question_bank_id])
if params[:unbookmark] == "1"
render :json => @bank.bookmark_for(@current_user, false)
elsif authorized_action(@bank, @current_user, :update)
render :json => @bank.bookmark_for(@current_user)
end
end
def update
@bank = @context.assessment_question_banks.find(params[:id])
if authorized_action(@bank, @current_user, :update)
if @bank.update_attributes(bank_params)
@bank.reload
render :json => @bank.as_json(:include => {:learning_outcome_alignments => {:include => {:learning_outcome => {:include_root => false}}}})
else
render :json => @bank.errors, :status => :bad_request
end
end
end
def destroy
@bank = @context.assessment_question_banks.find(params[:id])
if authorized_action(@bank, @current_user, :delete)
@bank.destroy
render :json => @bank
end
end
private
def bank_params
params.require(:assessment_question_bank).permit(:title, :alignments => strong_anything)
end
end