moodle2cc 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/lib/moodle2cc.rb +2 -0
  2. data/lib/moodle2cc/canvas/assessment.rb +18 -3
  3. data/lib/moodle2cc/canvas/converter.rb +4 -2
  4. data/lib/moodle2cc/canvas/course.rb +2 -4
  5. data/lib/moodle2cc/canvas/question.rb +11 -8
  6. data/lib/moodle2cc/canvas/question_bank.rb +6 -3
  7. data/lib/moodle2cc/canvas/question_group.rb +35 -0
  8. data/lib/moodle2cc/cc/converter.rb +1 -1
  9. data/lib/moodle2cc/cc/question.rb +1 -1
  10. data/lib/moodle2cc/cc/wiki.rb +1 -1
  11. data/lib/moodle2cc/logger.rb +5 -1
  12. data/lib/moodle2cc/moodle/course.rb +5 -1
  13. data/lib/moodle2cc/moodle/question.rb +1 -0
  14. data/lib/moodle2cc/moodle/section.rb +25 -3
  15. data/lib/moodle2cc/resource_factory.rb +1 -1
  16. data/lib/moodle2cc/version.rb +1 -1
  17. data/moodle2cc.gemspec +1 -0
  18. data/test/fixtures/moodle_backup/moodle.xml +20 -12
  19. data/test/fixtures/moodle_backup_random_questions/course_files/folder/test.txt +1 -0
  20. data/test/fixtures/moodle_backup_random_questions/course_files/test.txt +1 -0
  21. data/test/fixtures/moodle_backup_random_questions/moodle.xml +357 -0
  22. data/test/test_helper.rb +7 -7
  23. data/test/unit/canvas/assessment_test.rb +43 -0
  24. data/test/unit/canvas/converter_test.rb +14 -2
  25. data/test/unit/canvas/course_test.rb +7 -7
  26. data/test/unit/canvas/question_bank_test.rb +19 -0
  27. data/test/unit/canvas/question_group_test.rb +90 -0
  28. data/test/unit/canvas/question_test.rb +37 -38
  29. data/test/unit/canvas/wiki_test.rb +1 -1
  30. data/test/unit/cc/converter_test.rb +15 -3
  31. data/test/unit/cc/question_test.rb +6 -1
  32. data/test/unit/cc/wiki_test.rb +1 -1
  33. data/test/unit/moodle/mod_test.rb +2 -2
  34. data/test/unit/moodle/question_test.rb +4 -0
  35. data/test/unit/moodle/section_test.rb +25 -8
  36. data/test/unit/resource_factory_test.rb +9 -0
  37. metadata +33 -10
data/lib/moodle2cc.rb CHANGED
@@ -6,6 +6,7 @@ require 'happymapper'
6
6
  require 'logger'
7
7
  require 'nokogiri'
8
8
  require 'ostruct'
9
+ require 'rdiscount'
9
10
  require 'uri'
10
11
 
11
12
  require 'moodle2cc/error'
@@ -44,6 +45,7 @@ module Moodle2CC
44
45
  autoload :Label, 'moodle2cc/canvas/label'
45
46
  autoload :Question, 'moodle2cc/canvas/question'
46
47
  autoload :QuestionBank, 'moodle2cc/canvas/question_bank'
48
+ autoload :QuestionGroup, 'moodle2cc/canvas/question_group'
47
49
  autoload :Resource, 'moodle2cc/canvas/resource'
48
50
  autoload :WebContent, 'moodle2cc/canvas/web_content'
49
51
  autoload :WebLink, 'moodle2cc/canvas/web_link'
@@ -4,7 +4,7 @@ module Moodle2CC::Canvas
4
4
  META_ATTRIBUTES = [:title, :description, :lock_at, :unlock_at, :allowed_attempts,
5
5
  :scoring_policy, :access_code, :ip_filter, :shuffle_answers, :time_limit, :quiz_type]
6
6
 
7
- attr_accessor :non_cc_assessments_identifier, *META_ATTRIBUTES
7
+ attr_accessor :questions, :non_cc_assessments_identifier, *META_ATTRIBUTES
8
8
 
9
9
  def initialize(mod, position=0)
10
10
  super
@@ -24,6 +24,22 @@ module Moodle2CC::Canvas
24
24
  @shuffle_answers = mod.shuffle_answers
25
25
  @quiz_type = mod.mod_type == 'quiz' ? 'practice_quiz' : 'survey'
26
26
  @non_cc_assessments_identifier = create_key(@id, 'non_cc_assessments_')
27
+ @questions = []
28
+ mod.questions.each do |question|
29
+ if question.type == 'random'
30
+ question_bank = QuestionBank.new question.question_category
31
+ last = @questions.last
32
+ if last && last.is_a?(QuestionGroup) && last.points_per_item == question.grade && last.sourcebank_ref == question_bank.identifier
33
+ last.increment_selection_number
34
+ else
35
+ group = @questions.select { |q| q.is_a?(QuestionGroup) }.last
36
+ id = group ? group.id + 1 : 1
37
+ @questions << QuestionGroup.new(:id => id, :question_bank => question_bank, :points_per_item => question.grade)
38
+ end
39
+ else
40
+ @questions << Question.new(question, self)
41
+ end
42
+ end
27
43
  end
28
44
 
29
45
  def create_resource_node(resources_node)
@@ -91,8 +107,7 @@ module Moodle2CC::Canvas
91
107
  end
92
108
  end
93
109
  assessment_node.section(:ident => 'root_section') do |section_node|
94
- @mod.questions.each do |question|
95
- question = Question.new question, self
110
+ @questions.each do |question|
96
111
  question.create_item_xml(section_node)
97
112
  end
98
113
  end
@@ -15,8 +15,10 @@ module Moodle2CC::Canvas
15
15
 
16
16
  def create_question_bank_resource(resources_node, question_category)
17
17
  question_bank = QuestionBank.new(question_category)
18
- question_bank.create_resource_node(resources_node)
19
- question_bank.create_files(@export_dir)
18
+ if question_bank.questions.length > 0
19
+ question_bank.create_resource_node(resources_node)
20
+ question_bank.create_files(@export_dir)
21
+ end
20
22
  end
21
23
 
22
24
  def create_course_content(resources_node)
@@ -88,14 +88,13 @@ module Moodle2CC::Canvas
88
88
  'xmlns' => "http://canvas.instructure.com/xsd/cccv1p0"
89
89
  ) do |modules_node|
90
90
  @course.sections.each do |section|
91
- next unless section.visible
91
+ next if section.mods.length == 0
92
92
  modules_node.module(:identifier => create_key(section.id, 'section_')) do |module_node|
93
93
  module_node.title "#{@format} #{section.number}"
94
94
  module_node.position section.number
95
95
  module_node.require_sequential_progress false
96
96
  module_node.items do |items_node|
97
97
  section.mods.each_with_index do |mod, index|
98
- next unless mod.visible
99
98
  resource = @resource_factory.get_resource_from_mod(mod.instance)
100
99
  resource.create_module_meta_item_node(items_node, index) if resource
101
100
  end
@@ -118,8 +117,7 @@ module Moodle2CC::Canvas
118
117
  'xmlns' => "http://canvas.instructure.com/xsd/cccv1p0"
119
118
  ) do |assignment_groups_node|
120
119
  @course.sections.each do |section|
121
- next unless section.visible
122
- next unless section.mods.select { |mod| mod.visible && mod.instance.mod_type == "assignment" }.length > 0
120
+ next unless section.mods.select { |mod| mod.instance.mod_type == "assignment" }.length > 0
123
121
  assignment_groups_node.assignmentGroup(:identifier => create_key(section.id, "assignment_group_")) do |assignment_group_node|
124
122
  assignment_group_node.title "Week #{section.number}"
125
123
  end
@@ -115,7 +115,10 @@ module Moodle2CC::Canvas
115
115
 
116
116
  material = question.text
117
117
  material = question.content || '' if material.nil?
118
- @material = material.gsub(/\{(.*?)\}/, '[\1]')
118
+ material = material.gsub(/\{(.*?)\}/, '[\1]')
119
+ material = RDiscount.new(material).to_html if question.format == 4 # markdown
120
+ @material = material
121
+
119
122
  if @question_type == 'multiple_dropdowns_question' && !@answers.empty?
120
123
  responses = @answers[@length..-1]
121
124
  responses.each_with_index do |response, index|
@@ -189,7 +192,7 @@ module Moodle2CC::Canvas
189
192
  @matches.each do |match|
190
193
  presentation_node.response_lid(:ident => "response_#{match.answer}") do |response_node|
191
194
  response_node.material do |material_node|
192
- material_node.mattext(match.question, :texttype => 'text/plain')
195
+ material_node.mattext(match.question, :texttype => 'text/html')
193
196
  end
194
197
  response_node.render_choice do |choice_node|
195
198
  match.answers.each do |ident, text|
@@ -208,7 +211,7 @@ module Moodle2CC::Canvas
208
211
  @answers.each do |answer|
209
212
  choice_node.response_label(:ident => answer.id) do |label_node|
210
213
  label_node.material do |material_node|
211
- material_node.mattext answer.text, :texttype => 'text/plain'
214
+ material_node.mattext answer.text, :texttype => 'text/html'
212
215
  end
213
216
  end
214
217
  end
@@ -220,7 +223,7 @@ module Moodle2CC::Canvas
220
223
  @answers.each do |answer|
221
224
  choice_node.response_label(:ident => answer.id) do |label_node|
222
225
  label_node.material do |material_node|
223
- material_node.mattext answer.text, :texttype => 'text/plain'
226
+ material_node.mattext answer.text, :texttype => 'text/html'
224
227
  end
225
228
  end
226
229
  end
@@ -239,7 +242,7 @@ module Moodle2CC::Canvas
239
242
  answers.each do |answer|
240
243
  choice_node.response_label(:ident => "#{response_id}#{answer.id}") do |label_node|
241
244
  label_node.material do |material_node|
242
- material_node.mattext answer.text, :texttype => 'text/plain'
245
+ material_node.mattext answer.text, :texttype => 'text/html'
243
246
  end
244
247
  end
245
248
  end
@@ -258,7 +261,7 @@ module Moodle2CC::Canvas
258
261
  @answers.each do |answer|
259
262
  render_choice_node.response_label(:ident => answer.id) do |response_label_node|
260
263
  response_label_node.material do |material_node|
261
- material_node.mattext(answer.text, :texttype => 'text/plain')
264
+ material_node.mattext(answer.text, :texttype => 'text/html')
262
265
  end
263
266
  end
264
267
  end
@@ -404,7 +407,7 @@ module Moodle2CC::Canvas
404
407
  item_node.itemfeedback(:ident => 'general_fb') do |fb_node|
405
408
  fb_node.flow_mat do |flow_node|
406
409
  flow_node.material do |material_node|
407
- material_node.mattext(@general_feedback, :texttype => 'text/plain')
410
+ material_node.mattext(@general_feedback, :texttype => 'text/html')
408
411
  end
409
412
  end
410
413
  end
@@ -417,7 +420,7 @@ module Moodle2CC::Canvas
417
420
  item_node.itemfeedback(:ident => "#{answer.id}_fb") do |feedback_node|
418
421
  feedback_node.flow_mat do |flow_node|
419
422
  flow_node.material do |material_node|
420
- material_node.mattext answer.feedback, :texttype => 'text/plain'
423
+ material_node.mattext answer.feedback, :texttype => 'text/html'
421
424
  end
422
425
  end
423
426
  end
@@ -1,13 +1,16 @@
1
1
  module Moodle2CC::Canvas
2
2
  class QuestionBank
3
3
  include Moodle2CC::CC::CCHelper
4
- attr_accessor :id, :title, :identifier
4
+ attr_accessor :id, :title, :questions, :identifier
5
5
 
6
6
  def initialize(question_category)
7
7
  @id = question_category.id
8
8
  @title = question_category.name
9
9
  @identifier = create_key(@id, 'objectbank_')
10
10
  @question_category = question_category
11
+ @questions = @question_category.questions.reject { |q| q.type == 'random' }.map do |question|
12
+ Question.new question
13
+ end
11
14
  end
12
15
 
13
16
  def create_resource_node(resources_node)
@@ -43,8 +46,8 @@ module Moodle2CC::Canvas
43
46
  qtimetadatafield_node.fieldentry @title
44
47
  end
45
48
  end
46
- @question_category.questions.each do |question|
47
- Question.new(question).create_item_xml(objectbank_node) if question
49
+ @questions.each do |question|
50
+ question.create_item_xml(objectbank_node) if question
48
51
  end
49
52
  end
50
53
  end
@@ -0,0 +1,35 @@
1
+ module Moodle2CC::Canvas
2
+ class QuestionGroup
3
+ include Moodle2CC::CC::CCHelper
4
+ attr_accessor :id, :title, :selection_number, :points_per_item,
5
+ :question_bank, :sourcebank_ref, :identifier
6
+
7
+ def initialize(params={})
8
+ @id = params[:id] || 1
9
+ @title = "Group #{@id}"
10
+ @selection_number = 1
11
+ @points_per_item = params[:points_per_item] || 1
12
+ @question_bank = params[:question_bank]
13
+ @sourcebank_ref = @question_bank.identifier if @question_bank
14
+ @identifier = create_key @id, 'question_group_'
15
+ end
16
+
17
+ def increment_selection_number
18
+ @selection_number += 1
19
+ end
20
+
21
+ def create_item_xml(root_node)
22
+ root_node.section(:title => @title, :ident => @identifier) do |section_node|
23
+ section_node.selection_ordering do |ordering_node|
24
+ ordering_node.selection do |selection_node|
25
+ selection_node.sourcebank_ref @sourcebank_ref
26
+ selection_node.selection_number @selection_number
27
+ selection_node.selection_extension do |extension_node|
28
+ extension_node.points_per_item @points_per_item
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -91,7 +91,7 @@ module Moodle2CC::CC
91
91
  ) do |org|
92
92
  org.item(:identifier => "LearningModules") do |root_item|
93
93
  @moodle_backup.course.sections.each do |section|
94
- next unless section.visible
94
+ next if section.mods.length == 0
95
95
  root_item.item(:identifier => create_key(section.id, "section_")) do |item_node|
96
96
  item_node.title "#{course.format} #{section.number}"
97
97
  section.mods.each do |mod|
@@ -6,7 +6,7 @@ module Moodle2CC::CC
6
6
 
7
7
  def initialize(question, assessment=nil)
8
8
  @id = question.id
9
- @title = (question.name || '').gsub('$@NULL@$', '')
9
+ @title = CGI.unescapeHTML((question.name || '').gsub('$@NULL@$', ''))
10
10
  @identifier_prefix = "#{assessment.mod.mod_type}_" if assessment
11
11
 
12
12
  if question.instance_id
@@ -37,7 +37,7 @@ module Moodle2CC::CC
37
37
  end
38
38
 
39
39
  def root_page
40
- @pages.find { |page| page.title == @title }
40
+ @pages.find { |page| page.title.downcase == @title.downcase }
41
41
  end
42
42
 
43
43
  def create_resource_node(resources_node)
@@ -12,7 +12,11 @@ module Moodle2CC
12
12
  if logger.respond_to? :add_warning
13
13
  logger.add_warning(message, exception)
14
14
  elsif logger.respond_to? :warn
15
- logger.warn "#{message}\n #{exception.message}\n"
15
+ log = "#{message}\n #{exception.message}\n"
16
+ if exception.backtrace
17
+ exception.backtrace.each { |line| log << " #{line}\n" }
18
+ end
19
+ logger.warn log
16
20
  end
17
21
  end
18
22
  end
@@ -15,7 +15,11 @@ module Moodle2CC::Moodle
15
15
  has_many :question_categories, QuestionCategory
16
16
 
17
17
  after_parse do |course|
18
- course.sections.each { |section| section.course = course }
18
+ course.sections.each do |section|
19
+ section.course = course
20
+ mod = section.mods.find { |mod| mod.mod_type == 'summary' }
21
+ course.mods << mod.instance if mod
22
+ end
19
23
  course.mods.each { |mod| mod.course = course }
20
24
  course.grade_items.each { |grade_item| grade_item.course = course }
21
25
  course.question_categories.each { |question_category| question_category.course = course }
@@ -72,6 +72,7 @@ module Moodle2CC::Moodle
72
72
  element :id, Integer, :tag => 'ID'
73
73
  element :name, String, :tag => 'NAME'
74
74
  element :text, String, :tag => 'QUESTIONTEXT'
75
+ element :format, Integer, :tag => 'QUESTIONTEXTFORMAT'
75
76
  element :content, String, :tag => 'CONTENT'
76
77
  element :length, Integer, :tag => 'LENGTH'
77
78
  element :general_feedback, String, :tag => 'GENERALFEEDBACK'
@@ -7,19 +7,20 @@ module Moodle2CC::Moodle
7
7
  class Mod
8
8
  include HappyMapper
9
9
 
10
- attr_accessor :section
10
+ attr_accessor :section, :instance
11
11
 
12
12
  tag 'MODS/MOD'
13
13
 
14
14
  element :id, Integer, :tag => 'ID'
15
- element :mod_type, String, :tag => 'TYPE'
16
15
  element :instance_id, Integer, :tag => 'INSTANCE'
16
+ element :mod_type, String, :tag => 'TYPE'
17
17
  element :added, Integer, :tag => 'ADDED'
18
18
  element :indent, Integer, :tag => 'INDENT'
19
19
  element :visible, Boolean, :tag => 'VISIBLE'
20
20
 
21
21
  def instance
22
- section.course.mods.find { |mod| mod.id == instance_id && mod.mod_type == mod_type }
22
+ return @instance if @instance
23
+ @instance = section.course.mods.find { |mod| mod.id == instance_id && mod.mod_type == mod_type }
23
24
  end
24
25
  end
25
26
 
@@ -31,6 +32,27 @@ module Moodle2CC::Moodle
31
32
  has_many :mods, Mod
32
33
 
33
34
  after_parse do |section|
35
+ mod = Mod.new
36
+ mod.id = "section_summary_mod_#{section.id}"
37
+ mod.instance_id = "section_summary_instance_#{section.id}"
38
+ mod.mod_type = 'summary'
39
+ mod.indent = 0
40
+ mod.visible = true
41
+
42
+ instance = Moodle2CC::Moodle::Mod.new
43
+ instance.id = "section_summary_instance_#{section.id}"
44
+ instance.mod_type = 'summary'
45
+ html = Nokogiri::HTML(section.summary)
46
+ html.search('style').each(&:unlink)
47
+ instance.name = html.text.strip
48
+ instance.name = "#{instance.name[0..50]}..." if instance.name.length > 50
49
+ instance.content = section.summary
50
+
51
+ if instance.content && instance.content.length > 0
52
+ mod.instance = instance
53
+ section.mods.unshift mod
54
+ end
55
+
34
56
  section.mods.each { |mod| mod.section = section }
35
57
  end
36
58
  end
@@ -20,7 +20,7 @@ class Moodle2CC::ResourceFactory
20
20
  @namespace.const_get(:Assessment).new(mod, position)
21
21
  when 'wiki'
22
22
  @namespace.const_get(:Wiki).new(mod)
23
- when 'label'
23
+ when 'label', 'summary'
24
24
  html = Nokogiri::HTML(mod.content)
25
25
  if html.search('img[src]').length > 0 ||
26
26
  html.search('a[href]').length > 0 ||
@@ -1,3 +1,3 @@
1
1
  module Moodle2CC
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/moodle2cc.gemspec CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.add_runtime_dependency "builder"
14
14
  gem.add_runtime_dependency "thor"
15
15
  gem.add_runtime_dependency "nokogiri"
16
+ gem.add_runtime_dependency "rdiscount"
16
17
 
17
18
  gem.add_development_dependency "rake"
18
19
  gem.add_development_dependency "minitest"
@@ -197,14 +197,28 @@
197
197
  <ROLES_ASSIGNMENTS>
198
198
  </ROLES_ASSIGNMENTS>
199
199
  </MOD>
200
+ </MODS>
201
+ </SECTION>
202
+ <SECTION>
203
+ <ID>34567</ID>
204
+ <NUMBER>2</NUMBER>
205
+ <SUMMARY></SUMMARY>
206
+ <VISIBLE>1</VISIBLE>
207
+ </SECTION>
208
+ <SECTION>
209
+ <ID>45678</ID>
210
+ <NUMBER>3</NUMBER>
211
+ <SUMMARY>&lt;h1&gt;Week 3 Summary&lt;/h1&gt;</SUMMARY>
212
+ <VISIBLE>0</VISIBLE>
213
+ <MODS>
200
214
  <MOD>
201
- <ID>12121</ID>
202
- <TYPE>assignment</TYPE>
203
- <INSTANCE>987</INSTANCE>
204
- <ADDED>1338410699</ADDED>
215
+ <ID>23232</ID>
216
+ <TYPE>forum</TYPE>
217
+ <INSTANCE>765</INSTANCE>
218
+ <ADDED>1338472800</ADDED>
205
219
  <SCORE>0</SCORE>
206
220
  <INDENT>0</INDENT>
207
- <VISIBLE>0</VISIBLE>
221
+ <VISIBLE>1</VISIBLE>
208
222
  <GROUPMODE>0</GROUPMODE>
209
223
  <GROUPINGID>0</GROUPINGID>
210
224
  <GROUPMEMBERSONLY>0</GROUPMEMBERSONLY>
@@ -216,12 +230,6 @@
216
230
  </MOD>
217
231
  </MODS>
218
232
  </SECTION>
219
- <SECTION>
220
- <ID>34567</ID>
221
- <NUMBER>2</NUMBER>
222
- <SUMMARY>&lt;h1&gt;Week 2 Summary&lt;/h1&gt;</SUMMARY>
223
- <VISIBLE>0</VISIBLE>
224
- </SECTION>
225
233
  </SECTIONS>
226
234
  <QUESTION_CATEGORIES>
227
235
  <QUESTION_CATEGORY>
@@ -647,7 +655,7 @@
647
655
  <MOD>
648
656
  <ID>210</ID>
649
657
  <MODTYPE>wiki</MODTYPE>
650
- <NAME>My Wiki</NAME>
658
+ <NAME>My wiki</NAME>
651
659
  <SUMMARY>This is my wiki. There are many like it, but this one is mine.</SUMMARY>
652
660
  <PAGENAME>My Wiki</PAGENAME>
653
661
  <WTYPE>group</WTYPE>
@@ -0,0 +1,357 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <MOODLE_BACKUP>
3
+ <INFO>
4
+ <NAME>moodle_backup.zip</NAME>
5
+ </INFO>
6
+ <COURSE>
7
+ <HEADER>
8
+ <ID>55555</ID>
9
+ <FULLNAME>My Course</FULLNAME>
10
+ <SHORTNAME>EDU 101</SHORTNAME>
11
+ <STARTDATE>1339390800</STARTDATE>
12
+ <VISIBLE>1</VISIBLE>
13
+ <FORMAT>weeks</FORMAT>
14
+ </HEADER>
15
+ <SECTIONS>
16
+ <SECTION>
17
+ <ID>12345</ID>
18
+ <NUMBER>0</NUMBER>
19
+ <SUMMARY>&lt;h1&gt;This is the Syllabus&lt;/h1&gt;</SUMMARY>
20
+ <VISIBLE>1</VISIBLE>
21
+ <MODS>
22
+ <MOD>
23
+ <ID>11111</ID>
24
+ <TYPE>quiz</TYPE>
25
+ <INSTANCE>98989</INSTANCE>
26
+ <ADDED>1343752552</ADDED>
27
+ <SCORE>0</SCORE>
28
+ <INDENT>0</INDENT>
29
+ <VISIBLE>1</VISIBLE>
30
+ <GROUPMODE>0</GROUPMODE>
31
+ <GROUPINGID>0</GROUPINGID>
32
+ <GROUPMEMBERSONLY>0</GROUPMEMBERSONLY>
33
+ <IDNUMBER></IDNUMBER>
34
+ <ROLES_OVERRIDES>
35
+ </ROLES_OVERRIDES>
36
+ <ROLES_ASSIGNMENTS>
37
+ </ROLES_ASSIGNMENTS>
38
+ </MOD>
39
+ </MODS>
40
+ </SECTION>
41
+ </SECTIONS>
42
+ <QUESTION_CATEGORIES>
43
+ <QUESTION_CATEGORY>
44
+ <ID>121</ID>
45
+ <NAME>Default Question Category</NAME>
46
+ <INFO>The default category for questions.</INFO>
47
+ <CONTEXT>
48
+ <LEVEL>course</LEVEL>
49
+ </CONTEXT>
50
+ <STAMP>moodle19.divergentlogic.com+120607210554+LT0tLH</STAMP>
51
+ <PARENT>0</PARENT>
52
+ <SORTORDER>999</SORTORDER>
53
+ <QUESTIONS>
54
+ <QUESTION>
55
+ <ID>656</ID>
56
+ <PARENT>0</PARENT>
57
+ <NAME>Short Answer</NAME>
58
+ <QUESTIONTEXT>What is your favorite programming language?</QUESTIONTEXT>
59
+ <QUESTIONTEXTFORMAT>1</QUESTIONTEXTFORMAT>
60
+ <IMAGE></IMAGE>
61
+ <GENERALFEEDBACK>Yay!</GENERALFEEDBACK>
62
+ <DEFAULTGRADE>1</DEFAULTGRADE>
63
+ <PENALTY>0.1</PENALTY>
64
+ <QTYPE>shortanswer</QTYPE>
65
+ <LENGTH>1</LENGTH>
66
+ <STAMP>moodle19.divergentlogic.com+120611201429+lvcAKV</STAMP>
67
+ <VERSION>moodle19.divergentlogic.com+120611201429+futzCM</VERSION>
68
+ <HIDDEN>0</HIDDEN>
69
+ <TIMECREATED>1339445669</TIMECREATED>
70
+ <TIMEMODIFIED>1339445669</TIMEMODIFIED>
71
+ <CREATEDBY>2</CREATEDBY>
72
+ <MODIFIEDBY>2</MODIFIEDBY>
73
+ <SHORTANSWER>
74
+ <ANSWERS>40,41,42</ANSWERS>
75
+ <USECASE>0</USECASE>
76
+ </SHORTANSWER>
77
+ <ANSWERS>
78
+ <ANSWER>
79
+ <ID>40</ID>
80
+ <ANSWER_TEXT>Ruby</ANSWER_TEXT>
81
+ <FRACTION>1</FRACTION>
82
+ <FEEDBACK>Good choice!</FEEDBACK>
83
+ </ANSWER>
84
+ <ANSWER>
85
+ <ID>41</ID>
86
+ <ANSWER_TEXT>JavaScript</ANSWER_TEXT>
87
+ <FRACTION>0.5</FRACTION>
88
+ <FEEDBACK>Not what I would have chosen...</FEEDBACK>
89
+ </ANSWER>
90
+ <ANSWER>
91
+ <ID>42</ID>
92
+ <ANSWER_TEXT>Java</ANSWER_TEXT>
93
+ <FRACTION>0.1</FRACTION>
94
+ <FEEDBACK>You're kidding, right?</FEEDBACK>
95
+ </ANSWER>
96
+ </ANSWERS>
97
+ </QUESTION>
98
+ <QUESTION>
99
+ <ID>545</ID>
100
+ <PARENT>0</PARENT>
101
+ <NAME>True or False</NAME>
102
+ <QUESTIONTEXT>True or False: You are taking a quiz right now.</QUESTIONTEXT>
103
+ <QUESTIONTEXTFORMAT>1</QUESTIONTEXTFORMAT>
104
+ <IMAGE></IMAGE>
105
+ <GENERALFEEDBACK>Amazing!</GENERALFEEDBACK>
106
+ <DEFAULTGRADE>1</DEFAULTGRADE>
107
+ <PENALTY>1</PENALTY>
108
+ <QTYPE>truefalse</QTYPE>
109
+ <LENGTH>1</LENGTH>
110
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
111
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
112
+ <HIDDEN>0</HIDDEN>
113
+ <TIMECREATED>1339445938</TIMECREATED>
114
+ <TIMEMODIFIED>1339445938</TIMEMODIFIED>
115
+ <CREATEDBY>2</CREATEDBY>
116
+ <MODIFIEDBY>2</MODIFIEDBY>
117
+ <TRUEFALSE>
118
+ <TRUEANSWER>44</TRUEANSWER>
119
+ <FALSEANSWER>45</FALSEANSWER>
120
+ </TRUEFALSE>
121
+ <ANSWERS>
122
+ <ANSWER>
123
+ <ID>44</ID>
124
+ <ANSWER_TEXT>True</ANSWER_TEXT>
125
+ <FRACTION>1</FRACTION>
126
+ <FEEDBACK>Smarty pants!</FEEDBACK>
127
+ </ANSWER>
128
+ <ANSWER>
129
+ <ID>45</ID>
130
+ <ANSWER_TEXT>False</ANSWER_TEXT>
131
+ <FRACTION>0</FRACTION>
132
+ <FEEDBACK>What exactly are you doing?</FEEDBACK>
133
+ </ANSWER>
134
+ </ANSWERS>
135
+ </QUESTION>
136
+ <QUESTION>
137
+ <ID>434</ID>
138
+ <PARENT>434</PARENT>
139
+ <NAME>Random Question (Random Quiz)</NAME>
140
+ <QUESTIONTEXT>1</QUESTIONTEXT>
141
+ <QUESTIONTEXTFORMAT>0</QUESTIONTEXTFORMAT>
142
+ <IMAGE></IMAGE>
143
+ <GENERALFEEDBACK></GENERALFEEDBACK>
144
+ <DEFAULTGRADE>1</DEFAULTGRADE>
145
+ <PENALTY>0</PENALTY>
146
+ <QTYPE>random</QTYPE>
147
+ <LENGTH>1</LENGTH>
148
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
149
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
150
+ <HIDDEN>0</HIDDEN>
151
+ <TIMECREATED>1233796544</TIMECREATED>
152
+ <TIMEMODIFIED>1233796544</TIMEMODIFIED>
153
+ <CREATEDBY>1781</CREATEDBY>
154
+ <MODIFIEDBY>1781</MODIFIEDBY>
155
+ </QUESTION>
156
+ <QUESTION>
157
+ <ID>323</ID>
158
+ <PARENT>323</PARENT>
159
+ <NAME>Random Question (Random Quiz)</NAME>
160
+ <QUESTIONTEXT>1</QUESTIONTEXT>
161
+ <QUESTIONTEXTFORMAT>0</QUESTIONTEXTFORMAT>
162
+ <IMAGE></IMAGE>
163
+ <GENERALFEEDBACK></GENERALFEEDBACK>
164
+ <DEFAULTGRADE>1</DEFAULTGRADE>
165
+ <PENALTY>0</PENALTY>
166
+ <QTYPE>random</QTYPE>
167
+ <LENGTH>1</LENGTH>
168
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
169
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
170
+ <HIDDEN>0</HIDDEN>
171
+ <TIMECREATED>1233796544</TIMECREATED>
172
+ <TIMEMODIFIED>1233796544</TIMEMODIFIED>
173
+ <CREATEDBY>1781</CREATEDBY>
174
+ <MODIFIEDBY>1781</MODIFIEDBY>
175
+ </QUESTION>
176
+ <QUESTION>
177
+ <ID>212</ID>
178
+ <PARENT>212</PARENT>
179
+ <NAME>Random Question (Random Quiz)</NAME>
180
+ <QUESTIONTEXT>1</QUESTIONTEXT>
181
+ <QUESTIONTEXTFORMAT>0</QUESTIONTEXTFORMAT>
182
+ <IMAGE></IMAGE>
183
+ <GENERALFEEDBACK></GENERALFEEDBACK>
184
+ <DEFAULTGRADE>1</DEFAULTGRADE>
185
+ <PENALTY>0</PENALTY>
186
+ <QTYPE>random</QTYPE>
187
+ <LENGTH>1</LENGTH>
188
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
189
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
190
+ <HIDDEN>0</HIDDEN>
191
+ <TIMECREATED>1233796544</TIMECREATED>
192
+ <TIMEMODIFIED>1233796544</TIMEMODIFIED>
193
+ <CREATEDBY>1781</CREATEDBY>
194
+ <MODIFIEDBY>1781</MODIFIEDBY>
195
+ </QUESTION>
196
+ <QUESTION>
197
+ <ID>101</ID>
198
+ <PARENT>101</PARENT>
199
+ <NAME>Random Question (Random Quiz)</NAME>
200
+ <QUESTIONTEXT>1</QUESTIONTEXT>
201
+ <QUESTIONTEXTFORMAT>0</QUESTIONTEXTFORMAT>
202
+ <IMAGE></IMAGE>
203
+ <GENERALFEEDBACK></GENERALFEEDBACK>
204
+ <DEFAULTGRADE>1</DEFAULTGRADE>
205
+ <PENALTY>0</PENALTY>
206
+ <QTYPE>random</QTYPE>
207
+ <LENGTH>1</LENGTH>
208
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
209
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
210
+ <HIDDEN>0</HIDDEN>
211
+ <TIMECREATED>1233796544</TIMECREATED>
212
+ <TIMEMODIFIED>1233796544</TIMEMODIFIED>
213
+ <CREATEDBY>1781</CREATEDBY>
214
+ <MODIFIEDBY>1781</MODIFIEDBY>
215
+ </QUESTION>
216
+ </QUESTIONS>
217
+ </QUESTION_CATEGORY>
218
+ <QUESTION_CATEGORY>
219
+ <ID>212</ID>
220
+ <NAME>Second Question Category</NAME>
221
+ <INFO>The second category for questions.</INFO>
222
+ <CONTEXT>
223
+ <LEVEL>course</LEVEL>
224
+ </CONTEXT>
225
+ <STAMP>moodle19.divergentlogic.com+120607210554+LT0tLH</STAMP>
226
+ <PARENT>0</PARENT>
227
+ <SORTORDER>999</SORTORDER>
228
+ <QUESTIONS>
229
+ <QUESTION>
230
+ <ID>878</ID>
231
+ <PARENT>0</PARENT>
232
+ <NAME>Numerical Question</NAME>
233
+ <QUESTIONTEXT>How old are you?</QUESTIONTEXT>
234
+ <QUESTIONTEXTFORMAT>1</QUESTIONTEXTFORMAT>
235
+ <IMAGE></IMAGE>
236
+ <GENERALFEEDBACK>Wow, you're old!</GENERALFEEDBACK>
237
+ <DEFAULTGRADE>1</DEFAULTGRADE>
238
+ <PENALTY>0.1</PENALTY>
239
+ <QTYPE>numerical</QTYPE>
240
+ <LENGTH>1</LENGTH>
241
+ <STAMP>moodle19.divergentlogic.com+120611201635+dGu0Ws</STAMP>
242
+ <VERSION>moodle19.divergentlogic.com+120611201635+bUiSIi</VERSION>
243
+ <HIDDEN>0</HIDDEN>
244
+ <TIMECREATED>1339445795</TIMECREATED>
245
+ <TIMEMODIFIED>1339445795</TIMEMODIFIED>
246
+ <CREATEDBY>2</CREATEDBY>
247
+ <MODIFIEDBY>2</MODIFIEDBY>
248
+ <NUMERICAL>
249
+ <ANSWER>43</ANSWER>
250
+ <TOLERANCE>2</TOLERANCE>
251
+ </NUMERICAL>
252
+ <ANSWERS>
253
+ <ANSWER>
254
+ <ID>43</ID>
255
+ <ANSWER_TEXT>28</ANSWER_TEXT>
256
+ <FRACTION>1</FRACTION>
257
+ <FEEDBACK>Great age!</FEEDBACK>
258
+ </ANSWER>
259
+ </ANSWERS>
260
+ </QUESTION>
261
+ <QUESTION>
262
+ <ID>767</ID>
263
+ <PARENT>767</PARENT>
264
+ <NAME>Random Question (Random Quiz)</NAME>
265
+ <QUESTIONTEXT>1</QUESTIONTEXT>
266
+ <QUESTIONTEXTFORMAT>0</QUESTIONTEXTFORMAT>
267
+ <IMAGE></IMAGE>
268
+ <GENERALFEEDBACK></GENERALFEEDBACK>
269
+ <DEFAULTGRADE>1</DEFAULTGRADE>
270
+ <PENALTY>0</PENALTY>
271
+ <QTYPE>random</QTYPE>
272
+ <LENGTH>1</LENGTH>
273
+ <STAMP>moodle19.divergentlogic.com+120611201858+mzdsN2</STAMP>
274
+ <VERSION>moodle19.divergentlogic.com+120611201859+VUUftZ</VERSION>
275
+ <HIDDEN>0</HIDDEN>
276
+ <TIMECREATED>1233796544</TIMECREATED>
277
+ <TIMEMODIFIED>1233796544</TIMEMODIFIED>
278
+ <CREATEDBY>1781</CREATEDBY>
279
+ <MODIFIEDBY>1781</MODIFIEDBY>
280
+ </QUESTION>
281
+ </QUESTIONS>
282
+ </QUESTION_CATEGORY>
283
+ </QUESTION_CATEGORIES>
284
+ <MODULES>
285
+ <MOD>
286
+ <ID>98989</ID>
287
+ <MODTYPE>quiz</MODTYPE>
288
+ <NAME>Random Quiz</NAME>
289
+ <INTRO>Random Quiz</INTRO>
290
+ <TIMEOPEN>0</TIMEOPEN>
291
+ <TIMECLOSE>0</TIMECLOSE>
292
+ <OPTIONFLAGS>1</OPTIONFLAGS>
293
+ <PENALTYSCHEME>1</PENALTYSCHEME>
294
+ <ATTEMPTS_NUMBER>2</ATTEMPTS_NUMBER>
295
+ <ATTEMPTONLAST>1</ATTEMPTONLAST>
296
+ <GRADEMETHOD>1</GRADEMETHOD>
297
+ <DECIMALPOINTS>2</DECIMALPOINTS>
298
+ <REVIEW>4652015</REVIEW>
299
+ <QUESTIONSPERPAGE>10</QUESTIONSPERPAGE>
300
+ <SHUFFLEQUESTIONS>1</SHUFFLEQUESTIONS>
301
+ <SHUFFLEANSWERS>1</SHUFFLEANSWERS>
302
+ <QUESTIONS>1111,1112,1113,1114,1115,1116,0</QUESTIONS>
303
+ <SUMGRADES>7</SUMGRADES>
304
+ <GRADE>10</GRADE>
305
+ <TIMECREATED>0</TIMECREATED>
306
+ <TIMEMODIFIED>1343752551</TIMEMODIFIED>
307
+ <TIMELIMIT>45</TIMELIMIT>
308
+ <PASSWORD>password</PASSWORD>
309
+ <SUBNET></SUBNET>
310
+ <POPUP>1</POPUP>
311
+ <DELAY1>7200</DELAY1>
312
+ <DELAY2>7200</DELAY2>
313
+ <QUESTION_INSTANCES>
314
+ <QUESTION_INSTANCE>
315
+ <ID>1111</ID>
316
+ <QUESTION>434</QUESTION>
317
+ <GRADE>1</GRADE>
318
+ </QUESTION_INSTANCE>
319
+ <QUESTION_INSTANCE>
320
+ <ID>1112</ID>
321
+ <QUESTION>323</QUESTION>
322
+ <GRADE>1</GRADE>
323
+ </QUESTION_INSTANCE>
324
+ <QUESTION_INSTANCE>
325
+ <ID>1113</ID>
326
+ <QUESTION>212</QUESTION>
327
+ <GRADE>2</GRADE>
328
+ </QUESTION_INSTANCE>
329
+ <QUESTION_INSTANCE>
330
+ <ID>1114</ID>
331
+ <QUESTION>545</QUESTION>
332
+ <GRADE>1</GRADE>
333
+ </QUESTION_INSTANCE>
334
+ <QUESTION_INSTANCE>
335
+ <ID>1115</ID>
336
+ <QUESTION>101</QUESTION>
337
+ <GRADE>1</GRADE>
338
+ </QUESTION_INSTANCE>
339
+ <QUESTION_INSTANCE>
340
+ <ID>1116</ID>
341
+ <QUESTION>767</QUESTION>
342
+ <GRADE>1</GRADE>
343
+ </QUESTION_INSTANCE>
344
+ </QUESTION_INSTANCES>
345
+ <FEEDBACKS>
346
+ <FEEDBACK>
347
+ <ID>44</ID>
348
+ <QUIZID>98989</QUIZID>
349
+ <FEEDBACKTEXT></FEEDBACKTEXT>
350
+ <MINGRADE>0</MINGRADE>
351
+ <MAXGRADE>11</MAXGRADE>
352
+ </FEEDBACK>
353
+ </FEEDBACKS>
354
+ </MOD>
355
+ </MODULES>
356
+ </COURSE>
357
+ </MOODLE_BACKUP>