Fixed that copying an issue as a child of itself creates an extra issue (#13328).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11513 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
4185a4ae3b
commit
caf61dc923
|
@ -1147,20 +1147,27 @@ class Issue < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
unless @copied_from.leaf? || @copy_options[:subtasks] == false
|
unless @copied_from.leaf? || @copy_options[:subtasks] == false
|
||||||
@copied_from.children.each do |child|
|
copy_options = (@copy_options || {}).merge(:subtasks => false)
|
||||||
|
copied_issue_ids = {@copied_from.id => self.id}
|
||||||
|
@copied_from.reload.descendants.reorder("#{Issue.table_name}.lft").each do |child|
|
||||||
|
# Do not copy self when copying an issue as a descendant of the copied issue
|
||||||
|
next if child == self
|
||||||
|
# Do not copy subtasks of issues that were not copied
|
||||||
|
next unless copied_issue_ids[child.parent_id]
|
||||||
|
# Do not copy subtasks that are not visible to avoid potential disclosure of private data
|
||||||
unless child.visible?
|
unless child.visible?
|
||||||
# Do not copy subtasks that are not visible to avoid potential disclosure of private data
|
|
||||||
logger.error "Subtask ##{child.id} was not copied during ##{@copied_from.id} copy because it is not visible to the current user" if logger
|
logger.error "Subtask ##{child.id} was not copied during ##{@copied_from.id} copy because it is not visible to the current user" if logger
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
copy = Issue.new.copy_from(child, @copy_options)
|
copy = Issue.new.copy_from(child, copy_options)
|
||||||
copy.author = author
|
copy.author = author
|
||||||
copy.project = project
|
copy.project = project
|
||||||
copy.parent_issue_id = id
|
copy.parent_issue_id = copied_issue_ids[child.parent_id]
|
||||||
# Children subtasks are copied recursively
|
|
||||||
unless copy.save
|
unless copy.save
|
||||||
logger.error "Could not copy subtask ##{child.id} while copying ##{@copied_from.id} to ##{id} due to validation errors: #{copy.errors.full_messages.join(', ')}" if logger
|
logger.error "Could not copy subtask ##{child.id} while copying ##{@copied_from.id} to ##{id} due to validation errors: #{copy.errors.full_messages.join(', ')}" if logger
|
||||||
|
next
|
||||||
end
|
end
|
||||||
|
copied_issue_ids[child.id] = copy.id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@after_create_from_copy_handled = true
|
@after_create_from_copy_handled = true
|
||||||
|
|
|
@ -849,6 +849,49 @@ class IssueTest < ActiveSupport::TestCase
|
||||||
assert_equal copy.author, child_copy.author
|
assert_equal copy.author, child_copy.author
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_copy_as_a_child_of_copied_issue_should_not_copy_itself
|
||||||
|
parent = Issue.generate!
|
||||||
|
child1 = Issue.generate!(:parent_issue_id => parent.id, :subject => 'Child 1')
|
||||||
|
child2 = Issue.generate!(:parent_issue_id => parent.id, :subject => 'Child 2')
|
||||||
|
|
||||||
|
copy = parent.reload.copy
|
||||||
|
copy.parent_issue_id = parent.id
|
||||||
|
copy.author = User.find(7)
|
||||||
|
assert_difference 'Issue.count', 3 do
|
||||||
|
assert copy.save
|
||||||
|
end
|
||||||
|
parent.reload
|
||||||
|
copy.reload
|
||||||
|
assert_equal parent, copy.parent
|
||||||
|
assert_equal 3, parent.children.count
|
||||||
|
assert_equal 5, parent.descendants.count
|
||||||
|
assert_equal 2, copy.children.count
|
||||||
|
assert_equal 2, copy.descendants.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_copy_as_a_descendant_of_copied_issue_should_not_copy_itself
|
||||||
|
parent = Issue.generate!
|
||||||
|
child1 = Issue.generate!(:parent_issue_id => parent.id, :subject => 'Child 1')
|
||||||
|
child2 = Issue.generate!(:parent_issue_id => parent.id, :subject => 'Child 2')
|
||||||
|
|
||||||
|
copy = parent.reload.copy
|
||||||
|
copy.parent_issue_id = child1.id
|
||||||
|
copy.author = User.find(7)
|
||||||
|
assert_difference 'Issue.count', 3 do
|
||||||
|
assert copy.save
|
||||||
|
end
|
||||||
|
parent.reload
|
||||||
|
child1.reload
|
||||||
|
copy.reload
|
||||||
|
assert_equal child1, copy.parent
|
||||||
|
assert_equal 2, parent.children.count
|
||||||
|
assert_equal 5, parent.descendants.count
|
||||||
|
assert_equal 1, child1.children.count
|
||||||
|
assert_equal 3, child1.descendants.count
|
||||||
|
assert_equal 2, copy.children.count
|
||||||
|
assert_equal 2, copy.descendants.count
|
||||||
|
end
|
||||||
|
|
||||||
def test_copy_should_copy_subtasks_to_target_project
|
def test_copy_should_copy_subtasks_to_target_project
|
||||||
issue = Issue.generate_with_descendants!
|
issue = Issue.generate_with_descendants!
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue