From c6201ae15b4fcb8ca17dbe39636e6efa626d7a03 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 02:45:34 +0000 Subject: [PATCH] Recalculate inherited attributes on parents when a child is moved under a new parent. #5524 Contributed by Jean-Baptiste Barth. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3821 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 9 ++++++++- test/unit/issue_nested_set_test.rb | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 2d002183..7d0682df 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -629,6 +629,7 @@ class Issue < ActiveRecord::Base end reload elsif parent_issue_id != parent_id + former_parent_id = parent_id # moving an existing issue if @parent_issue && @parent_issue.root_id == root_id # inside the same tree @@ -658,12 +659,18 @@ class Issue < ActiveRecord::Base relation.destroy unless relation.valid? end end + # update former parent + recalculate_attributes_for(former_parent_id) if former_parent_id end remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) end def update_parent_attributes - if parent_id && p = Issue.find_by_id(parent_id) + recalculate_attributes_for(parent_id) if parent_id + end + + def recalculate_attributes_for(issue_id) + if issue_id && p = Issue.find_by_id(issue_id) # priority = highest priority of children if priority_position = p.children.maximum("#{IssuePriority.table_name}.position", :include => :priority) p.priority = IssuePriority.find_by_position(priority_position) diff --git a/test/unit/issue_nested_set_test.rb b/test/unit/issue_nested_set_test.rb index 7138e452..cda8c4e5 100644 --- a/test/unit/issue_nested_set_test.rb +++ b/test/unit/issue_nested_set_test.rb @@ -273,6 +273,15 @@ class IssueNestedSetTest < ActiveSupport::TestCase assert_equal 12, parent.reload.estimated_hours end + def test_move_parent_updates_old_parent_attributes + first_parent = create_issue! + second_parent = create_issue! + child = create_issue!(:estimated_hours => 5, :parent_issue_id => first_parent.id) + assert_equal 5, first_parent.reload.estimated_hours + child.update_attributes(:estimated_hours => 7, :parent_issue_id => second_parent.id) + assert_equal 7, second_parent.reload.estimated_hours + assert_nil first_parent.reload.estimated_hours + end def test_reschuling_a_parent_should_reschedule_subtasks parent = create_issue!