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.
- checksums.yaml +4 -4
- data/Changelog +37 -29
- data/lib/moodle2cc.rb +2 -0
- data/lib/moodle2cc/canvas_cc/assignment_writer.rb +2 -1
- data/lib/moodle2cc/canvas_cc/models/assessment.rb +14 -4
- data/lib/moodle2cc/canvas_cc/models/assignment.rb +1 -1
- data/lib/moodle2cc/canvas_cc/models/course.rb +7 -1
- data/lib/moodle2cc/canvas_cc/models/page.rb +5 -1
- data/lib/moodle2cc/canvas_cc/models/question.rb +3 -3
- data/lib/moodle2cc/canvas_cc/multiple_answers_question_writer.rb +40 -0
- data/lib/moodle2cc/canvas_cc/question_writer.rb +1 -0
- data/lib/moodle2cc/moodle2/extractor.rb +23 -0
- data/lib/moodle2cc/moodle2/models.rb +5 -1
- data/lib/moodle2cc/moodle2/models/choice.rb +12 -0
- data/lib/moodle2cc/moodle2/models/course.rb +8 -3
- data/lib/moodle2cc/moodle2/models/feedback.rb +15 -0
- data/lib/moodle2cc/moodle2/models/label.rb +66 -0
- data/lib/moodle2cc/moodle2/models/questionnaire.rb +19 -0
- data/lib/moodle2cc/moodle2/parsers.rb +3 -0
- data/lib/moodle2cc/moodle2/parsers/choice_parser.rb +52 -0
- data/lib/moodle2cc/moodle2/parsers/course_parser.rb +2 -0
- data/lib/moodle2cc/moodle2/parsers/feedback_parser.rb +54 -0
- data/lib/moodle2cc/moodle2/parsers/questionnaire_parser.rb +58 -0
- data/lib/moodle2cc/moodle2converter/assessment_converter.rb +37 -1
- data/lib/moodle2cc/moodle2converter/assignment_converter.rb +1 -1
- data/lib/moodle2cc/moodle2converter/book_converter.rb +1 -0
- data/lib/moodle2cc/moodle2converter/converter_helper.rb +7 -1
- data/lib/moodle2cc/moodle2converter/feedback_converter.rb +70 -0
- data/lib/moodle2cc/moodle2converter/folder_converter.rb +2 -1
- data/lib/moodle2cc/moodle2converter/glossary_converter.rb +3 -3
- data/lib/moodle2cc/moodle2converter/label_converter.rb +39 -0
- data/lib/moodle2cc/moodle2converter/migrator.rb +17 -3
- data/lib/moodle2cc/moodle2converter/question_converters/question_converter.rb +4 -1
- data/lib/moodle2cc/moodle2converter/questionnaire_converter.rb +58 -0
- data/lib/moodle2cc/moodle2converter/section_converter.rb +4 -3
- data/lib/moodle2cc/version.rb +1 -1
- data/spec/moodle2cc/canvas_cc/assignment_writer_spec.rb +2 -0
- data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +25 -18
- data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +47 -0
- data/spec/moodle2cc/moodle2/extractor_spec.rb +24 -0
- data/spec/moodle2cc/moodle2/models/label_spec.rb +71 -0
- data/spec/moodle2cc/moodle2/parsers/choice_parser_spec.rb +32 -0
- data/spec/moodle2cc/moodle2/parsers/course_parser_spec.rb +1 -0
- data/spec/moodle2cc/moodle2/parsers/feedback_parser_spec.rb +31 -0
- data/spec/moodle2cc/moodle2/parsers/questionnaire_parser_spec.rb +32 -0
- data/spec/moodle2cc/moodle2converter/assessment_converter_spec.rb +158 -3
- data/spec/moodle2cc/moodle2converter/converter_helper_spec.rb +24 -0
- data/spec/moodle2cc/moodle2converter/folder_converter_spec.rb +2 -0
- data/spec/moodle2cc/moodle2converter/glossary_converter_spec.rb +2 -3
- data/spec/moodle2cc/moodle2converter/label_converter_spec.rb +86 -0
- data/spec/moodle2cc/moodle2converter/migrator_spec.rb +2 -0
- data/spec/moodle2cc/moodle2converter/question_bank_converter_spec.rb +2 -2
- data/spec/moodle2cc/moodle2converter/question_converters/calculated_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/matching_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/multiple_blanks_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/numerical_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/question_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/question_converters/true_false_converter_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/section_converter_spec.rb +7 -22
- data/test/fixtures/moodle2/backup/activities/choice_56547/calendar.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/choice.xml +32 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/comments.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/completion.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/filters.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/grades.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/inforef.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/module.xml +28 -0
- data/test/fixtures/moodle2/backup/activities/choice_56547/roles.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/feedback.xml +147 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/filters.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/grades.xml +7 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/inforef.xml +3 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/module.xml +28 -0
- data/test/fixtures/moodle2/backup/activities/feedback_58588/roles.xml +7 -0
- data/test/fixtures/moodle2/backup/moodle_backup.xml +14 -0
- metadata +52 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a600552337a2b45e2b9a0878149e3cb61d7a10c9
|
|
4
|
+
data.tar.gz: c3ac55a6630b19f53f7b3926ad5ae412cfc2de7f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 30d47158a1782a2ab93acf4fba5e063e5012be0ca7b53aaeec106c2ebd7c766e3cf818dceca016a1425feb79ee9d725911ca0ee762d3b4c969bd1cc192890e1d
|
|
7
|
+
data.tar.gz: 6c45ffdd8a31f73d4768b21ca99795373c6dc10b86a3836cff475b1df1d023af31930b99a3ad33d129d307cff570cb07df84ea72ab0173bdea48e5e0e812760c
|
data/Changelog
CHANGED
|
@@ -1,71 +1,79 @@
|
|
|
1
|
+
2014-04-16 Version 0.2.5
|
|
2
|
+
* Don't default to allowing url submissions for assignments
|
|
3
|
+
* Long labels are converted to html pages instead of being truncated
|
|
4
|
+
* Handle assessments, questionnaires, choice activities, and feedback activities
|
|
5
|
+
* Use definition lists for glossary
|
|
6
|
+
* Include folder descriptions
|
|
7
|
+
* Handle some visibility issues better
|
|
8
|
+
|
|
1
9
|
2014-04-09 Version 0.2.4
|
|
2
|
-
|
|
10
|
+
* Fix Moodle book conversion for titles and order
|
|
3
11
|
|
|
4
12
|
2014-04-09 Version 0.2.3
|
|
5
|
-
|
|
13
|
+
* Add converting of HSU forums
|
|
6
14
|
|
|
7
15
|
2014-04-03 Version 0.2.2
|
|
8
|
-
|
|
16
|
+
* Fixed parse exception for quizzes with no configures attempt count
|
|
9
17
|
|
|
10
18
|
2014-04-02 Version 0.2.1
|
|
11
|
-
|
|
19
|
+
* Fixed true/false questions conversion for moodle 2
|
|
12
20
|
|
|
13
21
|
2014-04-01 Version 0.2.0
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
* Add support for converting Moodle 2 exports to canvas
|
|
23
|
+
flavored common cartridge
|
|
24
|
+
* TODO of adding better plain CC support for Moodle 2 conversions
|
|
17
25
|
|
|
18
26
|
2014-01-21 Version 0.1.11
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
* files with associated text/html content are now made into
|
|
28
|
+
html pages with that text and a link to the file
|
|
21
29
|
|
|
22
30
|
2013-08-15 Version 0.1.10
|
|
23
|
-
|
|
31
|
+
* improve multiple dropdown question handling
|
|
24
32
|
|
|
25
33
|
2013-08-01 Version 0.1.9
|
|
26
|
-
|
|
34
|
+
* fix whitespace handling issue with mod_type
|
|
27
35
|
|
|
28
36
|
2013-07-02 Version 0.1.8
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
* Improved question image conversion by putting it in its own p tag
|
|
38
|
+
* Added support for hsuforum content
|
|
31
39
|
|
|
32
40
|
2013-06-27 Version 0.1.7
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
* Include question images when converting to QTI
|
|
42
|
+
* Added travis setup for happiness
|
|
35
43
|
|
|
36
44
|
2012-12-07 Version 0.1.6
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
* Added Changelog
|
|
46
|
+
* Don't error out when trying to reference non-existent quiz question
|
|
39
47
|
|
|
40
48
|
2012-08-20 Version 0.1.5
|
|
41
49
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
* Readme improvements
|
|
51
|
+
* Listed todo items for complete Common Cartridge conversion support
|
|
52
|
+
* Added assignment conversion to plain CC
|
|
53
|
+
* Added wiki page conversion to plain CC
|
|
46
54
|
|
|
47
55
|
2012-08-15 Version 0.1.4
|
|
48
56
|
|
|
49
|
-
|
|
57
|
+
* More robust URI parsing
|
|
50
58
|
|
|
51
59
|
2012-08-06 Version 0.1.3
|
|
52
60
|
|
|
53
|
-
|
|
54
|
-
|
|
61
|
+
* Fix external link and attachment references
|
|
62
|
+
* Fix ordering of module items
|
|
55
63
|
|
|
56
64
|
|
|
57
65
|
2012-08-03 Version 0.1.2
|
|
58
66
|
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
* Add quiz support
|
|
68
|
+
* Better handle wiki titles and summaries
|
|
61
69
|
|
|
62
70
|
|
|
63
71
|
2012-07-26 Version 0.1.1
|
|
64
72
|
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
* Fix extra whitespace errors
|
|
74
|
+
* Add ability to inject logger during conversion process
|
|
67
75
|
|
|
68
76
|
|
|
69
77
|
2012-7-24 Version 0.1.0
|
|
70
78
|
|
|
71
|
-
|
|
79
|
+
* Initial release
|
data/lib/moodle2cc.rb
CHANGED
|
@@ -79,6 +79,7 @@ module Moodle2CC
|
|
|
79
79
|
autoload :CalculatedQuestionWriter, 'moodle2cc/canvas_cc/calculated_question_writer'
|
|
80
80
|
autoload :EssayQuestionWriter, 'moodle2cc/canvas_cc/essay_question_writer'
|
|
81
81
|
autoload :MatchingQuestionWriter, 'moodle2cc/canvas_cc/matching_question_writer'
|
|
82
|
+
autoload :MultipleAnswersQuestionWriter, 'moodle2cc/canvas_cc/multiple_answers_question_writer'
|
|
82
83
|
autoload :MultipleBlanksQuestionWriter, 'moodle2cc/canvas_cc/multiple_blanks_question_writer'
|
|
83
84
|
autoload :MultipleChoiceQuestionWriter, 'moodle2cc/canvas_cc/multiple_choice_question_writer'
|
|
84
85
|
autoload :NumericalQuestionWriter, 'moodle2cc/canvas_cc/numerical_question_writer'
|
|
@@ -126,5 +127,6 @@ module Moodle2CC
|
|
|
126
127
|
autoload :HtmlConverter, 'moodle2cc/moodle2converter/html_converter'
|
|
127
128
|
autoload :HomepageConverter, 'moodle2cc/moodle2converter/homepage_converter'
|
|
128
129
|
autoload :GlossaryConverter, 'moodle2cc/moodle2converter/glossary_converter'
|
|
130
|
+
autoload :LabelConverter, 'moodle2cc/moodle2converter/label_converter'
|
|
129
131
|
end
|
|
130
132
|
end
|
|
@@ -42,6 +42,7 @@ module Moodle2CC::CanvasCC
|
|
|
42
42
|
xml.peer_reviews assignment.peer_reviews unless assignment.peer_reviews.nil?
|
|
43
43
|
xml.automatic_peer_reviews assignment.automatic_peer_reviews unless assignment.automatic_peer_reviews.nil?
|
|
44
44
|
xml.grade_group_students_individually assignment.grade_group_students_individually unless assignment.grade_group_students_individually.nil?
|
|
45
|
+
xml.muted assignment.muted unless assignment.muted.nil?
|
|
45
46
|
}
|
|
46
47
|
end.to_xml
|
|
47
48
|
File.open(File.join(assignment_dir, Moodle2CC::CanvasCC::Models::Assignment::ASSIGNMENT_SETTINGS_FILE), 'w') { |f| f.write(xml) }
|
|
@@ -64,4 +65,4 @@ module Moodle2CC::CanvasCC
|
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
end
|
|
67
|
-
end
|
|
68
|
+
end
|
|
@@ -4,6 +4,7 @@ module Moodle2CC::CanvasCC::Models
|
|
|
4
4
|
:scoring_policy, :access_code, :ip_filter, :shuffle_answers, :time_limit, :quiz_type]
|
|
5
5
|
DATETIME_ATTRIBUTES = [:lock_at, :unlock_at]
|
|
6
6
|
|
|
7
|
+
ASSESSMENT_TYPE = 'imsqti_xmlv1p2/imscc_xmlv1p1/assessment'
|
|
7
8
|
LAR_TYPE = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'
|
|
8
9
|
ASSESSMENT_NON_CC_FOLDER = 'non_cc_assessments'
|
|
9
10
|
|
|
@@ -14,12 +15,21 @@ module Moodle2CC::CanvasCC::Models
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def resources
|
|
17
|
-
[
|
|
18
|
+
[cc_assessment_resource, canvas_assessment_resource]
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
def
|
|
21
|
+
def cc_assessment_resource
|
|
21
22
|
resource = Moodle2CC::CanvasCC::Models::Resource.new
|
|
22
23
|
resource.identifier = @identifier
|
|
24
|
+
resource.type = ASSESSMENT_TYPE
|
|
25
|
+
resource.dependencies = ["#{@identifier}_meta"]
|
|
26
|
+
resource.files = [] # TODO: export cc qti file
|
|
27
|
+
resource
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def canvas_assessment_resource
|
|
31
|
+
resource = Moodle2CC::CanvasCC::Models::Resource.new
|
|
32
|
+
resource.identifier = "#{@identifier}_meta"
|
|
23
33
|
resource.href = meta_file_path
|
|
24
34
|
resource.type = LAR_TYPE
|
|
25
35
|
resource.files = [meta_file_path, qti_file_path]
|
|
@@ -40,7 +50,7 @@ module Moodle2CC::CanvasCC::Models
|
|
|
40
50
|
question = nil
|
|
41
51
|
group = nil
|
|
42
52
|
question_banks.each do |bank|
|
|
43
|
-
break if (question = bank.questions.detect{|q| q.
|
|
53
|
+
break if (question = bank.questions.detect{|q| q.original_identifier.to_s == ref[:question]}) ||
|
|
44
54
|
(group = bank.question_groups.detect{|g| g.identifier.to_s == ref[:question]})
|
|
45
55
|
end
|
|
46
56
|
|
|
@@ -60,7 +70,7 @@ module Moodle2CC::CanvasCC::Models
|
|
|
60
70
|
|
|
61
71
|
@items.select{|i| i.is_a?(Moodle2CC::CanvasCC::Models::QuestionGroup)}.each do |group|
|
|
62
72
|
group.questions.each do |q|
|
|
63
|
-
@items.delete_if{|i| i.
|
|
73
|
+
@items.delete_if{|i| i.respond_to?(:original_identifier) && i.original_identifier == q.original_identifier}
|
|
64
74
|
end
|
|
65
75
|
end
|
|
66
76
|
end
|
|
@@ -3,7 +3,7 @@ module Moodle2CC::CanvasCC::Models
|
|
|
3
3
|
attr_accessor :identifier, :title, :body, :due_at, :lock_at, :unlock_at, :all_day_date, :peer_reviews_due_at,
|
|
4
4
|
:assignment_group_identifier_ref, :workflow_state, :points_possible, :grading_type, :all_day,
|
|
5
5
|
:submission_types, :position, :peer_review_count, :peer_reviews_assigned, :peer_reviews,
|
|
6
|
-
:automatic_peer_reviews, :grade_group_students_individually
|
|
6
|
+
:automatic_peer_reviews, :grade_group_students_individually, :muted
|
|
7
7
|
|
|
8
8
|
LAR_TYPE = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'
|
|
9
9
|
ASSIGNMENT_SETTINGS_FILE = 'assignment_settings.xml'
|
|
@@ -26,7 +26,7 @@ module Moodle2CC::CanvasCC::Models
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def all_resources
|
|
29
|
-
@resources + @files + @pages + @discussions.map(&:resources).flatten + @assignments.map(&:resources).flatten
|
|
29
|
+
@resources + @files + @pages + @discussions.map(&:resources).flatten + @assignments.map(&:resources).flatten + @assessments.map(&:resources).flatten
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def method_missing(m, *args, &block)
|
|
@@ -42,5 +42,11 @@ module Moodle2CC::CanvasCC::Models
|
|
|
42
42
|
return unless @assessments && @question_banks
|
|
43
43
|
@assessments.each{|a| a.resolve_question_references(@question_banks)}
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
def mute_assignments!
|
|
47
|
+
@assignments.each do |assignment|
|
|
48
|
+
assignment.muted = true
|
|
49
|
+
end
|
|
50
|
+
end
|
|
45
51
|
end
|
|
46
52
|
end
|
|
@@ -24,7 +24,11 @@ module Moodle2CC::CanvasCC::Models
|
|
|
24
24
|
|
|
25
25
|
def page_name= name
|
|
26
26
|
@title = name
|
|
27
|
-
@href = "#{WIKI_CONTENT}/#{
|
|
27
|
+
@href = "#{WIKI_CONTENT}/#{self.class.convert_name_to_url(name)}.html"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.convert_name_to_url(name)
|
|
31
|
+
CGI::escape(name.downcase.gsub(/\s/, '-').gsub('.', 'dot'))
|
|
28
32
|
end
|
|
29
33
|
|
|
30
34
|
end
|
|
@@ -2,10 +2,10 @@ module Moodle2CC::CanvasCC::Models
|
|
|
2
2
|
class Question
|
|
3
3
|
QTI_META_ATTRIBUTES = [:question_type, :points_possible, :assessment_question_identifierref]
|
|
4
4
|
STANDARD_QUESTION_TYPES = ['essay_question', 'fill_in_multiple_blanks_question',
|
|
5
|
-
'multiple_choice_question', '
|
|
6
|
-
'text_only_question', 'true_false_question']
|
|
5
|
+
'multiple_choice_question', 'multiple_answers_question',
|
|
6
|
+
'short_answer_question', 'text_only_question', 'true_false_question']
|
|
7
7
|
|
|
8
|
-
attr_accessor :identifier, :title, :material, :answers, :general_feedback, *QTI_META_ATTRIBUTES
|
|
8
|
+
attr_accessor :identifier, :original_identifier, :title, :material, :answers, :general_feedback, *QTI_META_ATTRIBUTES
|
|
9
9
|
|
|
10
10
|
@@subclasses = {}
|
|
11
11
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Moodle2CC::CanvasCC
|
|
2
|
+
class MultipleAnswersQuestionWriter < QuestionWriter
|
|
3
|
+
register_writer_type 'multiple_answers_question'
|
|
4
|
+
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def self.write_responses(presentation_node, question)
|
|
8
|
+
presentation_node.response_lid(:ident => 'response1', :rcardinality => 'Multiple') do |response_node|
|
|
9
|
+
response_node.render_choice do |choice_node|
|
|
10
|
+
question.answers.each do |answer|
|
|
11
|
+
choice_node.response_label(:ident => answer.id) do |label_node|
|
|
12
|
+
label_node.material do |material_node|
|
|
13
|
+
material_node.mattext answer.answer_text, :texttype => 'text/html'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.write_response_conditions(processing_node, question)
|
|
22
|
+
return unless question.answers.count > 0
|
|
23
|
+
processing_node.respcondition(:continue => 'No') do |condition_node|
|
|
24
|
+
first = question.answers.first
|
|
25
|
+
rest = question.answers[1..-1]
|
|
26
|
+
condition_node.conditionvar do |var_node|
|
|
27
|
+
var_node.and do |and_node|
|
|
28
|
+
and_node.varequal first.id, :respident => 'response1'
|
|
29
|
+
rest.each do |answer|
|
|
30
|
+
and_node.not do |not_node|
|
|
31
|
+
not_node.varequal answer.id, :respident => 'response1'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
condition_node.setvar('100', :varname => 'SCORE', :action => 'Set')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -119,6 +119,7 @@ end
|
|
|
119
119
|
require_relative 'calculated_question_writer'
|
|
120
120
|
require_relative 'essay_question_writer'
|
|
121
121
|
require_relative 'matching_question_writer'
|
|
122
|
+
require_relative 'multiple_answers_question_writer'
|
|
122
123
|
require_relative 'multiple_blanks_question_writer'
|
|
123
124
|
require_relative 'multiple_choice_question_writer'
|
|
124
125
|
require_relative 'numerical_question_writer'
|
|
@@ -21,7 +21,12 @@ module Moodle2CC::Moodle2
|
|
|
21
21
|
parse_books(work_dir, course)
|
|
22
22
|
parse_folders(work_dir, course)
|
|
23
23
|
parse_question_categories(work_dir, course)
|
|
24
|
+
|
|
24
25
|
parse_quizzes(work_dir, course)
|
|
26
|
+
parse_choices(work_dir, course)
|
|
27
|
+
parse_feedbacks(work_dir, course)
|
|
28
|
+
parse_questionnaires(work_dir, course)
|
|
29
|
+
|
|
25
30
|
parse_glossaries(work_dir, course)
|
|
26
31
|
parse_labels(work_dir, course)
|
|
27
32
|
parse_external_urls(work_dir, course)
|
|
@@ -99,6 +104,24 @@ module Moodle2CC::Moodle2
|
|
|
99
104
|
end
|
|
100
105
|
end
|
|
101
106
|
|
|
107
|
+
def parse_choices(work_dir, course)
|
|
108
|
+
if choices = Moodle2CC::Moodle2::Parsers::ChoiceParser.new(work_dir).parse
|
|
109
|
+
course.choices += choices
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def parse_feedbacks(work_dir, course)
|
|
114
|
+
if feedbacks = Moodle2CC::Moodle2::Parsers::FeedbackParser.new(work_dir).parse
|
|
115
|
+
course.feedbacks += feedbacks
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def parse_questionnaires(work_dir, course)
|
|
120
|
+
if questionnaires = Moodle2CC::Moodle2::Parsers::QuestionnaireParser.new(work_dir).parse
|
|
121
|
+
course.questionnaires += questionnaires
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
102
125
|
def parse_glossaries(work_dir, course)
|
|
103
126
|
if glossaries = Moodle2CC::Moodle2::Parsers::GlossaryParser.new(work_dir).parse
|
|
104
127
|
course.glossaries += glossaries
|
|
@@ -3,7 +3,10 @@ module Moodle2CC::Moodle2::Models
|
|
|
3
3
|
require_relative 'models/assignment'
|
|
4
4
|
require_relative 'models/book'
|
|
5
5
|
require_relative 'models/book_chapter'
|
|
6
|
+
require_relative 'models/choice'
|
|
6
7
|
require_relative 'models/course'
|
|
8
|
+
require_relative 'models/external_url'
|
|
9
|
+
require_relative 'models/feedback'
|
|
7
10
|
require_relative 'models/folder'
|
|
8
11
|
require_relative 'models/forum'
|
|
9
12
|
require_relative 'models/moodle2_file'
|
|
@@ -12,6 +15,7 @@ module Moodle2CC::Moodle2::Models
|
|
|
12
15
|
require_relative 'models/glossary'
|
|
13
16
|
require_relative 'models/glossary_entry'
|
|
14
17
|
require_relative 'models/label'
|
|
18
|
+
require_relative 'models/questionnaire'
|
|
15
19
|
require_relative 'models/resource'
|
|
16
|
-
|
|
20
|
+
|
|
17
21
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Moodle2CC::Moodle2::Models
|
|
2
|
+
class Choice
|
|
3
|
+
|
|
4
|
+
attr_accessor :id, :module_id, :name, :intro, :intro_format, :time_open, :time_close,
|
|
5
|
+
:time_modified, :publish, :show_results, :display, :allow_update, :show_unanswered,
|
|
6
|
+
:limit_answers, :completion_submit, :options, :visible
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@options = []
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
module Moodle2CC::Moodle2::Models
|
|
2
2
|
class Course
|
|
3
3
|
attr_accessor :id_number, :fullname, :shortname, :startdate, :summary,
|
|
4
|
-
:course_id, :sections, :files, :pages, :forums, :assignments,
|
|
4
|
+
:course_id, :show_grades, :sections, :files, :pages, :forums, :assignments,
|
|
5
5
|
:books, :folders, :question_categories, :quizzes, :glossaries,
|
|
6
|
-
:labels, :resources, :external_urls
|
|
6
|
+
:labels, :resources, :external_urls, :choices, :questionnaires,
|
|
7
|
+
:feedbacks
|
|
7
8
|
|
|
8
9
|
def initialize
|
|
9
10
|
@sections = []
|
|
@@ -15,6 +16,9 @@ module Moodle2CC::Moodle2::Models
|
|
|
15
16
|
@folders = []
|
|
16
17
|
@question_categories = []
|
|
17
18
|
@quizzes = []
|
|
19
|
+
@choices = []
|
|
20
|
+
@feedbacks = []
|
|
21
|
+
@questionnaires = []
|
|
18
22
|
@glossaries = []
|
|
19
23
|
@labels = []
|
|
20
24
|
@resources = []
|
|
@@ -22,7 +26,8 @@ module Moodle2CC::Moodle2::Models
|
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def activities
|
|
25
|
-
pages + forums + assignments + books + folders + quizzes + labels + resources + glossaries +
|
|
29
|
+
pages + forums + assignments + books + folders + quizzes + labels + resources + glossaries +
|
|
30
|
+
external_urls + choices + questionnaires + feedbacks
|
|
26
31
|
end
|
|
27
32
|
|
|
28
33
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Moodle2CC::Moodle2::Models
|
|
2
|
+
class Feedback
|
|
3
|
+
|
|
4
|
+
attr_accessor :id, :module_id, :name, :intro, :intro_format, :time_open, :time_close,
|
|
5
|
+
:time_modified, :items, :visible
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@items = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class Question
|
|
12
|
+
attr_accessor :id, :name, :label, :type, :position, :presentation
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -2,5 +2,71 @@ module Moodle2CC::Moodle2::Models
|
|
|
2
2
|
class Label
|
|
3
3
|
attr_accessor :id, :module_id, :name, :intro, :intro_format, :visible
|
|
4
4
|
|
|
5
|
+
DEFAULT_PAGE_TITLE = "Untitled Page"
|
|
6
|
+
|
|
7
|
+
def name_text
|
|
8
|
+
@name_text ||= (Nokogiri::HTML(@name.to_s).text.strip rescue "")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def intro_html
|
|
12
|
+
@intro_html ||= (Nokogiri::HTML(@intro.to_s) rescue Nokogiri::HTML(''))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def intro_text
|
|
16
|
+
@intro_text ||= (intro_html.text.strip rescue "")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def converted_title
|
|
20
|
+
process_for_conversion!
|
|
21
|
+
@converted_title
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def convert_to_page?
|
|
25
|
+
process_for_conversion!
|
|
26
|
+
@convert_to_page
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def convert_to_header?
|
|
30
|
+
process_for_conversion!
|
|
31
|
+
@convert_to_header
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def process_for_conversion!
|
|
36
|
+
return unless @converted_title.nil? || @convert_to_page.nil? || @convert_to_header.nil?
|
|
37
|
+
|
|
38
|
+
@converted_title = name_text
|
|
39
|
+
|
|
40
|
+
if @converted_title == "Label" || @converted_title.end_with?("...") || @converted_title.length == 0
|
|
41
|
+
if intro_text.length > 80
|
|
42
|
+
|
|
43
|
+
@converted_title = intro_text[0..79] + "..."
|
|
44
|
+
@convert_to_page = true
|
|
45
|
+
else
|
|
46
|
+
if intro_text.length > 0
|
|
47
|
+
@converted_title = intro_text
|
|
48
|
+
else
|
|
49
|
+
@converted_title = DEFAULT_PAGE_TITLE
|
|
50
|
+
@convert_to_header = false # if we're not going to convert it to a page, don't convert it at all
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
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
|
|
57
|
+
@convert_to_page = intro_html.search('img[src]').length > 0 ||
|
|
58
|
+
intro_html.search('a[href]').length > 0 ||
|
|
59
|
+
intro_html.search('iframe[src]').length > 0
|
|
60
|
+
elsif intro_text.length > 0
|
|
61
|
+
@convert_to_page = true
|
|
62
|
+
else
|
|
63
|
+
@convert_to_page = false
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# do the opposite if we haven't already explicitly decided not to convert to a header
|
|
67
|
+
if @convert_to_header.nil?
|
|
68
|
+
@convert_to_header = !@convert_to_page
|
|
69
|
+
end
|
|
70
|
+
end
|
|
5
71
|
end
|
|
6
72
|
end
|