class CanvasCc::CanvasCC::QuestionWriter

Public Class Methods

register_writer_type(name) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 14
def self.register_writer_type(name)
  @@subclasses[name] = self
end
write_question(node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 6
def self.write_question(node, question)
  if c = @@subclasses[question.question_type]
    c.write_question_item_xml(node, question)
  else
    raise "Unknown question writer type: #{question.question_type}"
  end
end
write_question_item_xml(node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 18
def self.write_question_item_xml(node, question)
  node.item(:title => question.title, :ident => question.identifier) do |item_node|
    write_qti_metadata(item_node, question)
    write_presentation(item_node, question)
    write_resprocessing(item_node, question)
    write_general_feedback(item_node, question)
    write_additional_nodes(item_node, question)
  end
end

Private Class Methods

convert_fraction_to_score(fraction) click to toggle source

helper

# File lib/canvas_cc/canvas_cc/question_writer.rb, line 132
def self.convert_fraction_to_score(fraction)
  return 100 if fraction.nil?
  (100 * fraction).to_i
end
write_additional_nodes(item_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 113
def self.write_additional_nodes(item_node, question)
  # implement in sub-classes if needed
end
write_general_feedback(item_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 81
def self.write_general_feedback(item_node, question)
  if question.general_feedback && question.general_feedback.length > 0
    item_node.itemfeedback(:ident => 'general_fb') do |fb_node|
      fb_node.flow_mat do |flow_node|
        flow_node.material do |material_node|
          material_node.mattext(question.general_feedback, :texttype => 'text/html')
        end
      end
    end
  end

  if question.general_correct_feedback && question.general_correct_feedback.length > 0
    item_node.itemfeedback(:ident => 'general_correct_fb') do |fb_node|
      fb_node.flow_mat do |flow_node|
        flow_node.material do |material_node|
          material_node.mattext(question.general_correct_feedback, :texttype => 'text/html')
        end
      end
    end
  end

  if question.general_incorrect_feedback && question.general_incorrect_feedback.length > 0
    item_node.itemfeedback(:ident => 'general_incorrect_fb') do |fb_node|
      fb_node.flow_mat do |flow_node|
        flow_node.material do |material_node|
          material_node.mattext(question.general_incorrect_feedback, :texttype => 'text/html')
        end
      end
    end
  end
end
write_presentation(item_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 46
def self.write_presentation(item_node, question)
  item_node.presentation do |presentation_node|
    presentation_node.material do |material_node|
      material_node.mattext(question.material, :texttype => 'text/html')
    end

    write_responses(presentation_node, question)
  end
end
write_qti_metadata(item_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 30
def self.write_qti_metadata(item_node, question)
  item_node.itemmetadata do |meta_node|
    meta_node.qtimetadata do |qtime_node|
      CanvasCc::CanvasCC::Models::Question::QTI_META_ATTRIBUTES.each do |attr|
        value = question.send(attr).to_s
        if value && value.length > 0
          qtime_node.qtimetadatafield do |field_node|
            field_node.fieldlabel attr.to_s
            field_node.fieldentry value
          end
        end
      end
    end
  end
end
write_response_conditions(processing_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 77
def self.write_response_conditions(processing_node, question)
  raise "needs to be implemented in question writer subclass"
end
write_responses(presentation_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 56
def self.write_responses(presentation_node, question)
  raise "needs to be implemented in question writer subclass"
end
write_resprocessing(item_node, question) click to toggle source
# File lib/canvas_cc/canvas_cc/question_writer.rb, line 60
def self.write_resprocessing(item_node, question)
  item_node.resprocessing do |processing_node|
    processing_node.outcomes do |outcomes_node|
      outcomes_node.decvar(:maxvalue => '100', :minvalue => '0', :varname => 'SCORE', :vartype => 'Decimal')
    end
    if question.general_feedback
      processing_node.respcondition(:continue => 'Yes') do |condition_node|
        condition_node.conditionvar do |var_node|
          var_node.other
        end
        condition_node.displayfeedback(:feedbacktype => 'Response', :linkrefid => 'general_fb')
      end
    end
    write_response_conditions(processing_node, question)
  end
end
write_standard_answer_feedbacks(item_node, question) click to toggle source

used for 'multiple_choice_question', 'numerical_question', 'short_answer_question', 'true_false_question'

# File lib/canvas_cc/canvas_cc/question_writer.rb, line 118
def self.write_standard_answer_feedbacks(item_node, question)
  question.answers.each do |answer|
    next unless answer.feedback && answer.feedback.strip.length > 0
    item_node.itemfeedback(:ident => "#{answer.id}_fb") do |feedback_node|
      feedback_node.flow_mat do |flow_node|
        flow_node.material do |material_node|
          material_node.mattext answer.feedback, :texttype => 'text/html'
        end
      end
    end
  end
end