canvas-lms/app/controllers/rubrics_controller.rb

117 lines
5.9 KiB
Ruby

#
# Copyright (C) 2011 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 RubricsController < ApplicationController
before_filter :require_context
before_filter { |c| c.active_tab = "rubrics" }
include Api::V1::Outcome
def index
return unless authorized_action(@context, @current_user, :manage)
js_env :ROOT_OUTCOME_GROUP => get_root_outcome
@rubric_associations = @context.rubric_associations.bookmarked.include_rubric.to_a
@rubric_associations = Canvas::ICU.collate_by(@rubric_associations.select(&:rubric_id).uniq(&:rubric_id)) { |r| r.rubric.title }
@rubrics = @rubric_associations.map(&:rubric)
@context.is_a?(User) ? render(:action => 'user_index') : render
end
def show
return unless authorized_action(@context, @current_user, :manage)
if (id = params[:id]) =~ Api::ID_REGEX
js_env :ROOT_OUTCOME_GROUP => get_root_outcome
@rubric_association = @context.rubric_associations.bookmarked.find_by_rubric_id(params[:id])
raise ActiveRecord::RecordNotFound unless @rubric_association
@actual_rubric = @rubric_association.rubric
else
raise ActiveRecord::RecordNotFound
end
end
def create
update
end
# This controller looks yucky (and is yucky) because it handles a funky logic.
# If you try to update a rubric that is being used in more than one place,
# instead of updating that rubric this will create a new rubric based on
# the old rubric and return that one instead. If you pass it a rubric_association_id
# parameter, then it will point the rubric_association to the new rubric
# instead of the old one.
def update
params[:rubric_association] ||= {}
@association_object = RubricAssociation.get_association_object(params[:rubric_association])
params[:rubric][:user] = @current_user if params[:rubric]
if (!@association_object || authorized_action(@association_object, @current_user, :read)) && authorized_action(@context, @current_user, :manage_rubrics)
@association = @context.rubric_associations.find_by_id(params[:rubric_association_id]) if params[:rubric_association_id].present?
@association_object ||= @association.association_object if @association
params[:rubric_association][:association_object] = @association_object
params[:rubric_association][:update_if_existing] = params[:action] == 'update'
skip_points_update = !!(params[:skip_updating_points_possible] =~ /true/i)
params[:rubric_association][:skip_updating_points_possible] = skip_points_update
@rubric = @association.rubric if params[:id] && @association && (@association.rubric_id == params[:id].to_i || (@association.rubric && @association.rubric.migration_id == "cloned_from_#{params[:id]}"))
@rubric ||= @context.rubrics.find_by_id(params[:id]) if params[:id].present?
@association = nil unless @association && @rubric && @association.rubric_id == @rubric.id
params[:rubric_association][:id] = @association.id if @association
# Update the rubric if you can
# Better specify params[:rubric_association_id] if you want it to update an existing association
# If this is a brand new rubric OR if the rubric isn't editable,
# then create a new rubric
if !@rubric || (@rubric.will_change_with_update?(params[:rubric]) && !@rubric.grants_right?(@current_user, session, :update))
original_rubric_id = @rubric && @rubric.id
@rubric = @context.rubrics.build
@rubric.rubric_id = original_rubric_id
@rubric.user = @current_user
end
if params[:rubric] && (@rubric.grants_right?(@current_user, session, :update) || (@association && @association.grants_right?(@current_user, session, :update))) #authorized_action(@rubric, @current_user, :update)
@association = @rubric.update_with_association(@current_user, params[:rubric], @context, params[:rubric_association])
@rubric = @association.rubric if @association
end
json_res = {}
json_res[:rubric] = @rubric.as_json(:methods => :criteria, :include_root => false, :permissions => {:user => @current_user, :session => session}) if @rubric
json_res[:rubric_association] = @association.as_json(:include_root => false, :include => [:rubric_assessments, :assessment_requests], :methods => :assessor_name, :permissions => {:user => @current_user, :session => session}) if @association
json_res[:rubric_association][:skip_updating_points_possible] = skip_points_update if json_res && json_res[:rubric_association]
render :json => json_res
end
end
def destroy
@rubric = RubricAssociation.find_by_rubric_id_and_context_id_and_context_type(params[:id], @context.id, @context.class.to_s, :include => :rubric).rubric
if authorized_action(@rubric, @current_user, :delete_associations)
@rubric.destroy_for(@context)
render :json => @rubric
end
end
# Internal: Find and format the given context's root outcome group.
#
# Returns a JSON outcome object or nil.
def get_root_outcome
root_outcome = if @context.respond_to?(:root_outcome_group)
@context.root_outcome_group
elsif @context.respond_to?(:account)
@context.account.root_outcome_group
end
return nil if root_outcome.nil?
outcome_group_json(root_outcome, @current_user, session)
end
protected :get_root_outcome
end