diff --git a/app/models/assignment_override.rb b/app/models/assignment_override.rb index d645186a9d3..f85e849fcf2 100644 --- a/app/models/assignment_override.rb +++ b/app/models/assignment_override.rb @@ -165,6 +165,12 @@ class AssignmentOverride < ActiveRecord::Base end end + def undestroy(active_state: 'active') + self.workflow_state = active_state + save! + true + end + scope :active, -> { where(:workflow_state => 'active') } scope :visible_students_only, -> (visible_ids) do diff --git a/app/models/assignment_override_student.rb b/app/models/assignment_override_student.rb index 87d8268d96e..06f70b279ae 100644 --- a/app/models/assignment_override_student.rb +++ b/app/models/assignment_override_student.rb @@ -27,6 +27,7 @@ class AssignmentOverrideStudent < ActiveRecord::Base after_create :update_cached_due_dates after_destroy :update_cached_due_dates after_destroy :destroy_override_if_needed + after_update :undelete_override_if_deleted before_validation :default_values before_validation :clean_up_assignment_if_override_student_orphaned @@ -82,6 +83,11 @@ class AssignmentOverrideStudent < ActiveRecord::Base end protected :destroy_override_if_needed + def undelete_override_if_deleted + assignment_override.undestroy if workflow_state_was == 'deleted' && active? && assignment_override&.deleted? + end + protected :undelete_override_if_deleted + def self.clean_up_for_assignment(assignment) return unless assignment.context_type == "Course" return if assignment.new_record? diff --git a/spec/models/assignment_override_student_spec.rb b/spec/models/assignment_override_student_spec.rb index 26436f01da3..94f39d30eb1 100644 --- a/spec/models/assignment_override_student_spec.rb +++ b/spec/models/assignment_override_student_spec.rb @@ -146,6 +146,16 @@ describe AssignmentOverrideStudent do expect(@ao.reload).to be_deleted end + it 'undeletes its override if it is undeletd and the override is deleted' do + adhoc_override_with_student + + @override_student.destroy + @ao.reload + + @override_student.undestroy + expect(@ao.reload).not_to be_deleted + end + describe "clean_up_for_assignment" do it "if callbacks aren't run clean_up_for_assignment should delete invalid overrides" do adhoc_override_with_student