moodle2cc 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +37 -29
  3. data/lib/moodle2cc.rb +2 -0
  4. data/lib/moodle2cc/canvas_cc/assignment_writer.rb +2 -1
  5. data/lib/moodle2cc/canvas_cc/models/assessment.rb +14 -4
  6. data/lib/moodle2cc/canvas_cc/models/assignment.rb +1 -1
  7. data/lib/moodle2cc/canvas_cc/models/course.rb +7 -1
  8. data/lib/moodle2cc/canvas_cc/models/page.rb +5 -1
  9. data/lib/moodle2cc/canvas_cc/models/question.rb +3 -3
  10. data/lib/moodle2cc/canvas_cc/multiple_answers_question_writer.rb +40 -0
  11. data/lib/moodle2cc/canvas_cc/question_writer.rb +1 -0
  12. data/lib/moodle2cc/moodle2/extractor.rb +23 -0
  13. data/lib/moodle2cc/moodle2/models.rb +5 -1
  14. data/lib/moodle2cc/moodle2/models/choice.rb +12 -0
  15. data/lib/moodle2cc/moodle2/models/course.rb +8 -3
  16. data/lib/moodle2cc/moodle2/models/feedback.rb +15 -0
  17. data/lib/moodle2cc/moodle2/models/label.rb +66 -0
  18. data/lib/moodle2cc/moodle2/models/questionnaire.rb +19 -0
  19. data/lib/moodle2cc/moodle2/parsers.rb +3 -0
  20. data/lib/moodle2cc/moodle2/parsers/choice_parser.rb +52 -0
  21. data/lib/moodle2cc/moodle2/parsers/course_parser.rb +2 -0
  22. data/lib/moodle2cc/moodle2/parsers/feedback_parser.rb +54 -0
  23. data/lib/moodle2cc/moodle2/parsers/questionnaire_parser.rb +58 -0
  24. data/lib/moodle2cc/moodle2converter/assessment_converter.rb +37 -1
  25. data/lib/moodle2cc/moodle2converter/assignment_converter.rb +1 -1
  26. data/lib/moodle2cc/moodle2converter/book_converter.rb +1 -0
  27. data/lib/moodle2cc/moodle2converter/converter_helper.rb +7 -1
  28. data/lib/moodle2cc/moodle2converter/feedback_converter.rb +70 -0
  29. data/lib/moodle2cc/moodle2converter/folder_converter.rb +2 -1
  30. data/lib/moodle2cc/moodle2converter/glossary_converter.rb +3 -3
  31. data/lib/moodle2cc/moodle2converter/label_converter.rb +39 -0
  32. data/lib/moodle2cc/moodle2converter/migrator.rb +17 -3
  33. data/lib/moodle2cc/moodle2converter/question_converters/question_converter.rb +4 -1
  34. data/lib/moodle2cc/moodle2converter/questionnaire_converter.rb +58 -0
  35. data/lib/moodle2cc/moodle2converter/section_converter.rb +4 -3
  36. data/lib/moodle2cc/version.rb +1 -1
  37. data/spec/moodle2cc/canvas_cc/assignment_writer_spec.rb +2 -0
  38. data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +25 -18
  39. data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +47 -0
  40. data/spec/moodle2cc/moodle2/extractor_spec.rb +24 -0
  41. data/spec/moodle2cc/moodle2/models/label_spec.rb +71 -0
  42. data/spec/moodle2cc/moodle2/parsers/choice_parser_spec.rb +32 -0
  43. data/spec/moodle2cc/moodle2/parsers/course_parser_spec.rb +1 -0
  44. data/spec/moodle2cc/moodle2/parsers/feedback_parser_spec.rb +31 -0
  45. data/spec/moodle2cc/moodle2/parsers/questionnaire_parser_spec.rb +32 -0
  46. data/spec/moodle2cc/moodle2converter/assessment_converter_spec.rb +158 -3
  47. data/spec/moodle2cc/moodle2converter/converter_helper_spec.rb +24 -0
  48. data/spec/moodle2cc/moodle2converter/folder_converter_spec.rb +2 -0
  49. data/spec/moodle2cc/moodle2converter/glossary_converter_spec.rb +2 -3
  50. data/spec/moodle2cc/moodle2converter/label_converter_spec.rb +86 -0
  51. data/spec/moodle2cc/moodle2converter/migrator_spec.rb +2 -0
  52. data/spec/moodle2cc/moodle2converter/question_bank_converter_spec.rb +2 -2
  53. data/spec/moodle2cc/moodle2converter/question_converters/calculated_converter_spec.rb +1 -1
  54. data/spec/moodle2cc/moodle2converter/question_converters/matching_converter_spec.rb +1 -1
  55. data/spec/moodle2cc/moodle2converter/question_converters/multiple_blanks_converter_spec.rb +1 -1
  56. data/spec/moodle2cc/moodle2converter/question_converters/numerical_converter_spec.rb +1 -1
  57. data/spec/moodle2cc/moodle2converter/question_converters/question_converter_spec.rb +1 -1
  58. data/spec/moodle2cc/moodle2converter/question_converters/true_false_converter_spec.rb +1 -1
  59. data/spec/moodle2cc/moodle2converter/section_converter_spec.rb +7 -22
  60. data/test/fixtures/moodle2/backup/activities/choice_56547/calendar.xml +3 -0
  61. data/test/fixtures/moodle2/backup/activities/choice_56547/choice.xml +32 -0
  62. data/test/fixtures/moodle2/backup/activities/choice_56547/comments.xml +3 -0
  63. data/test/fixtures/moodle2/backup/activities/choice_56547/completion.xml +3 -0
  64. data/test/fixtures/moodle2/backup/activities/choice_56547/filters.xml +7 -0
  65. data/test/fixtures/moodle2/backup/activities/choice_56547/grades.xml +7 -0
  66. data/test/fixtures/moodle2/backup/activities/choice_56547/inforef.xml +3 -0
  67. data/test/fixtures/moodle2/backup/activities/choice_56547/module.xml +28 -0
  68. data/test/fixtures/moodle2/backup/activities/choice_56547/roles.xml +7 -0
  69. data/test/fixtures/moodle2/backup/activities/feedback_58588/feedback.xml +147 -0
  70. data/test/fixtures/moodle2/backup/activities/feedback_58588/filters.xml +7 -0
  71. data/test/fixtures/moodle2/backup/activities/feedback_58588/grades.xml +7 -0
  72. data/test/fixtures/moodle2/backup/activities/feedback_58588/inforef.xml +3 -0
  73. data/test/fixtures/moodle2/backup/activities/feedback_58588/module.xml +28 -0
  74. data/test/fixtures/moodle2/backup/activities/feedback_58588/roles.xml +7 -0
  75. data/test/fixtures/moodle2/backup/moodle_backup.xml +14 -0
  76. 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
- def convert(moodle_quiz)
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 += %w(online_url online_upload) if moodle_assignment.file_submission == '1'
17
+ canvas_assignment.submission_types << 'online_upload' if moodle_assignment.file_submission == '1'
18
18
 
19
19
  canvas_assignment
20
20
  end
@@ -26,6 +26,7 @@ module Moodle2CC
26
26
  if pages.any?{|p| page.title == p.title}
27
27
  page.title = "#{page.title} (Introduction)"
28
28
  end
29
+ page.workflow_state = workflow_state(moodle_book.visible)
29
30
  pages.unshift(page)
30
31
  end
31
32
 
@@ -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 ? CGI::escape(readable_name.downcase.strip.gsub(/\s/, '-')) : ''
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 = "<ul>\n"
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 += '<table><tr><th>Concept</th><th>Definition</th></tr>'
29
- moodle_glossary.entries.each { |entry| html += "<tr><td style='padding-right:10px'>#{entry.concept}</td><td>#{entry.definition}</td></tr>" }
30
- html += '</table>'
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