canvas-lms/app/controllers/assignment_groups_api_contr...

178 lines
6.6 KiB
Ruby

#
# Copyright (C) 2013 - 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/>.
#
# @API Assignment Groups
class AssignmentGroupsApiController < ApplicationController
before_action :require_context
before_action :get_assignment_group, :except => [:create]
include Api::V1::AssignmentGroup
# @API Get an Assignment Group
#
# Returns the assignment group with the given id.
#
# @argument include[] ["assignments"|"discussion_topic"|"assignment_visibility"|"submission"]
# Associations to include with the group. "discussion_topic" and "assignment_visibility" and "submission"
# are only valid if "assignments" is also included. The "assignment_visibility" option additionally
# requires that the Differentiated Assignments course feature be turned on.
#
# @argument override_assignment_dates [Boolean]
# Apply assignment overrides for each assignment, defaults to true.
#
# @argument grading_period_id [Integer]
# The id of the grading period in which assignment groups are being requested
# (Requires grading periods to exist on the account)
#
# @returns AssignmentGroup
def show
if authorized_action(@assignment_group, @current_user, :read)
includes = Array(params[:include])
override_dates = value_to_boolean(params[:override_assignment_dates] || true)
assignments = @assignment_group.visible_assignments(@current_user)
if params[:grading_period_id].present?
assignments = GradingPeriod.for(@context).find_by(id: params[:grading_period_id]).assignments(assignments)
end
if assignments.any? && includes.include?('submission')
submissions = submissions_hash(['submission'], assignments)
end
includes.delete('assignment_visibility') unless @context.grants_any_right?(@current_user, :read_as_admin, :manage_grades, :manage_assignments)
render :json => assignment_group_json(@assignment_group, @current_user, session, includes, {
stringify_json_ids: stringify_json_ids?,
override_dates: override_dates,
assignments: assignments,
submissions: submissions
})
end
end
# @API Create an Assignment Group
#
# Create a new assignment group for this course.
#
# @argument name [String]
# The assignment group's name
#
# @argument position [Integer]
# The position of this assignment group in relation to the other assignment groups
#
# @argument group_weight [Float]
# The percent of the total grade that this assignment group represents
#
# @argument sis_source_id [String]
# The sis source id of the Assignment Group
#
# @argument integration_data [Object]
# The integration data of the Assignment Group
#
# @argument rules
# The grading rules that are applied within this assignment group
# See the Assignment Group object definition for format
#
# @returns AssignmentGroup
def create
@assignment_group = @context.assignment_groups.temp_record
if authorized_action(@assignment_group, @current_user, :create)
unless valid_integration_data?(params)
return render :json => 'Invalid integration data', :status => :bad_request
end
updated = update_assignment_group(@assignment_group, params)
process_assignment_group(updated)
end
end
# @API Edit an Assignment Group
#
# Modify an existing Assignment Group.
# Accepts the same parameters as Assignment Group creation
#
# @returns AssignmentGroup
def update
if authorized_action(@assignment_group, @current_user, :update)
unless valid_integration_data?(params)
return render :json => 'Invalid integration data', :status => :bad_request
end
updated = update_assignment_group(@assignment_group, params)
unless can_update_assignment_group?(@assignment_group)
return render_unauthorized_action
end
process_assignment_group(updated)
end
end
# @API Destroy an Assignment Group
#
# Deletes the assignment group with the given id.
#
# @argument move_assignments_to [Integer]
# The ID of an active Assignment Group to which the assignments that are
# currently assigned to the destroyed Assignment Group will be assigned.
# NOTE: If this argument is not provided, any assignments in this Assignment
# Group will be deleted.
#
# @returns AssignmentGroup
def destroy
if authorized_action(@assignment_group, @current_user, :delete)
if @assignment_group.assignments.active.exists?
if @assignment_group.has_frozen_assignment_group_id_assignment?(@current_user)
err_msg = t('errors.frozen_assignments_error', "You cannot delete a group with a locked assignment.")
@assignment_group.errors.add('workflow_state', err_msg, :att_name => 'workflow_state')
render :json => @assignment_group.errors, :status => :bad_request
return
end
if params[:move_assignments_to]
@assignment_group.move_assignments_to params[:move_assignments_to]
end
end
@assignment_group.destroy
render :json => assignment_group_json(@assignment_group, @current_user, session, [], { stringify_json_ids: stringify_json_ids? })
end
end
def get_assignment_group
@assignment_group = @context.assignment_groups.active.find(params[:assignment_group_id])
end
def process_assignment_group(updated)
if updated && @assignment_group.save
render :json => assignment_group_json(@assignment_group, @current_user, session, [], { stringify_json_ids: stringify_json_ids? })
else
render :json => @assignment_group.errors, :status => :bad_request
end
end
def can_update_assignment_group?(assignment_group)
return true if @context.account_membership_allows(@current_user)
return true unless assignment_group.group_weight_changed? || assignment_group.rules_changed?
!assignment_group.any_assignment_in_closed_grading_period?
end
private
def valid_integration_data?(params)
integration_data = params['integration_data']
integration_data.is_a?(ActionController::Parameters) || integration_data.nil?
end
end