@@ -23,6 +23,12 @@ module AssignmentOverrideApplicator
2323 def self . assignment_overridden_for ( assignment_or_quiz , user )
2424 return assignment_or_quiz if assignment_or_quiz . overridden_for? ( user )
2525
26+ # this is a cheap hack to avoid unnecessary work (especially stupid
27+ # simply_versioned queries)
28+ if assignment_or_quiz . has_no_overrides
29+ return setup_overridden_clone ( assignment_or_quiz )
30+ end
31+
2632 overrides = self . overrides_for_assignment_and_user ( assignment_or_quiz , user )
2733
2834 result_assignment_or_quiz = self . assignment_with_overrides ( assignment_or_quiz , overrides )
@@ -85,7 +91,7 @@ def self.overrides_for_assignment_and_user(assignment_or_quiz, user)
8591 # NOT exclude deleted overrides, yet
8692 key = assignment_or_quiz . is_a? ( Quiz ) ? :quiz_id : :assignment_id
8793 adhoc_membership = AssignmentOverrideStudent . where ( key => assignment_or_quiz , :user_id => user ) . first
88-
94+
8995 overrides << adhoc_membership . assignment_override if adhoc_membership
9096
9197 if assignment_or_quiz . is_a? ( Assignment ) && assignment_or_quiz . group_category && group = user . current_groups . where ( :group_category_id => assignment_or_quiz . group_category_id ) . first
@@ -143,35 +149,45 @@ def self.overrides_for_assignment_and_user(assignment_or_quiz, user)
143149 end
144150 end
145151
152+ # really takes an assignment or quiz but who wants to type out
153+ # assignment_or_quiz all the time?
154+ def self . setup_overridden_clone ( assignment , overrides = [ ] )
155+ clone = assignment . clone
156+
157+ # ActiveRecord::Base#clone nils out the primary key; put it back
158+ clone . id = assignment . id
159+ self . copy_preloaded_associations_to_clone ( assignment ,
160+ clone )
161+ yield ( clone ) if block_given?
162+
163+ clone . applied_overrides = overrides
164+ clone . without_overrides = assignment
165+ clone . overridden = true
166+ clone . readonly!
167+
168+ new_record = assignment . instance_variable_get ( :@new_record )
169+ clone . instance_variable_set ( :@new_record , new_record )
170+
171+ clone
172+ end
173+
146174 # apply the overrides calculated by collapsed_overrides to a clone of the
147175 # assignment or quiz which can then be used in place of the original object.
148176 # the clone is marked readonly to prevent saving
149177 def self . assignment_with_overrides ( assignment_or_quiz , overrides )
150178 unoverridden_assignment_or_quiz = assignment_or_quiz . without_overrides
151- # ActiveRecord::Base#clone nils out the primary key; put it back
152- cloned_assignment_or_quiz = unoverridden_assignment_or_quiz . clone
153- cloned_assignment_or_quiz . id = unoverridden_assignment_or_quiz . id
154- self . copy_preloaded_associations_to_clone ( assignment_or_quiz ,
155- cloned_assignment_or_quiz )
156-
157- # update attributes with overrides
158- if overrides
159- self . collapsed_overrides ( unoverridden_assignment_or_quiz , overrides ) . each do |field , value |
160- # for any times in the value set, bring them back from raw UTC into the
161- # current Time.zone before placing them in the assignment
162- value = value . in_time_zone if value && value . respond_to? ( :in_time_zone ) && !value . is_a? ( Date )
163- cloned_assignment_or_quiz . write_attribute ( field , value )
179+
180+ self . setup_overridden_clone ( unoverridden_assignment_or_quiz ,
181+ overrides ) do |cloned_assignment_or_quiz |
182+ if overrides
183+ self . collapsed_overrides ( unoverridden_assignment_or_quiz , overrides ) . each do |field , value |
184+ # for any times in the value set, bring them back from raw UTC into the
185+ # current Time.zone before placing them in the assignment
186+ value = value . in_time_zone if value && value . respond_to? ( :in_time_zone ) && !value . is_a? ( Date )
187+ cloned_assignment_or_quiz . write_attribute ( field , value )
188+ end
164189 end
165190 end
166- cloned_assignment_or_quiz . applied_overrides = overrides
167- cloned_assignment_or_quiz . without_overrides = unoverridden_assignment_or_quiz
168- cloned_assignment_or_quiz . overridden = true
169- cloned_assignment_or_quiz . readonly!
170-
171- new_record = unoverridden_assignment_or_quiz . instance_variable_get ( :@new_record )
172- cloned_assignment_or_quiz . instance_variable_set ( :@new_record , new_record )
173-
174- cloned_assignment_or_quiz
175191 end
176192
177193 def self . copy_preloaded_associations_to_clone ( orig , clone )
0 commit comments