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