Account for differentiated modules in modules_cache_key

flag = differentiated_modules
closes LF-1482

Test plan:
 - Start canvas with `ACTION_CONTROLLER_CACHING=true rails s`
 - Create 2 modules and add a different page to each of the modules
 - Visit the modules page as a student
 - As a teacher, add an override that does not target the student
   to 1 of the modules and to the page in the other module
 - Visit modules again as a student
 - Expect the differentiated objects to not appear

Change-Id: I3097e04ec31301afd9b7ab6fc9fba57897f8ea1f
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/346578
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Robin Kuss <rkuss@instructure.com>
QA-Review: Robin Kuss <rkuss@instructure.com>
Product-Review: Jackson Howe <jackson.howe@instructure.com>
This commit is contained in:
Jackson Howe 2024-05-01 16:13:52 -06:00
parent e6e44bfea2
commit a27bad0f74
5 changed files with 31 additions and 10 deletions

View File

@ -47,7 +47,7 @@ class ContextModulesController < ApplicationController
def modules_cache_key
@modules_cache_key ||= begin
visible_assignments = @current_user.try(:assignment_and_quiz_visibilities, @context)
visible_assignments = @current_user.try(:learning_object_visibilities, @context)
cache_key_items = [@context.cache_key,
@can_view,
@can_add,

View File

@ -24,7 +24,7 @@ module ContextModulesHelper
def cache_if_module(context_module, viewable, can_add, can_edit, can_delete, is_student, can_view_unpublished, user, context, &)
if context_module
visible_assignments = user ? user.assignment_and_quiz_visibilities(context) : []
visible_assignments = user ? user.learning_object_visibilities(context) : []
cache_key_items = ["context_module_render_22_",
context_module.cache_key,
viewable,

View File

@ -380,11 +380,17 @@ class User < ActiveRecord::Base
super
end
def assignment_and_quiz_visibilities(context)
RequestCache.cache("assignment_and_quiz_visibilities", self, context) do
def learning_object_visibilities(context)
RequestCache.cache("learning_object_visibilities", self, context) do
GuardRail.activate(:secondary) do
{ assignment_ids: DifferentiableAssignment.scope_filter(context.assignments, self, context).pluck(:id),
quiz_ids: DifferentiableAssignment.scope_filter(context.quizzes, self, context).pluck(:id) }
visibilities = { assignment_ids: DifferentiableAssignment.scope_filter(context.assignments, self, context).pluck(:id),
quiz_ids: DifferentiableAssignment.scope_filter(context.quizzes, self, context).pluck(:id) }
if Account.site_admin.feature_enabled?(:differentiated_modules)
visibilities[:context_module_ids] = DifferentiableAssignment.scope_filter(context.context_modules, self, context).pluck(:id)
visibilities[:discussion_topic_ids] = DifferentiableAssignment.scope_filter(context.discussion_topics, self, context).pluck(:id)
visibilities[:wiki_page_ids] = DifferentiableAssignment.scope_filter(context.wiki_pages, self, context).pluck(:id)
end
visibilities
end
end
end

View File

@ -1561,10 +1561,10 @@ describe ContextModule do
expect(@module.content_tags_visible_to(@student_2).map(&:content).include?(@assignment)).to be_falsey
end
it "alsoes have the right assignment_and_quiz_visibilities" do
expect(@teacher.assignment_and_quiz_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_truthy
expect(@student_1.assignment_and_quiz_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_truthy
expect(@student_2.assignment_and_quiz_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_falsey
it "has the right learning_object_visibilities" do
expect(@teacher.learning_object_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_truthy
expect(@student_1.learning_object_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_truthy
expect(@student_2.learning_object_visibilities(@course)[:assignment_ids].include?(@assignment.id)).to be_falsey
end
it "properly returns differentiated assignments for teacher even without update rights" do

View File

@ -4578,4 +4578,19 @@ describe User do
end
end
end
describe "learning_object_visibilities" do
before :once do
student_in_course(active_all: true)
end
it "includes assignment and quiz ids with the differentiated_modules flag disabled" do
expect(@user.learning_object_visibilities(@course).keys).to contain_exactly(:assignment_ids, :quiz_ids)
end
it "includes all learning object ids with the differentiated_modules flag enabled" do
Account.site_admin.enable_feature!(:differentiated_modules)
expect(@user.learning_object_visibilities(@course).keys).to contain_exactly(:assignment_ids, :quiz_ids, :context_module_ids, :discussion_topic_ids, :wiki_page_ids)
end
end
end