canvas-lms/lib/cc/importer/canvas/topic_converter.rb

89 lines
3.6 KiB
Ruby

# frozen_string_literal: true
#
# 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::Importer::Canvas
module TopicConverter
include CC::Importer
def convert_topics_and_announcements
topics = []
announcements = []
@manifest.css("resource[type=imsdt_xmlv1p1]").each do |res|
cc_path = @package_root.item_path res.at_css("file")["href"]
cc_id = res["identifier"]
canvas_id = get_node_att(res, "dependency", "identifierref")
if canvas_id && (meta_res = @manifest.at_css(%(resource[identifier="#{canvas_id}"])))
canvas_path = @package_root.item_path meta_res.at_css("file")["href"]
meta_node = open_file_xml(canvas_path)
else
meta_node = nil
end
cc_doc = open_file_xml(cc_path)
topic = convert_topic(cc_doc, meta_node, canvas_id || cc_id)
if topic["type"] == "announcement"
announcements << topic
else
topics << topic
end
end
[topics, announcements]
end
def convert_topic(cc_doc, meta_doc, mig_id = nil)
topic = {}
topic["description"] = get_node_val(cc_doc, "text")
topic["title"] = get_node_val(cc_doc, "title")
topic["migration_id"] = mig_id
if meta_doc
topic["migration_id"] = get_node_val(meta_doc, "topic_id")
topic["title"] = get_node_val(meta_doc, "title")
topic["type"] = get_node_val(meta_doc, "type")
topic["discussion_type"] = get_node_val(meta_doc, "discussion_type")
topic["pinned"] = get_bool_val(meta_doc, "pinned")
topic["require_initial_post"] = get_bool_val(meta_doc, "require_initial_post")
topic["external_feed_migration_id"] = get_node_val(meta_doc, "external_feed_identifierref")
topic["attachment_migration_id"] = get_node_val(meta_doc, "attachment_identifierref")
topic["posted_at"] = get_time_val(meta_doc, "posted_at")
topic["delayed_post_at"] = get_time_val(meta_doc, "delayed_post_at")
topic["lock_at"] = get_time_val(meta_doc, "lock_at")
topic["position"] = get_int_val(meta_doc, "position")
wf_state = get_node_val(meta_doc, "workflow_state")
topic["workflow_state"] = wf_state if wf_state.present?
topic["group_category"] = get_node_val(meta_doc, "group_category")
topic["todo_date"] = get_time_val(meta_doc, "todo_date")
%w[has_group_category allow_rating only_graders_can_rate sort_by_rating locked is_anonymous_author].each do |setting|
get_bool_val(meta_doc, setting).tap { |val| topic[setting] = val unless val.nil? }
end
if (asmnt_node = meta_doc.at_css("assignment"))
topic["assignment"] = parse_canvas_assignment_data(asmnt_node)
end
topic["anonymous_state"] = get_node_val(meta_doc, "anonymous_state")
if @is_discussion_checkpoints_enabled && (val = get_int_val(meta_doc, "reply_to_entry_required_count"))
topic["reply_to_entry_required_count"] = val
end
end
topic
end
end
end