diff --git a/app/models/issue.rb b/app/models/issue.rb index 4b60843c7..a47e6c024 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -418,7 +418,7 @@ class Issue < ActiveRecord::Base if attrs['parent_issue_id'].present? s = attrs['parent_issue_id'].to_s - unless (m = s.match(%r{\A#?(\d+)\z})) && Issue.visible(user).exists?(m[1]) + unless (m = s.match(%r{\A#?(\d+)\z})) && (m[1] == parent_id.to_s || Issue.visible(user).exists?(m[1])) @invalid_parent_issue_id = attrs.delete('parent_issue_id') end end diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 12cc91746..1ed805513 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -2914,6 +2914,20 @@ class IssuesControllerTest < ActionController::TestCase assert_equal spent_hours_before + 2.5, issue.spent_hours end + def test_put_update_should_preserve_parent_issue_even_if_not_visible + parent = Issue.generate!(:project_id => 1, :is_private => true) + issue = Issue.generate!(:parent_issue_id => parent.id) + assert !parent.visible?(User.find(3)) + @request.session[:user_id] = 3 + + get :edit, :id => issue.id + assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s + + put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s} + assert_response 302 + assert_equal parent, issue.parent + end + def test_put_update_with_attachment_only set_tmp_attachments_directory