moodle2cc 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
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