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 <jenkins@instructure.com>
Reviewed-by: Ryan Taylor <rtaylor@instructure.com>
Reviewed-by: Derek DeVries <ddevries@instructure.com>
QA-Review: Trevor deHaan <tdehaan@instructure.com>
Product-Review: Derek DeVries <ddevries@instructure.com>
This commit is contained in:
Ahmad Amireh 2014-09-10 08:16:51 +03:00 committed by Derek DeVries
parent c14f18cb85
commit fe0e9ea24a
6 changed files with 51 additions and 21 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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