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
This commit is contained in:
Eric Davis 2010-06-30 02:45:34 +00:00
parent 305cab100f
commit c6201ae15b
2 changed files with 17 additions and 1 deletions

View File

@ -629,6 +629,7 @@ class Issue < ActiveRecord::Base
end end
reload reload
elsif parent_issue_id != parent_id elsif parent_issue_id != parent_id
former_parent_id = parent_id
# moving an existing issue # moving an existing issue
if @parent_issue && @parent_issue.root_id == root_id if @parent_issue && @parent_issue.root_id == root_id
# inside the same tree # inside the same tree
@ -658,12 +659,18 @@ class Issue < ActiveRecord::Base
relation.destroy unless relation.valid? relation.destroy unless relation.valid?
end end
end end
# update former parent
recalculate_attributes_for(former_parent_id) if former_parent_id
end end
remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue)
end end
def update_parent_attributes 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 # priority = highest priority of children
if priority_position = p.children.maximum("#{IssuePriority.table_name}.position", :include => :priority) if priority_position = p.children.maximum("#{IssuePriority.table_name}.position", :include => :priority)
p.priority = IssuePriority.find_by_position(priority_position) p.priority = IssuePriority.find_by_position(priority_position)

View File

@ -273,6 +273,15 @@ class IssueNestedSetTest < ActiveSupport::TestCase
assert_equal 12, parent.reload.estimated_hours assert_equal 12, parent.reload.estimated_hours
end 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 def test_reschuling_a_parent_should_reschedule_subtasks
parent = create_issue! parent = create_issue!