Class: Senkyoshi::RuleCriteria

Inherits:
Object
  • Object
show all
Includes:
Senkyoshi
Defined in:
lib/senkyoshi/models/rule_criteria.rb

Direct Known Subclasses

ContentReviewedCriteria, GradeCriteria

Constant Summary collapse

COMPLETION_TYPES =
{
  must_view: "must_view",
  must_submit: "must_submit",
  min_score: "min_score",
  must_contribute: "must_contribute",
}.freeze

Constants included from Senkyoshi

DIR_BASE, FILE_BASE, MAIN_CANVAS_MODULE, MASTER_MODULE, PRE_RESOURCE_TYPE, RESOURCE_TYPE, VERSION

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Senkyoshi

build_file, build_heirarchy, cleanup, configure, connect_content, create_canvas_course, create_random_hex, get_attribute_value, get_description, get_single_pre_data, get_text, initialize_course, iterate_files, iterate_xml, iterator_master, parse, parse_and_process_single, pre_iterator, read_file, reset, true?

Constructor Details

#initialize(id, negated) ⇒ RuleCriteria

Returns a new instance of RuleCriteria.



30
31
32
33
# File 'lib/senkyoshi/models/rule_criteria.rb', line 30

def initialize(id, negated)
  @id = id
  @negated = negated
end

Instance Attribute Details

#asidata_idObject (readonly)

Returns the value of attribute asidata_id.



21
22
23
# File 'lib/senkyoshi/models/rule_criteria.rb', line 21

def asidata_id
  @asidata_id
end

#content_idObject (readonly)

Returns the value of attribute content_id.



21
22
23
# File 'lib/senkyoshi/models/rule_criteria.rb', line 21

def content_id
  @content_id
end

#idObject (readonly)

Returns the value of attribute id.



21
22
23
# File 'lib/senkyoshi/models/rule_criteria.rb', line 21

def id
  @id
end

#negatedObject (readonly)

Returns the value of attribute negated.



21
22
23
# File 'lib/senkyoshi/models/rule_criteria.rb', line 21

def negated
  @negated
end

Class Method Details

.from_xml(xml) ⇒ Object



58
59
60
# File 'lib/senkyoshi/models/rule_criteria.rb', line 58

def self.from_xml(xml)
  new(RuleCriteria.get_id(xml), RuleCriteria.get_negated(xml))
end

.get_id(xml) ⇒ Object



50
51
52
# File 'lib/senkyoshi/models/rule_criteria.rb', line 50

def self.get_id(xml)
  xml.xpath("./@id").text
end

.get_negated(xml) ⇒ Object



54
55
56
# File 'lib/senkyoshi/models/rule_criteria.rb', line 54

def self.get_negated(xml)
  xml.xpath("./NEGATED/@value").text
end

.in_same_module?(modules, content_id, resource_id) ⇒ Boolean

Determine two identifierrefs are pointed to by items in the same module

Returns:

  • (Boolean)


64
65
66
67
68
69
# File 'lib/senkyoshi/models/rule_criteria.rb', line 64

def self.in_same_module?(modules, content_id, resource_id)
  content_module = Module.find_module_from_item_id(modules, content_id)
  resource_module = Module.find_module_from_item_id(modules, resource_id)
  return nil if content_module.nil? || resource_module.nil?
  content_module == resource_module
end

.module_completion_requirement?(modules, content_id, resource_id) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/senkyoshi/models/rule_criteria.rb', line 75

def self.module_completion_requirement?(modules, content_id, resource_id)
  in_same_module?(modules, content_id, resource_id) == true
end

.module_prerequisite?(modules, content_id, resource_id) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/senkyoshi/models/rule_criteria.rb', line 71

def self.module_prerequisite?(modules, content_id, resource_id)
  in_same_module?(modules, content_id, resource_id) == false
end

Instance Method Details

#add_if_unique(collection, item) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/senkyoshi/models/rule_criteria.rb', line 35

def add_if_unique(collection, item)
  if collection.detect do |collection_item|
       yield(collection_item, item)
     end.nil?
    collection << item
  end
  collection
end

#add_to_module_if_unique(items, item) ⇒ Object



44
45
46
47
48
# File 'lib/senkyoshi/models/rule_criteria.rb', line 44

def add_to_module_if_unique(items, item)
  add_if_unique(
    items, item
  ) { |a, b| a.identifierref == b.identifierref }
end

#canvas_conversion(course, content_id, resources) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/senkyoshi/models/rule_criteria.rb', line 127

def canvas_conversion(course, content_id, resources)
  set_ids(content_id, resources)

  mod = Module.find_module_from_item_id course.canvas_modules, get_id

  is_completion = RuleCriteria.module_completion_requirement?(
    course.canvas_modules, get_id, get_foreign_id
  )

  is_prereq = RuleCriteria.module_prerequisite?(
    course.canvas_modules, get_id, get_foreign_id
  )

  if is_completion
    add_to_module_if_unique(
      mod.completion_requirements, make_completion(mod)
    )
  elsif is_prereq
    prereq_module = Module.find_module_from_item_id(
      course.canvas_modules, get_foreign_id
    )

    add_to_module_if_unique(
      mod.prerequisites, make_prereq(prereq_module)
    )

    add_to_module_if_unique(
      prereq_module.completion_requirements, make_completion(prereq_module)
    )
  end

  course
end

#get_idObject

Returns the most applicable id. If we have an assignment id return that, otherwise return the content id.



83
84
85
# File 'lib/senkyoshi/models/rule_criteria.rb', line 83

def get_id
  @asidata_id || @content_id
end

#make_completion(mod) ⇒ Object

Factory method to construct a completion requirement. Should be passed the module that the completion requirement should belong to



91
92
93
94
95
96
97
98
99
100
# File 'lib/senkyoshi/models/rule_criteria.rb', line 91

def make_completion(mod)
  CanvasCc::CanvasCC::Models::ModuleCompletionRequirement.new.tap do |req|
    mod_item = ModuleItem.find_item_from_id_ref(
      mod.module_items, get_foreign_id
    )

    req.identifierref = mod_item.identifier if mod_item
    req.type = get_completion_type
  end
end

#make_prereq(prereq_module) ⇒ Object

Factory method to construct a module prerequisite. Should be passed the prerequisite module



106
107
108
109
110
111
# File 'lib/senkyoshi/models/rule_criteria.rb', line 106

def make_prereq(prereq_module)
  CanvasCc::CanvasCC::Models::ModulePrerequisite.new.tap do |prereq|
    prereq.identifierref = prereq_module.identifier
    prereq.type = "context_module"
  end
end

#set_ids(content_id, resources) ⇒ Object

Use gradebook to find assignment id if applicable



116
117
118
119
120
121
122
123
124
125
# File 'lib/senkyoshi/models/rule_criteria.rb', line 116

def set_ids(content_id, resources)
  @content_id = content_id
  gradebook = resources.find_instances_of(Gradebook).first
  if gradebook
    outcome_def = gradebook.outcome_definitions.detect do |out_def|
      out_def.content_id == content_id
    end
    @asidata_id = outcome_def.asidataid if outcome_def
  end
end