fix incorrect override caching through upcoming_events
test plan: * make sure the dashboard sidebar has correct due dates for overridden assignments closes #CNVS-23993 Change-Id: I09ab704768b51aebe294515aad1791340b51f67f Reviewed-on: https://gerrit.instructure.com/66467 Tested-by: Jenkins Reviewed-by: Derek Bender <djbender@instructure.com> QA-Review: Jason Carter <jcarter@instructure.com> Product-Review: James Williams <jamesw@instructure.com>
This commit is contained in:
parent
0b63ce6b4c
commit
1c549bfc82
|
@ -1885,10 +1885,12 @@ class Assignment < ActiveRecord::Base
|
|||
# Return all assignments and their active overrides where either the
|
||||
# assignment or one of its overrides is due between start and ending.
|
||||
scope :due_between_with_overrides, lambda { |start, ending|
|
||||
eager_load(:assignment_overrides).
|
||||
where('assignments.due_at BETWEEN ? AND ?
|
||||
OR assignment_overrides.due_at_overridden AND
|
||||
assignment_overrides.due_at BETWEEN ? AND ?', start, ending, start, ending)
|
||||
joins("LEFT OUTER JOIN #{AssignmentOverride.quoted_table_name} assignment_overrides
|
||||
ON assignment_overrides.assignment_id = assignments.id").
|
||||
group("assignments.id").
|
||||
where('assignments.due_at BETWEEN ? AND ?
|
||||
OR assignment_overrides.due_at_overridden AND
|
||||
assignment_overrides.due_at BETWEEN ? AND ?', start, ending, start, ending)
|
||||
}
|
||||
|
||||
scope :updated_after, lambda { |*args|
|
||||
|
|
|
@ -336,7 +336,7 @@ module AssignmentOverrideApplicator
|
|||
# preloads the override students for a particular user for many objects at once, instead of doing separate queries for each
|
||||
quizzes, assignments = items.partition{|i| i.is_a?(Quizzes::Quiz)}
|
||||
|
||||
ActiveRecord::Associations::Preloader.new(assignments, :quiz).run
|
||||
ActiveRecord::Associations::Preloader.new(assignments, [:quiz, :assignment_overrides]).run
|
||||
|
||||
if assignments.any?
|
||||
override_students = AssignmentOverrideStudent.where(:assignment_id => assignments, :user_id => user).index_by(&:assignment_id)
|
||||
|
|
|
@ -1117,4 +1117,28 @@ describe AssignmentOverrideApplicator do
|
|||
@overridden_assignment = AssignmentOverrideApplicator.assignment_overridden_for(@assignment, @student)
|
||||
expect(@overridden_assignment.due_at).to eq @section_override.due_at
|
||||
end
|
||||
|
||||
it "should not cache incorrect overrides through due_between_with_overrides" do
|
||||
course_with_student(:active_all => true)
|
||||
@assignment = create_assignment(:course => @course, :submission_types => "online_upload")
|
||||
|
||||
so = assignment_override_model(:assignment => @assignment)
|
||||
so.set = @course.default_section
|
||||
so.override_due_at(30.days.from_now) # set it outside of the default upcoming events range
|
||||
so.save!
|
||||
|
||||
other_so = assignment_override_model(:assignment => @assignment)
|
||||
other_so.set = @course.course_sections.create!
|
||||
other_so.override_due_at(5.days.from_now) # set it so it would be included in the upcoming events query
|
||||
other_so.save!
|
||||
|
||||
Timecop.freeze(5.seconds.from_now) do
|
||||
enable_cache do
|
||||
@student.upcoming_events # prime the cache
|
||||
|
||||
@assignment.reload
|
||||
expect(@assignment.overridden_for(@student).due_at).to eq so.due_at # should have cached correctly
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue