canvas-lms/app/controllers/content_imports_controller.rb

172 lines
6.5 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/>.
#
# @API Courses
class ContentImportsController < ApplicationController
before_filter :require_context
before_filter { |c| c.active_tab = "home" }
prepend_around_filter :load_pseudonym_from_policy, :only => :migrate_content_upload
include Api::V1::Course
include ContentImportsHelper
COPY_TYPES = %w{assignment_groups assignments context_modules
learning_outcomes quizzes assessment_question_banks folders
attachments wiki_pages discussion_topics calendar_events
context_external_tools learning_outcome_groups rubrics}.freeze
# these are deprecated, but leaving them for a while so existing links get redirected
def index
redirect_to course_content_migrations_url(@context)
end
def intro
redirect_to course_content_migrations_url(@context)
end
# current files UI uses this page for .zip uploads
def files
authorized_action(@context, @current_user, [:manage_content, :manage_files])
js_env(return_or_context_url: return_or_context_url,
return_to: params[:return_to])
end
# @API Get course copy status
#
# DEPRECATED: Please use the {api:ContentMigrationsController#create Content Migrations API}
#
# Retrieve the status of a course copy
#
# @response_field id The unique identifier for the course copy.
#
# @response_field created_at The time that the copy was initiated.
#
# @response_field progress The progress of the copy as an integer. It is null before the copying starts, and 100 when finished.
#
# @response_field workflow_state The current status of the course copy. Possible values: "created", "started", "completed", "failed"
#
# @response_field status_url The url for the course copy status API endpoint.
#
# @example_response
# {'progress':100, 'workflow_state':'completed', 'id':257, 'created_at':'2011-11-17T16:50:06Z', 'status_url':'/api/v1/courses/9457/course_copy/257'}
def copy_course_status
if api_request?
@context = api_find(Course, params[:course_id])
end
if authorized_action(@context, @current_user, :manage_content)
cm = ContentMigration.where(context_id: @context, id: params[:id]).first
raise ActiveRecord::RecordNotFound unless cm
respond_to do |format|
format.json { render :json => copy_status_json(cm, @context, @current_user, session)}
end
end
end
# @API Copy course content
#
# DEPRECATED: Please use the {api:ContentMigrationsController#create Content Migrations API}
#
# Copies content from one course into another. The default is to copy all course
# content. You can control specific types to copy by using either the 'except' option
# or the 'only' option.
#
# @argument source_course [String]
# ID or SIS-ID of the course to copy the content from
#
# @argument except[] [String, "course_settings"|"assignments"|"external_tools"|"files"|"topics"|"calendar_events"|"quizzes"|"wiki_pages"|"modules"|"outcomes"]
# A list of the course content types to exclude, all areas not listed will
# be copied.
#
# @argument only[] [String, "course_settings"|"assignments"|"external_tools"|"files"|"topics"|"calendar_events"|"quizzes"|"wiki_pages"|"modules"|"outcomes"]
# A list of the course content types to copy, all areas not listed will not
# be copied.
#
# The response is the same as the course copy status endpoint
#
def copy_course_content
if api_request?
@context = api_find(Course, params[:course_id])
end
if authorized_action(@context, @current_user, :manage_content)
if api_request?
@source_course = api_find(Course, params[:source_course])
copy_params = {:everything => false}
if params[:only] && params[:except]
render :json => {"errors"=>t('errors.no_only_and_except', 'You can not use "only" and "except" options at the same time.')}, :status => :bad_request
return
elsif params[:only]
convert_to_table_name(params[:only]).each {|o| copy_params["all_#{o}".to_sym] = true}
elsif params[:except]
COPY_TYPES.each {|o| copy_params["all_#{o}".to_sym] = true}
convert_to_table_name(params[:except]).each {|o| copy_params["all_#{o}".to_sym] = false}
else
copy_params[:everything] = true
end
else
process_migration_params
@source_course = Course.find(params[:source_course])
copy_params = params[:copy]
end
# make sure the user can copy from the source course
return render_unauthorized_action unless @source_course.grants_all_rights?(@current_user, :read, :read_as_admin)
cm = ContentMigration.create!(:context => @context,
:user => @current_user,
:source_course => @source_course,
:copy_options => copy_params,
:migration_type => 'course_copy_importer',
:initiated_source => api_request? ? :api : :manual)
cm.queue_migration
cm.workflow_state = 'created'
render :json => copy_status_json(cm, @context, @current_user, session)
end
end
private
def process_migration_params
if params[:items_to_copy]
params[:copy] ||= {}
params[:items_to_copy].each_pair do |key, vals|
params[:copy][key] ||= {}
if vals && !vals.empty?
vals.each do |val|
params[:copy][key][val] = true
end
end
end
end
end
SELECTION_CONVERSIONS = {
"external_tools" => "context_external_tools",
"files" => "attachments",
"topics" => "discussion_topics",
"modules" => "context_modules",
"outcomes" => "learning_outcomes"
}.freeze
# convert types selected in API to expected format
def convert_to_table_name(selections)
selections.map{|s| SELECTION_CONVERSIONS[s] || s}
end
end