canvas-lms/lib/cc/module_meta.rb

124 lines
5.0 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/>.
#
module CC
module ModuleMeta
def create_module_meta(document=nil)
return nil unless @course.context_modules.not_deleted.count > 0
if document
meta_file = nil
rel_path = nil
else
meta_file = File.new(File.join(@canvas_resource_dir, CCHelper::MODULE_META), 'w')
rel_path = File.join(CCHelper::COURSE_SETTINGS_DIR, CCHelper::MODULE_META)
document = Builder::XmlMarkup.new(:target=>meta_file, :indent=>2)
end
module_id_map = {}
document.instruct!
document.modules(
"xmlns" => CCHelper::CANVAS_NAMESPACE,
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation"=> "#{CCHelper::CANVAS_NAMESPACE} #{CCHelper::XSD_URI}"
) do |mods_node|
@course.context_modules.not_deleted.each do |cm|
# context modules are in order and a pre-req can only reference
# a previous module, so just adding as we go is okay
mod_migration_id = create_key(cm)
module_id_map[cm.id] = mod_migration_id
unless export_object?(cm)
# if the whole module isn't selected, check to see if a specific item is selected, and make sure that item gets exported
cm.content_tags.not_deleted.each do |ct|
if export_object?(ct) && !['ContextModuleSubHeader', 'ExternalUrl'].member?(ct.content_type) && ct.content
add_item_to_export(ct.content)
end
end
next
end
add_exported_asset(cm)
mods_node.module(:identifier=>mod_migration_id) do |m_node|
m_node.title cm.name
m_node.workflow_state cm.workflow_state
m_node.position cm.position
m_node.unlock_at CCHelper::ims_datetime(cm.unlock_at) if cm.unlock_at
m_node.require_sequential_progress cm.require_sequential_progress.to_s unless cm.require_sequential_progress.nil?
m_node.requirement_count cm.requirement_count if cm.requirement_count
m_node.locked cm.locked_for?(@user).present?
if cm.prerequisites && !cm.prerequisites.empty?
m_node.prerequisites do |pre_reqs|
cm.prerequisites.each do |pre_req|
pre_reqs.prerequisite(:type=>pre_req[:type]) do |pr|
pr.title pre_req[:name]
pr.identifierref module_id_map[pre_req[:id]]
end
end
end
end
ct_id_map = {}
m_node.items do |items_node|
cm.content_tags.not_deleted.each do |ct|
ct_migration_id = create_key(ct)
ct_id_map[ct.id] = ct_migration_id
items_node.item(:identifier=>ct_migration_id) do |item_node|
unless ['ContextModuleSubHeader', 'ExternalUrl'].member? ct.content_type
add_item_to_export(ct.content)
end
item_node.content_type ct.content_type
item_node.workflow_state ct.workflow_state
item_node.title ct.title
item_node.identifierref create_key(ct.content_or_self) unless ct.content_type == 'ContextModuleSubHeader'
if ct.content_type == "ContextExternalTool"
item_node.url ct.url
if ct.content && ct.content.context != @course
item_node.global_identifierref ct.content.id
end
end
item_node.url ct.url if ct.content_type == 'ExternalUrl'
item_node.position ct.position
item_node.new_tab ct.new_tab
item_node.indent ct.indent
end
end
end
if cm.completion_requirements && !cm.completion_requirements.empty?
m_node.completionRequirements do |crs_node|
cm.completion_requirements.each do |c_req|
crs_node.completionRequirement(:type=>c_req[:type]) do |cr_node|
cr_node.min_score c_req[:min_score] unless c_req[:min_score].blank?
cr_node.identifierref ct_id_map[c_req[:id]]
end
end
end
end
end
end
end
meta_file.close if meta_file
rel_path
end
end
end