diff --git a/app/controllers/discussion_topics_controller.rb b/app/controllers/discussion_topics_controller.rb index 0ec2758f575..81f4436bb08 100644 --- a/app/controllers/discussion_topics_controller.rb +++ b/app/controllers/discussion_topics_controller.rb @@ -717,8 +717,8 @@ class DiscussionTopicsController < ApplicationController :COURSE_ID => @sequence_asset.context.id, } end - if @topic.for_assignment? && - @topic.assignment.grants_right?(@current_user, session, :grade) && @presenter.allows_speed_grader? + if @topic.for_assignment? && @presenter.allows_speed_grader? && + @topic.assignment.can_view_speed_grader?(@current_user) env_hash[:SPEEDGRADER_URL_TEMPLATE] = named_context_url(@topic.assignment.context, :speed_grader_context_gradebook_url, :assignment_id => @topic.assignment.id, diff --git a/app/controllers/gradebooks_controller.rb b/app/controllers/gradebooks_controller.rb index 364d7aabc15..449f2443044 100644 --- a/app/controllers/gradebooks_controller.rb +++ b/app/controllers/gradebooks_controller.rb @@ -574,6 +574,12 @@ class GradebooksController < ApplicationController return unless authorized_action(@context, @current_user, [:manage_grades, :view_all_grades]) @assignment = @context.assignments.active.find(params[:assignment_id]) + + unless @assignment.can_view_speed_grader?(@current_user) + flash[:notice] = t('The maximum number of graders for this assignment has been reached.') + return redirect_to(course_gradebook_path(@context)) + end + if @assignment.unpublished? flash[:notice] = t(:speedgrader_enabled_only_for_published_content, 'SpeedGrader is enabled only for published content.') diff --git a/app/models/assignment.rb b/app/models/assignment.rb index 5afac813262..227156de010 100644 --- a/app/models/assignment.rb +++ b/app/models/assignment.rb @@ -2792,6 +2792,21 @@ class Assignment < ActiveRecord::Base [grader_count, max_course_count].max end + def moderated_grader_limit_reached? + moderated_grading? && anonymous_moderated_marking? && moderation_graders.count >= grader_count + end + + def can_be_moderated_grader?(user) + return false unless context.grants_any_right?(user, :manage_grades, :view_all_grades) + return true unless moderated_grader_limit_reached? + # Final grader can always be a moderated grader, and existing moderated graders can re-grade + final_grader_id == user.id || moderation_graders.where(user_id: user.id).exists? + end + + def can_view_speed_grader?(user) + context.allows_speed_grader? && can_be_moderated_grader?(user) + end + def can_view_other_grader_identities?(user) return false unless context.grants_any_right?(user, :manage_grades, :view_all_grades) return true unless anonymous_moderated_marking? && moderated_grading? diff --git a/app/serializers/quizzes/quiz_serializer.rb b/app/serializers/quizzes/quiz_serializer.rb index 8d05d75a35e..5616d50ead0 100644 --- a/app/serializers/quizzes/quiz_serializer.rb +++ b/app/serializers/quizzes/quiz_serializer.rb @@ -317,7 +317,7 @@ module Quizzes private def show_speedgrader? - quiz.assignment.present? && quiz.published? && context.allows_speed_grader? + quiz.assignment.present? && quiz.published? && quiz.assignment.can_view_speed_grader?(current_user) end def quiz_locked_for_user? diff --git a/app/serializers/quizzes/quiz_statistics_serializer.rb b/app/serializers/quizzes/quiz_statistics_serializer.rb index aaf04c4940a..f034b84f877 100644 --- a/app/serializers/quizzes/quiz_statistics_serializer.rb +++ b/app/serializers/quizzes/quiz_statistics_serializer.rb @@ -166,7 +166,7 @@ module Quizzes private def show_speed_grader? - quiz.assignment.present? && quiz.published? && context.allows_speed_grader? + quiz.assignment.present? && quiz.published? && quiz.assignment.can_view_speed_grader?(current_user) end def student_analysis_report diff --git a/app/views/assignments/_grade_assignment.html.erb b/app/views/assignments/_grade_assignment.html.erb index fabeaa70a71..8fea7e66eaa 100644 --- a/app/views/assignments/_grade_assignment.html.erb +++ b/app/views/assignments/_grade_assignment.html.erb @@ -18,7 +18,8 @@