moodle2cc 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +7 -0
- data/lib/moodle2cc.rb +3 -0
- data/lib/moodle2cc/canvas_cc/calculated_question_writer.rb +11 -0
- data/lib/moodle2cc/canvas_cc/matching_question_writer.rb +6 -4
- data/lib/moodle2cc/canvas_cc/models/assessment.rb +1 -1
- data/lib/moodle2cc/canvas_cc/models/calculated_question.rb +13 -1
- data/lib/moodle2cc/canvas_cc/models/course.rb +2 -2
- data/lib/moodle2cc/canvas_cc/models/multiple_dropdowns_question.rb +7 -0
- data/lib/moodle2cc/canvas_cc/models/page.rb +7 -1
- data/lib/moodle2cc/canvas_cc/models/question.rb +1 -0
- data/lib/moodle2cc/canvas_cc/multiple_answers_question_writer.rb +7 -6
- data/lib/moodle2cc/canvas_cc/multiple_dropdowns_question_writer.rb +30 -0
- data/lib/moodle2cc/canvas_cc/question_writer.rb +2 -1
- data/lib/moodle2cc/moodle2/extractor.rb +7 -0
- data/lib/moodle2cc/moodle2/models.rb +1 -1
- data/lib/moodle2cc/moodle2/models/course.rb +3 -2
- data/lib/moodle2cc/moodle2/models/label.rb +5 -5
- data/lib/moodle2cc/moodle2/models/questionnaire.rb +1 -1
- data/lib/moodle2cc/moodle2/models/quizzes.rb +1 -0
- data/lib/moodle2cc/moodle2/models/quizzes/calculated_question.rb +2 -1
- data/lib/moodle2cc/moodle2/models/quizzes/multichoice_question.rb +6 -0
- data/lib/moodle2cc/moodle2/models/quizzes/question.rb +1 -1
- data/lib/moodle2cc/moodle2/models/wiki.rb +10 -0
- data/lib/moodle2cc/moodle2/parsers.rb +1 -0
- data/lib/moodle2cc/moodle2/parsers/course_parser.rb +5 -5
- data/lib/moodle2cc/moodle2/parsers/parser_helper.rb +7 -2
- data/lib/moodle2cc/moodle2/parsers/question_parsers/calculated_parser.rb +11 -1
- data/lib/moodle2cc/moodle2/parsers/question_parsers/match_parser.rb +2 -1
- data/lib/moodle2cc/moodle2/parsers/question_parsers/multichoice_parser.rb +2 -0
- data/lib/moodle2cc/moodle2/parsers/questionnaire_parser.rb +5 -0
- data/lib/moodle2cc/moodle2/parsers/quiz_parser.rb +5 -0
- data/lib/moodle2cc/moodle2/parsers/section_parser.rb +5 -1
- data/lib/moodle2cc/moodle2/parsers/wiki_parser.rb +47 -0
- data/lib/moodle2cc/moodle2converter/assessment_converter.rb +6 -4
- data/lib/moodle2cc/moodle2converter/assignment_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/book_converter.rb +4 -4
- data/lib/moodle2cc/moodle2converter/converter_helper.rb +14 -0
- data/lib/moodle2cc/moodle2converter/discussion_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/feedback_converter.rb +3 -3
- data/lib/moodle2cc/moodle2converter/html_converter.rb +16 -1
- data/lib/moodle2cc/moodle2converter/label_converter.rb +2 -2
- data/lib/moodle2cc/moodle2converter/migrator.rb +70 -2
- data/lib/moodle2cc/moodle2converter/question_bank_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/question_converters.rb +1 -0
- data/lib/moodle2cc/moodle2converter/question_converters/calculated_converter.rb +1 -0
- data/lib/moodle2cc/moodle2converter/question_converters/matching_converter.rb +3 -0
- data/lib/moodle2cc/moodle2converter/question_converters/multichoice_converter.rb +15 -0
- data/lib/moodle2cc/moodle2converter/question_converters/multiple_blanks_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/question_converters/question_converter.rb +3 -5
- data/lib/moodle2cc/moodle2converter/questionnaire_converter.rb +44 -8
- data/lib/moodle2cc/moodle2converter/section_converter.rb +3 -3
- data/lib/moodle2cc/moodle2converter/wiki_converter.rb +37 -0
- data/lib/moodle2cc/version.rb +1 -1
- data/spec/moodle2cc/canvas_cc/calculated_question_writer_spec.rb +7 -0
- data/spec/moodle2cc/canvas_cc/matching_question_writer_spec.rb +2 -2
- data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +1 -1
- data/spec/moodle2cc/canvas_cc/models/calculated_question_spec.rb +25 -0
- data/spec/moodle2cc/canvas_cc/models/page_spec.rb +6 -0
- data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +4 -1
- data/spec/moodle2cc/canvas_cc/multiple_blanks_question_writer_spec.rb +1 -1
- data/spec/moodle2cc/canvas_cc/multiple_dropdowns_question_writer_spec.rb +46 -0
- data/spec/moodle2cc/moodle2/extractor_spec.rb +8 -0
- data/spec/moodle2cc/moodle2/models/label_spec.rb +4 -4
- data/spec/moodle2cc/moodle2/parsers/parser_helper_spec.rb +10 -0
- data/spec/moodle2cc/moodle2/parsers/question_parsers/calculated_parser_spec.rb +17 -0
- data/spec/moodle2cc/moodle2/parsers/questionnaire_parser_spec.rb +4 -0
- data/spec/moodle2cc/moodle2/parsers/quiz_parser_spec.rb +1 -1
- data/spec/moodle2cc/moodle2/parsers/wiki_parser_spec.rb +23 -0
- data/spec/moodle2cc/moodle2converter/assessment_converter_spec.rb +12 -7
- data/spec/moodle2cc/moodle2converter/converter_helper_spec.rb +5 -0
- data/spec/moodle2cc/moodle2converter/html_converter_spec.rb +7 -2
- data/spec/moodle2cc/moodle2converter/label_converter_spec.rb +17 -0
- data/spec/moodle2cc/moodle2converter/migrator_spec.rb +83 -2
- data/spec/moodle2cc/moodle2converter/question_converters/calculated_converter_spec.rb +2 -0
- data/spec/moodle2cc/moodle2converter/question_converters/matching_converter_spec.rb +2 -3
- data/spec/moodle2cc/moodle2converter/question_converters/multichoice_converter_spec.rb +26 -0
- data/spec/moodle2cc/moodle2converter/question_converters/question_converter_spec.rb +0 -3
- data/spec/moodle2cc/moodle2converter/wiki_converter_spec.rb +36 -0
- data/test/fixtures/moodle2/backup/activities/quiz_5/quiz.xml +1 -1
- data/test/fixtures/moodle2/backup/activities/wiki_58541/calendar.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/completion.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/grades.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/inforef.xml +47 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/module.xml +28 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/roles.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/wiki_58541/wiki.xml +70 -0
- data/test/fixtures/moodle2/backup/moodle_backup.xml +7 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 822f9cffd3b238adb3b971d6bf64a300c520a1fd
|
4
|
+
data.tar.gz: 9da80263ebae391337993e9163650ea8b373a754
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9047f2fab33dd05f09cdaa47681f03cedb883f544c355431a0c900ead6f343a7209bbf24c4d74e7d45a1b5d20be7f0d4827e7d7c78ab81d046e8b4351c5400d
|
7
|
+
data.tar.gz: 292b07a59bb7c6bc515039799a5bb37a7b5929c8f9af19d914dcaeccc4493adb6aaa5b50bbbd5e711f9050a6612f954b0de8db22eebc8f502c2252bac276f677
|
data/Changelog
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
2014-04-16 Version 0.2.6
|
2
|
+
* Substituting more variables in urls/file paths
|
3
|
+
* Many quiz settings fixes and quiz question improvements
|
4
|
+
* Wiki activity converted to html pages
|
5
|
+
* Better handle duplicate page names
|
6
|
+
* Better handling of long titles
|
7
|
+
|
1
8
|
2014-04-16 Version 0.2.5
|
2
9
|
* Don't default to allowing url submissions for assignments
|
3
10
|
* Long labels are converted to html pages instead of being truncated
|
data/lib/moodle2cc.rb
CHANGED
@@ -82,6 +82,7 @@ module Moodle2CC
|
|
82
82
|
autoload :MultipleAnswersQuestionWriter, 'moodle2cc/canvas_cc/multiple_answers_question_writer'
|
83
83
|
autoload :MultipleBlanksQuestionWriter, 'moodle2cc/canvas_cc/multiple_blanks_question_writer'
|
84
84
|
autoload :MultipleChoiceQuestionWriter, 'moodle2cc/canvas_cc/multiple_choice_question_writer'
|
85
|
+
autoload :MultipleDropdownsQuestionWriter, 'moodle2cc/canvas_cc/multiple_dropdowns_question_writer'
|
85
86
|
autoload :NumericalQuestionWriter, 'moodle2cc/canvas_cc/numerical_question_writer'
|
86
87
|
autoload :ShortAnswerQuestionWriter, 'moodle2cc/canvas_cc/short_answer_question_writer'
|
87
88
|
autoload :TextOnlyQuestionWriter, 'moodle2cc/canvas_cc/text_only_question_writer'
|
@@ -96,6 +97,7 @@ module Moodle2CC
|
|
96
97
|
autoload :Assessment, 'moodle2cc/canvas_cc/models/assessment'
|
97
98
|
autoload :DiscussionTopic, 'moodle2cc/canvas_cc/models/discussion_topic'
|
98
99
|
autoload :Question, 'moodle2cc/canvas_cc/models/question'
|
100
|
+
autoload :CalculatedQuestion, 'moodle2cc/canvas_cc/models/calculated_question'
|
99
101
|
autoload :Answer, 'moodle2cc/canvas_cc/models/answer'
|
100
102
|
autoload :QuestionBank, 'moodle2cc/canvas_cc/models/question_bank'
|
101
103
|
autoload :QuestionGroup, 'moodle2cc/canvas_cc/models/question_group'
|
@@ -128,5 +130,6 @@ module Moodle2CC
|
|
128
130
|
autoload :HomepageConverter, 'moodle2cc/moodle2converter/homepage_converter'
|
129
131
|
autoload :GlossaryConverter, 'moodle2cc/moodle2converter/glossary_converter'
|
130
132
|
autoload :LabelConverter, 'moodle2cc/moodle2converter/label_converter'
|
133
|
+
autoload :WikiConverter, 'moodle2cc/moodle2converter/wiki_converter'
|
131
134
|
end
|
132
135
|
end
|
@@ -53,6 +53,17 @@ module Moodle2CC::CanvasCC
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
+
|
57
|
+
calculated_node.var_sets do |var_sets_node|
|
58
|
+
question.var_sets.each do |var_set|
|
59
|
+
ident = var_set[:vars].sort.map { |k,v| v.to_s.split('.').join }.flatten.join
|
60
|
+
var_sets_node.var_set(:ident => ident) do |var_set_node|
|
61
|
+
var_set[:vars].each do |k, v|
|
62
|
+
var_set_node.var(v, :name => k)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
56
67
|
end
|
57
68
|
end
|
58
69
|
|
@@ -7,14 +7,15 @@ module Moodle2CC::CanvasCC
|
|
7
7
|
def self.write_responses(presentation_node, question)
|
8
8
|
question.matches.each do |match|
|
9
9
|
presentation_node.response_lid(:ident => "response_#{match[:id]}") do |response_node|
|
10
|
+
next unless match[:question_text].length > 0
|
10
11
|
response_node.material do |material_node|
|
11
|
-
material_node.mattext(match[:question_text], :texttype => 'text/
|
12
|
+
material_node.mattext(match[:question_text], :texttype => 'text/plain')
|
12
13
|
end
|
13
14
|
response_node.render_choice do |choice_node|
|
14
15
|
question.matches.each do |possible_match|
|
15
16
|
choice_node.response_label(:ident => possible_match[:id]) do |label_node|
|
16
17
|
label_node.material do |material_node|
|
17
|
-
material_node.mattext
|
18
|
+
material_node.mattext(possible_match[:answer_text], :texttype => 'text/plain')
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -24,8 +25,9 @@ module Moodle2CC::CanvasCC
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def self.write_response_conditions(processing_node, question)
|
27
|
-
|
28
|
-
|
28
|
+
real_matches = question.matches.select{|m| m[:question_text].length > 0}
|
29
|
+
score = 100.0 / real_matches.length.to_i
|
30
|
+
real_matches.each do |match|
|
29
31
|
processing_node.respcondition do |condition_node|
|
30
32
|
condition_node.conditionvar do |var_node|
|
31
33
|
var_node.varequal match[:id], :respident => "response_#{match[:id]}"
|
@@ -44,7 +44,7 @@ module Moodle2CC::CanvasCC::Models
|
|
44
44
|
"#{ASSESSMENT_NON_CC_FOLDER}/#{@identifier}.xml.qti"
|
45
45
|
end
|
46
46
|
|
47
|
-
def resolve_question_references(question_banks)
|
47
|
+
def resolve_question_references!(question_banks)
|
48
48
|
@items ||= []
|
49
49
|
@question_references.each do |ref|
|
50
50
|
question = nil
|
@@ -2,6 +2,18 @@ module Moodle2CC::CanvasCC::Models
|
|
2
2
|
class CalculatedQuestion < Question
|
3
3
|
register_question_type 'calculated_question'
|
4
4
|
|
5
|
-
attr_accessor :correct_answer_format, :correct_answer_length, :dataset_definitions, :tolerance
|
5
|
+
attr_accessor :correct_answer_format, :correct_answer_length, :dataset_definitions, :tolerance, :var_sets
|
6
|
+
|
7
|
+
def post_process!
|
8
|
+
@material.gsub!(/\{([\w\s]*?)\}/, '[\1]') if @material
|
9
|
+
|
10
|
+
return unless @answers
|
11
|
+
@answers.each do |answer|
|
12
|
+
if answer.answer_text
|
13
|
+
answer.answer_text.gsub!(/\{([\w\s]*?)\}/, '\1')
|
14
|
+
answer.answer_text = answer.answer_text.sub('=', '') if answer.answer_text.start_with?('=')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
6
18
|
end
|
7
19
|
end
|
@@ -38,9 +38,9 @@ module Moodle2CC::CanvasCC::Models
|
|
38
38
|
@settings[method.to_sym]
|
39
39
|
end
|
40
40
|
|
41
|
-
def resolve_question_references
|
41
|
+
def resolve_question_references!
|
42
42
|
return unless @assessments && @question_banks
|
43
|
-
@assessments.each{|a| a.resolve_question_references(@question_banks)}
|
43
|
+
@assessments.each{|a| a.resolve_question_references!(@question_banks)}
|
44
44
|
end
|
45
45
|
|
46
46
|
def mute_assignments!
|
@@ -7,6 +7,8 @@ module Moodle2CC::CanvasCC::Models
|
|
7
7
|
|
8
8
|
EDITING_ROLE_TEACHER = 'teachers'
|
9
9
|
|
10
|
+
MAX_URL_LENGTH = 80
|
11
|
+
|
10
12
|
attr_accessor :workflow_state, :editing_roles, :body, :title
|
11
13
|
|
12
14
|
def initialize
|
@@ -28,7 +30,11 @@ module Moodle2CC::CanvasCC::Models
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def self.convert_name_to_url(name)
|
31
|
-
CGI::escape(name.downcase.gsub(/\s/, '-').gsub('.', 'dot'))
|
33
|
+
url = CGI::escape(name.downcase.gsub(/\s/, '-').gsub('.', 'dot'))
|
34
|
+
if url.length > MAX_URL_LENGTH
|
35
|
+
url = url[0,MAX_URL_LENGTH][/.{0,#{MAX_URL_LENGTH}}/mu]
|
36
|
+
end
|
37
|
+
url
|
32
38
|
end
|
33
39
|
|
34
40
|
end
|
@@ -21,14 +21,15 @@ module Moodle2CC::CanvasCC
|
|
21
21
|
def self.write_response_conditions(processing_node, question)
|
22
22
|
return unless question.answers.count > 0
|
23
23
|
processing_node.respcondition(:continue => 'No') do |condition_node|
|
24
|
-
first = question.answers.first
|
25
|
-
rest = question.answers[1..-1]
|
26
24
|
condition_node.conditionvar do |var_node|
|
27
25
|
var_node.and do |and_node|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
question.answers.each do |answer|
|
27
|
+
if answer.fraction.to_f > 0
|
28
|
+
and_node.varequal answer.id, :respident => 'response1'
|
29
|
+
else
|
30
|
+
and_node.not do |not_node|
|
31
|
+
not_node.varequal answer.id, :respident => 'response1'
|
32
|
+
end
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Moodle2CC::CanvasCC
|
2
|
+
class MultipleDropdownsQuestionWriter < QuestionWriter
|
3
|
+
register_writer_type 'multiple_dropdowns_question'
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def self.write_responses(presentation_node, question)
|
8
|
+
question.responses.each do |response|
|
9
|
+
presentation_node.response_lid(:ident => "response_#{response[:id]}") do |response_node|
|
10
|
+
response_node.material do |material_node|
|
11
|
+
material_node.mattext(response[:id], :texttype => 'text/plain')
|
12
|
+
end
|
13
|
+
response_node.render_choice do |choice_node|
|
14
|
+
response[:choices].each do |choice|
|
15
|
+
choice_node.response_label(:ident => choice[:id]) do |label_node|
|
16
|
+
label_node.material do |material_node|
|
17
|
+
material_node.mattext(choice[:text], :texttype => 'text/plain')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.write_response_conditions(processing_node, question)
|
27
|
+
# this is always an answerless questionnaire question (for now), so no response conditions are necessary
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -79,7 +79,7 @@ module Moodle2CC::CanvasCC
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def self.write_general_feedback(item_node, question)
|
82
|
-
if question.general_feedback
|
82
|
+
if question.general_feedback && question.general_feedback.length > 0
|
83
83
|
item_node.itemfeedback(:ident => 'general_fb') do |fb_node|
|
84
84
|
fb_node.flow_mat do |flow_node|
|
85
85
|
flow_node.material do |material_node|
|
@@ -122,6 +122,7 @@ require_relative 'matching_question_writer'
|
|
122
122
|
require_relative 'multiple_answers_question_writer'
|
123
123
|
require_relative 'multiple_blanks_question_writer'
|
124
124
|
require_relative 'multiple_choice_question_writer'
|
125
|
+
require_relative 'multiple_dropdowns_question_writer'
|
125
126
|
require_relative 'numerical_question_writer'
|
126
127
|
require_relative 'short_answer_question_writer'
|
127
128
|
require_relative 'text_only_question_writer'
|
@@ -20,6 +20,7 @@ module Moodle2CC::Moodle2
|
|
20
20
|
parse_assignments(work_dir, course)
|
21
21
|
parse_books(work_dir, course)
|
22
22
|
parse_folders(work_dir, course)
|
23
|
+
parse_wikis(work_dir, course)
|
23
24
|
parse_question_categories(work_dir, course)
|
24
25
|
|
25
26
|
parse_quizzes(work_dir, course)
|
@@ -67,6 +68,12 @@ module Moodle2CC::Moodle2
|
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
71
|
+
def parse_wikis(work_dir, course)
|
72
|
+
if wikis = Moodle2CC::Moodle2::Parsers::WikiParser.new(work_dir).parse
|
73
|
+
course.wikis += wikis
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
70
77
|
def parse_forums(work_dir, course)
|
71
78
|
if forums = Moodle2CC::Moodle2::Parsers::ForumParser.new(work_dir).parse
|
72
79
|
course.forums += forums
|
@@ -4,7 +4,7 @@ module Moodle2CC::Moodle2::Models
|
|
4
4
|
:course_id, :show_grades, :sections, :files, :pages, :forums, :assignments,
|
5
5
|
:books, :folders, :question_categories, :quizzes, :glossaries,
|
6
6
|
:labels, :resources, :external_urls, :choices, :questionnaires,
|
7
|
-
:feedbacks
|
7
|
+
:feedbacks, :wikis
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@sections = []
|
@@ -23,11 +23,12 @@ module Moodle2CC::Moodle2::Models
|
|
23
23
|
@labels = []
|
24
24
|
@resources = []
|
25
25
|
@external_urls = []
|
26
|
+
@wikis = []
|
26
27
|
end
|
27
28
|
|
28
29
|
def activities
|
29
30
|
pages + forums + assignments + books + folders + quizzes + labels + resources + glossaries +
|
30
|
-
external_urls + choices + questionnaires + feedbacks
|
31
|
+
external_urls + choices + questionnaires + feedbacks + wikis
|
31
32
|
end
|
32
33
|
|
33
34
|
end
|
@@ -38,9 +38,9 @@ module Moodle2CC::Moodle2::Models
|
|
38
38
|
@converted_title = name_text
|
39
39
|
|
40
40
|
if @converted_title == "Label" || @converted_title.end_with?("...") || @converted_title.length == 0
|
41
|
-
if intro_text.length >
|
42
|
-
|
43
|
-
@converted_title = intro_text
|
41
|
+
if intro_text.length > Moodle2CC::Moodle2Converter::ConverterHelper::MAX_TITLE_LENGTH
|
42
|
+
@truncate = true
|
43
|
+
@converted_title = intro_text # we will truncate in the label_converter
|
44
44
|
@convert_to_page = true
|
45
45
|
else
|
46
46
|
if intro_text.length > 0
|
@@ -52,8 +52,8 @@ module Moodle2CC::Moodle2::Models
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
# if the intro has no text or the text is identical, then convert to page if it has tags
|
56
|
-
if @converted_title == intro_text || intro_text.length == 0
|
55
|
+
# if the intro has no text or the text is identical, then convert to page only if it has tags
|
56
|
+
if (@converted_title == intro_text && !@truncate) || intro_text.length == 0
|
57
57
|
@convert_to_page = intro_html.search('img[src]').length > 0 ||
|
58
58
|
intro_html.search('a[href]').length > 0 ||
|
59
59
|
intro_html.search('iframe[src]').length > 0
|
@@ -9,7 +9,7 @@ module Moodle2CC::Moodle2::Models
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class Question
|
12
|
-
attr_accessor :id, :name, :type_id, :content, :position, :deleted, :choices
|
12
|
+
attr_accessor :id, :name, :type_id, :content, :position, :deleted, :choices, :precise, :length
|
13
13
|
|
14
14
|
def initialize
|
15
15
|
@choices = []
|
@@ -6,6 +6,7 @@ module Moodle2CC::Moodle2::Models::Quizzes
|
|
6
6
|
require_relative 'quizzes/calculated_question'
|
7
7
|
require_relative 'quizzes/match_question'
|
8
8
|
require_relative 'quizzes/multianswer_question'
|
9
|
+
require_relative 'quizzes/multichoice_question'
|
9
10
|
require_relative 'quizzes/numerical_question'
|
10
11
|
require_relative 'quizzes/random_sa_question'
|
11
12
|
require_relative 'quizzes/true_false_question'
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Moodle2CC::Moodle2::Models::Quizzes
|
2
2
|
class CalculatedQuestion < Question
|
3
3
|
register_question_type 'calculated'
|
4
|
-
attr_accessor :correct_answer_format, :correct_answer_length, :dataset_definitions, :tolerance
|
4
|
+
attr_accessor :correct_answer_format, :correct_answer_length, :dataset_definitions, :tolerance, :var_sets
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
super
|
8
8
|
@dataset_definitions = []
|
9
|
+
@var_sets = []
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
@@ -13,12 +13,12 @@ module Moodle2CC::Moodle2::Parsers
|
|
13
13
|
File.open(File.join(@backup_folder, COURSE_XML_PATH)) do |f|
|
14
14
|
course_doc = Nokogiri::XML(f)
|
15
15
|
course.course_id = course_doc.at_xpath('/course/@id').value
|
16
|
-
course.id_number = course_doc
|
17
|
-
course.fullname = course_doc
|
18
|
-
course.shortname = course_doc
|
19
|
-
course.summary = course_doc
|
16
|
+
course.id_number = parse_text(course_doc, '/course/idnumber')
|
17
|
+
course.fullname = parse_text(course_doc, '/course/fullname')
|
18
|
+
course.shortname = parse_text(course_doc, '/course/shortname')
|
19
|
+
course.summary = parse_text(course_doc, '/course/summary')
|
20
20
|
course.show_grades = parse_boolean(course_doc, '/course/showgrades')
|
21
|
-
if unix_start_date = course_doc
|
21
|
+
if unix_start_date = parse_text(course_doc, '/course/startdate')
|
22
22
|
course.startdate = Time.at(unix_start_date.to_i)
|
23
23
|
end
|
24
24
|
|
@@ -5,6 +5,10 @@ module Moodle2CC::Moodle2::Parsers
|
|
5
5
|
XML_NULL_VALUE = '$@NULL@$'
|
6
6
|
MODULE_XML = 'module.xml'
|
7
7
|
|
8
|
+
MOODLE_FILEBASE_TOKEN = '$@FILEPHP@$'
|
9
|
+
IMS_FILEBASE_TOKEN = '$IMS_CC_FILEBASE$'
|
10
|
+
SLASH_TOKEN = '$@SLASH@$'
|
11
|
+
|
8
12
|
def activity_directories(work_dir, activity_types)
|
9
13
|
File.open(File.join(work_dir, Moodle2CC::Moodle2::Extractor::MOODLE_BACKUP_XML)) do |f|
|
10
14
|
moodle_backup_xml = Nokogiri::XML(f)
|
@@ -16,13 +20,14 @@ module Moodle2CC::Moodle2::Parsers
|
|
16
20
|
def parse_text(node, xpath, use_xpath=false)
|
17
21
|
if v_node = (use_xpath && node.at_xpath(xpath)) || (!use_xpath && node.%(xpath))
|
18
22
|
value = v_node.text
|
19
|
-
|
23
|
+
return nil if value == XML_NULL_VALUE
|
24
|
+
value.to_s.gsub(MOODLE_FILEBASE_TOKEN, IMS_FILEBASE_TOKEN).gsub(SLASH_TOKEN, '/')
|
20
25
|
end
|
21
26
|
end
|
22
27
|
|
23
28
|
def parse_boolean(node, xpath)
|
24
29
|
value = parse_text(node, xpath)
|
25
|
-
value && (value == '1' || value.downcase == 'true') ? true : false
|
30
|
+
value && (value == '1' || value.downcase == 'true' || value.downcase == 'y') ? true : false
|
26
31
|
end
|
27
32
|
|
28
33
|
def parse_module(activity_dir, activity)
|