From c8b442cc412eb39532f899a14759de9c7b64e2d5 Mon Sep 17 00:00:00 2001 From: Henrik Bohre Date: Tue, 9 Jun 2009 13:45:39 +0200 Subject: [PATCH] #300: Referential integrity maintained when deleting todos which are part in a dependency relationship --- app/controllers/todos_controller.rb | 21 ++++++++++++++++++--- app/models/todo.rb | 8 ++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 7c6d1ee2..56c9213c 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -77,7 +77,8 @@ class TodosController < ApplicationController @todo.tag_with(tag_list) @todo.tags.reload end - + + # TODO: Check if we can reload cache here instead of saving twice unless predecessor_list.blank? @todo.add_predecessor_list(predecessor_list) unless @todo.uncompleted_predecessors.empty? || @todo.state == 'project_hidden' @@ -348,16 +349,30 @@ class TodosController < ApplicationController @context_id = @todo.context_id @project_id = @todo.project_id + # activate successors if they only depend on this todo + activated_successor_count = 0 + @todo.pending_successors.each do |successor| + successor.uncompleted_predecessors.delete(@todo) + if successor.uncompleted_predecessors.empty? + successor.activate! + activated_successor_count += 1 + end + end + @saved = @todo.destroy # check if this todo has a related recurring_todo. If so, create next todo @new_recurring_todo = check_for_next_todo(@todo) if @saved - + respond_to do |format| format.html do if @saved - notify :notice, "Successfully deleted next action", 2.0 + message = "Successfully deleted next action" + if activated_successor_count > 0 + message += " activated #{pluralize(activated_successor_count, 'pending action')}" + end + notify :notice, message, 2.0 redirect_to :action => 'index' else notify :error, "Failed to delete the action", 2.0 diff --git a/app/models/todo.rb b/app/models/todo.rb index f39f30a2..cd195cc8 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -7,12 +7,12 @@ class Todo < ActiveRecord::Base has_many :predecessor_dependencies, :foreign_key => 'predecessor_id', :class_name => 'Dependency', :dependent => :destroy has_many :successor_dependencies, :foreign_key => 'successor_id', :class_name => 'Dependency', :dependent => :destroy - has_many :predecessors, :through => :successor_dependencies, :dependent => :destroy - has_many :successors, :through => :predecessor_dependencies, :dependent => :destroy + has_many :predecessors, :through => :successor_dependencies + has_many :successors, :through => :predecessor_dependencies has_many :uncompleted_predecessors, :through => :successor_dependencies, - :source => :predecessor, :conditions => ['NOT (state = ?)', 'completed'], :dependent => :destroy + :source => :predecessor, :conditions => ['NOT (state = ?)', 'completed'] has_many :pending_successors, :through => :predecessor_dependencies, - :source => :successor, :conditions => ['state = ?', 'pending'], :dependent => :destroy + :source => :successor, :conditions => ['state = ?', 'pending'] named_scope :active, :conditions => { :state => 'active' }