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:
James Williams 2015-11-04 08:07:44 -07:00
parent 0b63ce6b4c
commit 1c549bfc82
3 changed files with 31 additions and 5 deletions

View File

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

View File

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

View File

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