From fe0e9ea24a7d0c4fbf663360559e9d4689a09cf6 Mon Sep 17 00:00:00 2001 From: Ahmad Amireh Date: Wed, 10 Sep 2014 08:16:51 +0300 Subject: [PATCH] Quiz index: auto-grade all outstanding course subs Closes CNVS-15402 TEST PLAN ---- ---- - create 2+ quizzes in a course - make some submissions, don't turn them in - go to quizzes index - verify your submissions are now graded (you may have to wait a bit since it's done in a background job) Change-Id: I80af5523f7549120ca81a5029d9681ddd511bb2b Reviewed-on: https://gerrit.instructure.com/40862 Tested-by: Jenkins Reviewed-by: Ryan Taylor Reviewed-by: Derek DeVries QA-Review: Trevor deHaan Product-Review: Derek DeVries --- app/controllers/quizzes/quizzes_controller.rb | 2 +- app/models/quizzes/submission_grader.rb | 17 ------------ app/models/quizzes/submission_manager.rb | 13 ++++++++++ .../quizzes/quizzes_controller_spec.rb | 9 +++++++ .../models/quizzes/submission_manager_spec.rb | 26 +++++++++++++++++++ spec/selenium/student_quizzes_spec.rb | 5 ++-- 6 files changed, 51 insertions(+), 21 deletions(-) diff --git a/app/controllers/quizzes/quizzes_controller.rb b/app/controllers/quizzes/quizzes_controller.rb index 3c4ddff851d..e3780139b3f 100644 --- a/app/controllers/quizzes/quizzes_controller.rb +++ b/app/controllers/quizzes/quizzes_controller.rb @@ -110,7 +110,7 @@ class Quizzes::QuizzesController < ApplicationController # TODO: stop doing this here if @current_user.present? - Quizzes::SubmissionGrader.send_later(:grade_outstanding_submissions_in_course, + Quizzes::SubmissionManager.send_later_if_production(:grade_outstanding_submissions_in_course, @current_user.id, @context.id, @context.class.to_s) end diff --git a/app/models/quizzes/submission_grader.rb b/app/models/quizzes/submission_grader.rb index 02b621bcf20..4a4e8728c6b 100644 --- a/app/models/quizzes/submission_grader.rb +++ b/app/models/quizzes/submission_grader.rb @@ -109,10 +109,6 @@ module Quizzes end end - def self.grade_outstanding_submissions_in_course(user_id, context_id, context_type) - self.new.send(:grade_outstanding_submissions_in_course, user_id, context_id, context_type) - end - private def questions_and_alignments(question_ids) @@ -128,18 +124,5 @@ module Quizzes :content_id => bank_ids). includes(:learning_outcome, :context).all end - - def grade_outstanding_submissions_in_course(user_id, context_id, context_type) - user = User.find(user_id) - user.quiz_submissions - .where('quizzes.context_id=? AND quizzes.context_type=?', context_id, context_type) - .includes(:quiz) - .select(&:needs_grading?) - .each do |quiz_submission| - Quizzes::SubmissionGrader.new(quiz_submission).grade_submission({ - finished_at: quiz_submission.end_at - }) - end - end end end diff --git a/app/models/quizzes/submission_manager.rb b/app/models/quizzes/submission_manager.rb index 3b025569170..dcd67cd2670 100644 --- a/app/models/quizzes/submission_manager.rb +++ b/app/models/quizzes/submission_manager.rb @@ -28,6 +28,19 @@ module Quizzes s end + def self.grade_outstanding_submissions_in_course(user_id, context_id, context_type) + user = User.find(user_id) + user.quiz_submissions + .where('quizzes.context_id=? AND quizzes.context_type=?', context_id, context_type) + .includes(:quiz) + .select(&:needs_grading?) + .each do |quiz_submission| + Quizzes::SubmissionGrader.new(quiz_submission).grade_submission({ + finished_at: quiz_submission.end_at + }) + end + end + private # this is needed because Rails 2 expects a User object instead of an id def generate_build_hash(query_hash, user) diff --git a/spec/controllers/quizzes/quizzes_controller_spec.rb b/spec/controllers/quizzes/quizzes_controller_spec.rb index bd6c0c31c3d..32eb138eb2f 100644 --- a/spec/controllers/quizzes/quizzes_controller_spec.rb +++ b/spec/controllers/quizzes/quizzes_controller_spec.rb @@ -136,6 +136,15 @@ describe Quizzes::QuizzesController do quiz[:published].should be_true end end + + it 'should implicitly grade outstanding submissions for user in course' do + user_session(@student) + course_quiz(active = true) + + Quizzes::SubmissionManager.expects(:grade_outstanding_submissions_in_course) + + get 'index', :course_id => @course.id + end end describe "GET 'index' with quiz stats disabled" do diff --git a/spec/models/quizzes/submission_manager_spec.rb b/spec/models/quizzes/submission_manager_spec.rb index 9ba2eb22d21..d8d17b9a42f 100644 --- a/spec/models/quizzes/submission_manager_spec.rb +++ b/spec/models/quizzes/submission_manager_spec.rb @@ -105,4 +105,30 @@ describe Quizzes::SubmissionManager do end end end + + describe '#grade_outstanding_submissions_in_course' do + it 'should work' do + student = student_in_course(active_all: true).user + quizzes = 2.times.map { @course.quizzes.create! } + + ungraded_qs = quizzes[0].generate_submission(student).tap do |qs| + qs.submission_data = {} + qs.end_at = 5.minutes.ago + qs.save! + end + + graded_qs = quizzes[1].generate_submission(student).tap do |qs| + qs.complete!({}) + end + + ungraded_qs.needs_grading?.should be true + graded_qs.needs_grading?.should be false + + described_class.grade_outstanding_submissions_in_course(student.id, + @course.id, @course.class.to_s) + + ungraded_qs.reload + ungraded_qs.needs_grading?.should be false + end + end end diff --git a/spec/selenium/student_quizzes_spec.rb b/spec/selenium/student_quizzes_spec.rb index d47c1844c83..f5499211a1c 100644 --- a/spec/selenium/student_quizzes_spec.rb +++ b/spec/selenium/student_quizzes_spec.rb @@ -128,9 +128,8 @@ describe "quizzes" do @qsub.end_at = 5.minutes.ago @qsub.save! get "/courses/#{@course.id}/quizzes" - Delayed::Job.find_by_tag( - 'Quizzes::SubmissionGrader.grade_outstanding_submissions_in_course' - ).should be_present + @qsub.reload + @qsub.needs_grading?.should be_false end end