canvas-lms/lib/tasks/canvas/quizzes.rake

70 lines
2.5 KiB
Ruby

namespace :canvas do
namespace :quizzes do
desc 'Generate events from snapshots for submissions to a quiz.'
task :generate_events_from_snapshots, [ :quiz_id ] => :environment do |t, args|
quiz_id = Array(args[:quiz_id])
quiz_submission_ids = Quizzes::QuizSubmission.where(quiz_id: quiz_id)
model = Quizzes::QuizSubmissionEvent
parser = Quizzes::LogAuditing::SnapshotScraper.new
model.transaction do
snapshots = Quizzes::QuizSubmissionSnapshot.
where(quiz_submission_id: quiz_submission_ids).
preload(:quiz_submission).
reject { |snapshot| snapshot.quiz_submission.nil? }
puts "Generating #{snapshots.length} events..."
parser.events_from_snapshots(snapshots).map(&:save!)
puts "#{events.length} events were generated."
end # model.transaction
end # task :generate_events_from_snapshots
desc "Generate a JSON dump of events in a single quiz submission."
task :dump_events, [ :quiz_submission_id, :out ] => :environment do |t, args|
require 'json'
require 'benchmark'
unless out_path = args[:out]
raise "Missing path to output file."
end
events = nil
puts '*' * 80
puts '-' * 80
puts "Extracting events from snapshots of quiz submission #{args[:quiz_submission_id]}..."
elapsed = Benchmark.realtime do
parser = Quizzes::LogAuditing::SnapshotScraper.new
quiz_submission = Quizzes::QuizSubmission.find(args[:quiz_submission_id])
snapshots = Quizzes::QuizSubmissionSnapshot.where({
quiz_submission_id: quiz_submission.id,
attempt: quiz_submission.attempt
})
events = parser.events_from_snapshots(snapshots)
end
puts "\tNumber of events extracted: #{events.length}"
puts "\tExtraction finished in #{(elapsed * 1000).round} milliseconds."
puts "Creating a JSON dump of the snapshot events to #{out_path}..."
File.write(out_path, events.to_json(include_root: false))
puts "\tBlob size: #{File.size(out_path)}b (#{(File.size(out_path) / 1000).round}K)"
puts "\tBlob signature: #{Digest::MD5.hexdigest(File.read(out_path))}"
puts "Done. Bye!"
puts '*' * 80
end
desc 'Create partition tables for the current and upcoming months.'
task :create_event_partitions => :environment do |t, args|
Shard.with_each_shard do
Quizzes::QuizSubmissionEventPartitioner.logger = Logger.new(STDOUT)
Quizzes::QuizSubmissionEventPartitioner.process
end
end
end
end