moodle2cc 0.2.5 → 0.2.6
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.
- 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)
|