moodle2cc 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +37 -29
- data/lib/moodle2cc.rb +2 -0
- data/lib/moodle2cc/canvas_cc/assignment_writer.rb +2 -1
- data/lib/moodle2cc/canvas_cc/models/assessment.rb +14 -4
- data/lib/moodle2cc/canvas_cc/models/assignment.rb +1 -1
- data/lib/moodle2cc/canvas_cc/models/course.rb +7 -1
- data/lib/moodle2cc/canvas_cc/models/page.rb +5 -1
- data/lib/moodle2cc/canvas_cc/models/question.rb +3 -3
- data/lib/moodle2cc/canvas_cc/multiple_answers_question_writer.rb +40 -0
- data/lib/moodle2cc/canvas_cc/question_writer.rb +1 -0
- data/lib/moodle2cc/moodle2/extractor.rb +23 -0
- data/lib/moodle2cc/moodle2/models.rb +5 -1
- data/lib/moodle2cc/moodle2/models/choice.rb +12 -0
- data/lib/moodle2cc/moodle2/models/course.rb +8 -3
- data/lib/moodle2cc/moodle2/models/feedback.rb +15 -0
- data/lib/moodle2cc/moodle2/models/label.rb +66 -0
- data/lib/moodle2cc/moodle2/models/questionnaire.rb +19 -0
- data/lib/moodle2cc/moodle2/parsers.rb +3 -0
- data/lib/moodle2cc/moodle2/parsers/choice_parser.rb +52 -0
- data/lib/moodle2cc/moodle2/parsers/course_parser.rb +2 -0
- data/lib/moodle2cc/moodle2/parsers/feedback_parser.rb +54 -0
- data/lib/moodle2cc/moodle2/parsers/questionnaire_parser.rb +58 -0
- data/lib/moodle2cc/moodle2converter/assessment_converter.rb +37 -1
- data/lib/moodle2cc/moodle2converter/assignment_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/book_converter.rb +1 -0
- data/lib/moodle2cc/moodle2converter/converter_helper.rb +7 -1
- data/lib/moodle2cc/moodle2converter/feedback_converter.rb +70 -0
- data/lib/moodle2cc/moodle2converter/folder_converter.rb +2 -1
- data/lib/moodle2cc/moodle2converter/glossary_converter.rb +3 -3
- data/lib/moodle2cc/moodle2converter/label_converter.rb +39 -0
- data/lib/moodle2cc/moodle2converter/migrator.rb +17 -3
- data/lib/moodle2cc/moodle2converter/question_converters/question_converter.rb +4 -1
- data/lib/moodle2cc/moodle2converter/questionnaire_converter.rb +58 -0
- data/lib/moodle2cc/moodle2converter/section_converter.rb +4 -3
- data/lib/moodle2cc/version.rb +1 -1
- data/spec/moodle2cc/canvas_cc/assignment_writer_spec.rb +2 -0
- data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +25 -18
- data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +47 -0
- data/spec/moodle2cc/moodle2/extractor_spec.rb +24 -0
- data/spec/moodle2cc/moodle2/models/label_spec.rb +71 -0
- data/spec/moodle2cc/moodle2/parsers/choice_parser_spec.rb +32 -0
- data/spec/moodle2cc/moodle2/parsers/course_parser_spec.rb +1 -0
- data/spec/moodle2cc/moodle2/parsers/feedback_parser_spec.rb +31 -0
- data/spec/moodle2cc/moodle2/parsers/questionnaire_parser_spec.rb +32 -0
- data/spec/moodle2cc/moodle2converter/assessment_converter_spec.rb +158 -3
- data/spec/moodle2cc/moodle2converter/converter_helper_spec.rb +24 -0
- data/spec/moodle2cc/moodle2converter/folder_converter_spec.rb +2 -0
- data/spec/moodle2cc/moodle2converter/glossary_converter_spec.rb +2 -3
- data/spec/moodle2cc/moodle2converter/label_converter_spec.rb +86 -0
- data/spec/moodle2cc/moodle2converter/migrator_spec.rb +2 -0
- data/spec/moodle2cc/moodle2converter/question_bank_converter_spec.rb +2 -2
- data/spec/moodle2cc/moodle2converter/question_converters/calculated_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/matching_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/multiple_blanks_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/numerical_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/question_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/true_false_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/section_converter_spec.rb +7 -22
- data/test/fixtures/moodle2/backup/activities/choice_56547/calendar.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/choice.xml +32 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/comments.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/completion.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/filters.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/grades.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/inforef.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/module.xml +28 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/roles.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/feedback.xml +147 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/filters.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/grades.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/inforef.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/module.xml +28 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/roles.xml +7 -0
- data/test/fixtures/moodle2/backup/moodle_backup.xml +14 -0
- metadata +52 -2
@@ -0,0 +1,19 @@
|
|
1
|
+
module Moodle2CC::Moodle2::Models
|
2
|
+
class Questionnaire
|
3
|
+
|
4
|
+
attr_accessor :id, :module_id, :name, :intro, :intro_format, :open_date, :close_date,
|
5
|
+
:time_modified, :questions, :visible
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@questions = []
|
9
|
+
end
|
10
|
+
|
11
|
+
class Question
|
12
|
+
attr_accessor :id, :name, :type_id, :content, :position, :deleted, :choices
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@choices = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,12 +2,15 @@ module Moodle2CC::Moodle2::Parsers
|
|
2
2
|
require_relative 'parsers/parser_helper'
|
3
3
|
require_relative 'parsers/assignment_parser'
|
4
4
|
require_relative 'parsers/book_parser'
|
5
|
+
require_relative 'parsers/choice_parser'
|
5
6
|
require_relative 'parsers/course_parser'
|
7
|
+
require_relative 'parsers/feedback_parser'
|
6
8
|
require_relative 'parsers/file_parser'
|
7
9
|
require_relative 'parsers/folder_parser'
|
8
10
|
require_relative 'parsers/forum_parser'
|
9
11
|
require_relative 'parsers/page_parser'
|
10
12
|
require_relative 'parsers/question_category_parser'
|
13
|
+
require_relative 'parsers/questionnaire_parser'
|
11
14
|
require_relative 'parsers/quiz_parser'
|
12
15
|
require_relative 'parsers/section_parser'
|
13
16
|
require_relative 'parsers/question_parsers'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Moodle2CC::Moodle2::Parsers
|
2
|
+
class ChoiceParser
|
3
|
+
include ParserHelper
|
4
|
+
|
5
|
+
CHOICE_XML = 'choice.xml'
|
6
|
+
CHOICE_MODULE_NAME = 'choice'
|
7
|
+
|
8
|
+
def initialize(backup_dir)
|
9
|
+
@backup_dir = backup_dir
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse
|
13
|
+
activity_dirs = activity_directories(@backup_dir, CHOICE_MODULE_NAME)
|
14
|
+
activity_dirs.map { |dir| parse_choice(dir) }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse_choice(dir)
|
20
|
+
choice = Moodle2CC::Moodle2::Models::Choice.new
|
21
|
+
activity_dir = File.join(@backup_dir, dir)
|
22
|
+
File.open(File.join(activity_dir, CHOICE_XML)) do |f|
|
23
|
+
xml = Nokogiri::XML(f)
|
24
|
+
choice.id = xml.at_xpath('/activity/choice/@id').value
|
25
|
+
choice.module_id = xml.at_xpath('/activity/@moduleid').value
|
26
|
+
choice.name = parse_text(xml, '/activity/choice/name')
|
27
|
+
choice.intro = parse_text(xml, '/activity/choice/intro')
|
28
|
+
choice.intro_format = parse_text(xml, '/activity/choice/introformat')
|
29
|
+
|
30
|
+
choice.time_open = parse_text(xml, '/activity/choice/timeopen')
|
31
|
+
choice.time_close = parse_text(xml, '/activity/choice/timeclose')
|
32
|
+
choice.time_modified = parse_text(xml, '/activity/choice/timemodified')
|
33
|
+
|
34
|
+
choice.publish = parse_text(xml, '/activity/choice/publish')
|
35
|
+
choice.show_results = parse_text(xml, '/activity/choice/showresults')
|
36
|
+
choice.display = parse_text(xml, '/activity/choice/display')
|
37
|
+
choice.allow_update = parse_text(xml, '/activity/choice/allowupdate')
|
38
|
+
choice.show_unanswered = parse_text(xml, '/activity/choice/showunanswered')
|
39
|
+
choice.limit_answers = parse_text(xml, '/activity/choice/limitanswers')
|
40
|
+
choice.completion_submit = parse_text(xml, '/activity/choice/completionsubmit')
|
41
|
+
|
42
|
+
xml.search('/activity/choice/options/option').each do |node|
|
43
|
+
choice.options << parse_text(node, 'text')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
parse_module(activity_dir, choice)
|
47
|
+
|
48
|
+
choice
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Moodle2CC::Moodle2::Parsers
|
2
2
|
class CourseParser
|
3
|
+
include ParserHelper
|
3
4
|
|
4
5
|
COURSE_XML_PATH = 'course/course.xml'
|
5
6
|
|
@@ -16,6 +17,7 @@ module Moodle2CC::Moodle2::Parsers
|
|
16
17
|
course.fullname = course_doc.at_xpath('/course/fullname').text
|
17
18
|
course.shortname = course_doc.at_xpath('/course/shortname').text
|
18
19
|
course.summary = course_doc.at_xpath('/course/summary').text
|
20
|
+
course.show_grades = parse_boolean(course_doc, '/course/showgrades')
|
19
21
|
if unix_start_date = course_doc.at_xpath('/course/startdate').text
|
20
22
|
course.startdate = Time.at(unix_start_date.to_i)
|
21
23
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Moodle2CC::Moodle2::Parsers
|
2
|
+
class FeedbackParser
|
3
|
+
include ParserHelper
|
4
|
+
|
5
|
+
FEEDBACK_XML = 'feedback.xml'
|
6
|
+
FEEDBACK_MODULE_NAME = 'feedback'
|
7
|
+
|
8
|
+
def initialize(backup_dir)
|
9
|
+
@backup_dir = backup_dir
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse
|
13
|
+
activity_dirs = activity_directories(@backup_dir, FEEDBACK_MODULE_NAME)
|
14
|
+
activity_dirs.map { |dir| parse_feedback(dir) }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse_feedback(dir)
|
20
|
+
feedback = Moodle2CC::Moodle2::Models::Feedback.new
|
21
|
+
activity_dir = File.join(@backup_dir, dir)
|
22
|
+
|
23
|
+
File.open(File.join(activity_dir, FEEDBACK_XML)) do |f|
|
24
|
+
xml = Nokogiri::XML(f)
|
25
|
+
feedback.id = xml.at_xpath('/activity/feedback/@id').value
|
26
|
+
feedback.module_id = xml.at_xpath('/activity/@moduleid').value
|
27
|
+
feedback.name = parse_text(xml, '/activity/feedback/name')
|
28
|
+
feedback.intro = parse_text(xml, '/activity/feedback/intro')
|
29
|
+
feedback.intro_format = parse_text(xml, '/activity/feedback/introformat')
|
30
|
+
|
31
|
+
feedback.time_open = parse_text(xml, '/activity/feedback/timeopen')
|
32
|
+
feedback.time_close = parse_text(xml, '/activity/feedback/timeclose')
|
33
|
+
feedback.time_modified = parse_text(xml, '/activity/feedback/timemodified')
|
34
|
+
|
35
|
+
xml.search('/activity/feedback/items/item').each do |node|
|
36
|
+
item = Moodle2CC::Moodle2::Models::Feedback::Question.new
|
37
|
+
item.id = node.attributes['id'].value
|
38
|
+
item.name = parse_text(node, 'name')
|
39
|
+
item.label = parse_text(node, 'label')
|
40
|
+
item.type = parse_text(node, 'typ')
|
41
|
+
item.position = parse_text(node, 'position')
|
42
|
+
item.presentation = parse_text(node, 'presentation')
|
43
|
+
|
44
|
+
feedback.items << item
|
45
|
+
end
|
46
|
+
feedback.items.sort_by!{|q| q.position.to_i}
|
47
|
+
end
|
48
|
+
parse_module(activity_dir, feedback)
|
49
|
+
|
50
|
+
feedback
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Moodle2CC::Moodle2::Parsers
|
2
|
+
class QuestionnaireParser
|
3
|
+
include ParserHelper
|
4
|
+
|
5
|
+
QUESTIONNAIRE_XML = 'questionnaire.xml'
|
6
|
+
QUESTIONNAIRE_MODULE_NAME = 'questionnaire'
|
7
|
+
|
8
|
+
def initialize(backup_dir)
|
9
|
+
@backup_dir = backup_dir
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse
|
13
|
+
activity_dirs = activity_directories(@backup_dir, QUESTIONNAIRE_MODULE_NAME)
|
14
|
+
activity_dirs.map { |dir| parse_questionnaire(dir) }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse_questionnaire(dir)
|
20
|
+
questionnaire = Moodle2CC::Moodle2::Models::Questionnaire.new
|
21
|
+
activity_dir = File.join(@backup_dir, dir)
|
22
|
+
|
23
|
+
File.open(File.join(activity_dir, QUESTIONNAIRE_XML)) do |f|
|
24
|
+
xml = Nokogiri::XML(f)
|
25
|
+
questionnaire.id = xml.at_xpath('/activity/questionnaire/@id').value
|
26
|
+
questionnaire.module_id = xml.at_xpath('/activity/@moduleid').value
|
27
|
+
questionnaire.name = parse_text(xml, '/activity/questionnaire/name')
|
28
|
+
questionnaire.intro = parse_text(xml, '/activity/questionnaire/intro')
|
29
|
+
questionnaire.intro_format = parse_text(xml, '/activity/questionnaire/introformat')
|
30
|
+
|
31
|
+
questionnaire.open_date = parse_text(xml, '/activity/questionnaire/opendate')
|
32
|
+
questionnaire.close_date = parse_text(xml, '/activity/questionnaire/closedate')
|
33
|
+
questionnaire.time_modified = parse_text(xml, '/activity/questionnaire/timemodified')
|
34
|
+
|
35
|
+
xml.search('/activity/questionnaire/surveys/survey/questions/question').each do |node|
|
36
|
+
question = Moodle2CC::Moodle2::Models::Questionnaire::Question.new
|
37
|
+
question.id = node.attributes['id'].value
|
38
|
+
question.name = parse_text(node, 'name')
|
39
|
+
question.type_id = parse_text(node, 'type_id')
|
40
|
+
question.position = parse_text(node, 'position')
|
41
|
+
question.content = parse_text(node, 'content')
|
42
|
+
node.search('quest_choices/quest_choice').each do |choice_node|
|
43
|
+
question.choices << {
|
44
|
+
:id => choice_node.attributes['id'].value,
|
45
|
+
:content => parse_text(choice_node, 'content')
|
46
|
+
}
|
47
|
+
end
|
48
|
+
questionnaire.questions << question
|
49
|
+
end
|
50
|
+
questionnaire.questions.sort_by!{|q| q.position.to_i}
|
51
|
+
end
|
52
|
+
parse_module(activity_dir, questionnaire)
|
53
|
+
|
54
|
+
questionnaire
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -1,8 +1,14 @@
|
|
1
|
+
require_relative 'feedback_converter'
|
2
|
+
require_relative 'questionnaire_converter'
|
3
|
+
|
1
4
|
module Moodle2CC::Moodle2Converter
|
2
5
|
class AssessmentConverter
|
3
6
|
include ConverterHelper
|
4
7
|
|
5
|
-
|
8
|
+
include FeedbackConverter
|
9
|
+
include QuestionnaireConverter
|
10
|
+
|
11
|
+
def convert_quiz(moodle_quiz)
|
6
12
|
canvas_assessment = Moodle2CC::CanvasCC::Models::Assessment.new
|
7
13
|
canvas_assessment.identifier = generate_unique_identifier_for(moodle_quiz.id, ASSESSMENT_SUFFIX)
|
8
14
|
canvas_assessment.title = moodle_quiz.name
|
@@ -27,5 +33,35 @@ module Moodle2CC::Moodle2Converter
|
|
27
33
|
canvas_assessment
|
28
34
|
end
|
29
35
|
|
36
|
+
def convert_choice(moodle_choice)
|
37
|
+
canvas_assessment = Moodle2CC::CanvasCC::Models::Assessment.new
|
38
|
+
canvas_assessment.identifier = generate_unique_identifier_for(moodle_choice.id, CHOICE_ASSESSMENT_SUFFIX)
|
39
|
+
canvas_assessment.title = moodle_choice.name
|
40
|
+
canvas_assessment.description = ''
|
41
|
+
canvas_assessment.workflow_state = workflow_state(moodle_choice.visible)
|
42
|
+
|
43
|
+
canvas_assessment.lock_at = Time.at(Integer(moodle_choice.time_close)) if moodle_choice.time_close
|
44
|
+
canvas_assessment.unlock_at = Time.at(Integer(moodle_choice.time_open)) if moodle_choice.time_open
|
45
|
+
|
46
|
+
canvas_assessment.allowed_attempts = moodle_choice.completion_submit.to_i == 1 ? 1 : -1
|
47
|
+
canvas_assessment.scoring_policy = 'keep_latest'
|
48
|
+
canvas_assessment.quiz_type = 'survey'
|
49
|
+
|
50
|
+
question = Moodle2CC::CanvasCC::Models::Question.create('multiple_choice_question')
|
51
|
+
question.identifier = generate_unique_identifier_for(moodle_choice.id, '_choice_question')
|
52
|
+
question.title = moodle_choice.name
|
53
|
+
question.material = moodle_choice.intro
|
54
|
+
question.answers = []
|
55
|
+
moodle_choice.options.each_with_index do |option, num|
|
56
|
+
answer = Moodle2CC::CanvasCC::Models::Answer.new
|
57
|
+
answer.id = generate_unique_identifier_for(moodle_choice.id, "_choice_answer#{num + 1}")
|
58
|
+
answer.answer_text = option
|
59
|
+
question.answers << answer
|
60
|
+
end
|
61
|
+
|
62
|
+
canvas_assessment.items = [question]
|
63
|
+
canvas_assessment
|
64
|
+
end
|
65
|
+
|
30
66
|
end
|
31
67
|
end
|
@@ -14,7 +14,7 @@ module Moodle2CC::Moodle2Converter
|
|
14
14
|
canvas_assignment.points_possible = moodle_assignment.grade
|
15
15
|
canvas_assignment.grading_type = 'points'
|
16
16
|
canvas_assignment.submission_types << 'online_text_entry' if moodle_assignment.online_text_submission == '1'
|
17
|
-
canvas_assignment.submission_types
|
17
|
+
canvas_assignment.submission_types << 'online_upload' if moodle_assignment.file_submission == '1'
|
18
18
|
|
19
19
|
canvas_assignment
|
20
20
|
end
|
@@ -5,6 +5,9 @@ module Moodle2CC
|
|
5
5
|
FOLDER_SUFFIX = '_folder'
|
6
6
|
PAGE_SUFFIX = '_page'
|
7
7
|
ASSESSMENT_SUFFIX = '_assessment'
|
8
|
+
CHOICE_ASSESSMENT_SUFFIX = '_choice_assessment'
|
9
|
+
FEEDBACK_ASSESSMENT_SUFFIX = '_feedback_assessment'
|
10
|
+
QUESTIONNAIRE_ASSESSMENT_SUFFIX = '_questionnaire_assessment'
|
8
11
|
ASSIGNMENT_SUFFIX = '_assignment'
|
9
12
|
COURSE_SUFFIX = '_course'
|
10
13
|
DISCUSSION_SUFFIX = '_discussion'
|
@@ -22,6 +25,9 @@ module Moodle2CC
|
|
22
25
|
Moodle2::Models::Forum => {suffix: DISCUSSION_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_DISCUSSION_TOPIC},
|
23
26
|
Moodle2::Models::BookChapter => {suffix: CHAPTER_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_WIKI_PAGE},
|
24
27
|
Moodle2::Models::Quizzes::Quiz => {suffix: ASSESSMENT_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_QUIZ},
|
28
|
+
Moodle2::Models::Choice => {suffix: CHOICE_ASSESSMENT_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_QUIZ},
|
29
|
+
Moodle2::Models::Feedback => {suffix: FEEDBACK_ASSESSMENT_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_QUIZ},
|
30
|
+
Moodle2::Models::Questionnaire => {suffix: QUESTIONNAIRE_ASSESSMENT_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_QUIZ},
|
25
31
|
Moodle2::Models::Section => {suffix: SUMMARY_PAGE_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_WIKI_PAGE},
|
26
32
|
Moodle2::Models::Label => {suffix: nil, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_CONTEXT_MODULE_SUB_HEADER},
|
27
33
|
Moodle2::Models::Glossary => {suffix: GLOSSARY_SUFFIX, content_type: CanvasCC::Models::ModuleItem::CONTENT_TYPE_WIKI_PAGE},
|
@@ -30,7 +36,7 @@ module Moodle2CC
|
|
30
36
|
}
|
31
37
|
|
32
38
|
def generate_unique_resource_path(base_path, readable_name, file_extension = 'html')
|
33
|
-
file_name_suffix = readable_name ?
|
39
|
+
file_name_suffix = readable_name ? Moodle2CC::CanvasCC::Models::Page.convert_name_to_url(readable_name) : ''
|
34
40
|
ext = file_extension ? ".#{file_extension}" : ''
|
35
41
|
File.join(base_path, generate_unique_identifier(), "#{file_name_suffix}#{ext}")
|
36
42
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Moodle2CC::Moodle2Converter
|
2
|
+
module FeedbackConverter
|
3
|
+
include ConverterHelper
|
4
|
+
|
5
|
+
def convert_feedback(moodle_feedback)
|
6
|
+
canvas_assessment = Moodle2CC::CanvasCC::Models::Assessment.new
|
7
|
+
canvas_assessment.identifier = generate_unique_identifier_for(moodle_feedback.id, FEEDBACK_ASSESSMENT_SUFFIX)
|
8
|
+
canvas_assessment.title = moodle_feedback.name
|
9
|
+
canvas_assessment.description = moodle_feedback.intro
|
10
|
+
canvas_assessment.workflow_state = workflow_state(moodle_feedback.visible)
|
11
|
+
|
12
|
+
canvas_assessment.lock_at = Time.at(Integer(moodle_feedback.time_close)) if moodle_feedback.time_close
|
13
|
+
canvas_assessment.unlock_at = Time.at(Integer(moodle_feedback.time_open)) if moodle_feedback.time_open
|
14
|
+
|
15
|
+
canvas_assessment.scoring_policy = 'keep_latest'
|
16
|
+
canvas_assessment.quiz_type = 'survey'
|
17
|
+
|
18
|
+
canvas_assessment.items = []
|
19
|
+
moodle_feedback.items.each do |item|
|
20
|
+
if canvas_question = convert_feedback_question(item)
|
21
|
+
canvas_assessment.items << canvas_question
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
canvas_assessment
|
26
|
+
end
|
27
|
+
|
28
|
+
QUESTION_TYPE_MAP = {
|
29
|
+
'label' => 'text_only_question',
|
30
|
+
'textarea' => 'essay_question',
|
31
|
+
'multichoice' => 'multiple_choice_question',
|
32
|
+
'multichoicerated' => 'multiple_choice_question',
|
33
|
+
'numeric' => 'numerical_question',
|
34
|
+
'textfield' => 'short_answer_question'
|
35
|
+
}
|
36
|
+
|
37
|
+
def convert_feedback_question(moodle_question)
|
38
|
+
return unless canvas_type = QUESTION_TYPE_MAP[moodle_question.type]
|
39
|
+
|
40
|
+
canvas_question = Moodle2CC::CanvasCC::Models::Question.create(canvas_type)
|
41
|
+
canvas_question.identifier = generate_unique_identifier_for(moodle_question.id, "_feedback_question")
|
42
|
+
if moodle_question.type == 'label'
|
43
|
+
canvas_question.title = moodle_question.name
|
44
|
+
canvas_question.material = moodle_question.presentation
|
45
|
+
else
|
46
|
+
canvas_question.title = moodle_question.label
|
47
|
+
canvas_question.material = moodle_question.name
|
48
|
+
end
|
49
|
+
|
50
|
+
if ['multichoice', 'multichoicerated'].include?(moodle_question.type)
|
51
|
+
choices = moodle_question.presentation.to_s.sub('r>>>>>', '').split("\\n").map do |c|
|
52
|
+
c = c.strip
|
53
|
+
c = c.sub('|', '') if c.start_with?('|')
|
54
|
+
if moodle_question.type == 'multichoicerated' && c =~ /(\d+)\#\#\#\#(.*)/
|
55
|
+
c = "[#{$1}] #{$2}"
|
56
|
+
end
|
57
|
+
c
|
58
|
+
end
|
59
|
+
|
60
|
+
choices.each_with_index do |choice, num|
|
61
|
+
answer = Moodle2CC::CanvasCC::Models::Answer.new
|
62
|
+
answer.id = generate_unique_identifier_for(moodle_question.id, "_answer#{num + 1}")
|
63
|
+
answer.answer_text = choice
|
64
|
+
canvas_question.answers << answer
|
65
|
+
end
|
66
|
+
end
|
67
|
+
canvas_question
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -24,7 +24,8 @@ module Moodle2CC::Moodle2Converter
|
|
24
24
|
|
25
25
|
def generate_body(moodle_folder)
|
26
26
|
files = sort_files(parse_files_from_course(moodle_folder))
|
27
|
-
html =
|
27
|
+
html = moodle_folder.intro.to_s
|
28
|
+
html += "<ul>\n"
|
28
29
|
files.each do |f|
|
29
30
|
#create a moodle style link that will be replaced in the html converter
|
30
31
|
link = "<a href=\"@@PLUGINFILE@@#{f.file_path}#{f.file_name}\">#{f.file_path[1..-1]}#{f.file_name}</a>"
|
@@ -25,9 +25,9 @@ module Moodle2CC::Moodle2Converter
|
|
25
25
|
|
26
26
|
def generate_body(moodle_glossary)
|
27
27
|
html = "<h2>#{moodle_glossary.name}</h2>"
|
28
|
-
html += '<
|
29
|
-
moodle_glossary.entries.each { |entry| html += "<
|
30
|
-
html += '</
|
28
|
+
html += '<dl>'
|
29
|
+
moodle_glossary.entries.each { |entry| html += "<dt>#{entry.concept}</dt><dd>#{entry.definition}</dd>" }
|
30
|
+
html += '</dl>'
|
31
31
|
html
|
32
32
|
end
|
33
33
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Moodle2CC
|
2
|
+
class Moodle2Converter::LabelConverter
|
3
|
+
include Moodle2Converter::ConverterHelper
|
4
|
+
|
5
|
+
def convert_to_module_items(moodle_label)
|
6
|
+
return [] unless moodle_label.convert_to_page? || moodle_label.convert_to_header?
|
7
|
+
module_item = CanvasCC::Models::ModuleItem.new
|
8
|
+
module_item.identifier = generate_unique_identifier
|
9
|
+
module_item.workflow_state = workflow_state(moodle_label.visible)
|
10
|
+
module_item.title = moodle_label.converted_title
|
11
|
+
module_item.indent = '0'
|
12
|
+
|
13
|
+
if moodle_label.convert_to_page?
|
14
|
+
module_item.identifierref = generate_unique_identifier_for_activity(moodle_label)
|
15
|
+
module_item.content_type = CanvasCC::Models::ModuleItem::CONTENT_TYPE_WIKI_PAGE
|
16
|
+
elsif moodle_label.convert_to_header?
|
17
|
+
module_item.content_type = CanvasCC::Models::ModuleItem::CONTENT_TYPE_CONTEXT_MODULE_SUB_HEADER
|
18
|
+
end
|
19
|
+
|
20
|
+
[module_item]
|
21
|
+
end
|
22
|
+
|
23
|
+
def convert_to_pages(moodle_label)
|
24
|
+
pages = []
|
25
|
+
if moodle_label.convert_to_page?
|
26
|
+
canvas_page = CanvasCC::Models::Page.new
|
27
|
+
canvas_page.identifier = generate_unique_identifier_for_activity(moodle_label)
|
28
|
+
canvas_page.title = moodle_label.converted_title
|
29
|
+
canvas_page.workflow_state = workflow_state(moodle_label.visible)
|
30
|
+
canvas_page.editing_roles = CanvasCC::Models::Page::EDITING_ROLE_TEACHER
|
31
|
+
canvas_page.body = moodle_label.intro
|
32
|
+
canvas_page.href = generate_unique_resource_path(CanvasCC::Models::Page::WIKI_CONTENT,
|
33
|
+
Moodle2CC::CanvasCC::Models::Page.convert_name_to_url(canvas_page.title))
|
34
|
+
pages << canvas_page
|
35
|
+
end
|
36
|
+
pages
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|