diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 23d3992f1..e1a3d860c 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -367,7 +367,12 @@ class IssuesController < ApplicationController when 'destroy' # nothing to do when 'nullify' + if Setting.timelog_required_fields.include?('issue_id') + flash.now[:error] = l(:field_issue) + " " + ::I18n.t('activerecord.errors.messages.blank') + return + else time_entries.update_all(:issue_id => nil) + end when 'reassign' reassign_to = @project && @project.issues.find_by_id(params[:reassign_to_id]) if reassign_to.nil? diff --git a/app/views/issues/destroy.html.erb b/app/views/issues/destroy.html.erb index 9b08c3698..61b841a62 100644 --- a/app/views/issues/destroy.html.erb +++ b/app/views/issues/destroy.html.erb @@ -6,7 +6,9 @@

<%= l(:text_destroy_time_entries_question, :hours => number_with_precision(@hours, :precision => 2)) %>


+<% unless Setting.timelog_required_fields.include?('issue_id') %>
+<% end %> <% if @project %> <%= text_field_tag 'reassign_to_id', params[:reassign_to_id], :size => 6, :onfocus => '$("#todo_reassign").attr("checked", true);' %> diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index c423d6de3..5be84b9c7 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -6234,6 +6234,27 @@ class IssuesControllerTest < Redmine::ControllerTest def test_destroy_issues_with_time_entries_should_show_the_reassign_form @request.session[:user_id] = 2 + with_settings :timelog_required_fields => [] do + assert_no_difference 'Issue.count' do + delete :destroy, :params => { + :ids => [1, 3] + } + end + end + assert_response :success + + assert_select 'form' do + assert_select 'input[name=_method][value=delete]' + assert_select 'input[name=todo][value=destroy]' + assert_select 'input[name=todo][value=nullify]' + assert_select 'input[name=todo][value=reassign]' + end + end + + def test_destroy_issues_with_time_entries_should_not_show_the_nullify_option_when_issue_is_required_for_time_entries + with_settings :timelog_required_fields => ['issue_id'] do + @request.session[:user_id] = 2 + assert_no_difference 'Issue.count' do delete :destroy, :params => { :ids => [1, 3] @@ -6243,6 +6264,10 @@ class IssuesControllerTest < Redmine::ControllerTest assert_select 'form' do assert_select 'input[name=_method][value=delete]' + assert_select 'input[name=todo][value=destroy]' + assert_select 'input[name=todo][value=nullify]', 0 + assert_select 'input[name=todo][value=reassign]' + end end end @@ -6281,6 +6306,7 @@ class IssuesControllerTest < Redmine::ControllerTest def test_destroy_issues_and_assign_time_entries_to_project @request.session[:user_id] = 2 + with_settings :timelog_required_fields => [] do assert_difference 'Issue.count', -2 do assert_no_difference 'TimeEntry.count' do delete :destroy, :params => { @@ -6289,6 +6315,7 @@ class IssuesControllerTest < Redmine::ControllerTest } end end + end assert_redirected_to :action => 'index', :project_id => 'ecookbook' assert !(Issue.find_by_id(1) || Issue.find_by_id(3)) assert_nil TimeEntry.find(1).issue_id @@ -6367,6 +6394,23 @@ class IssuesControllerTest < Redmine::ControllerTest assert_select '#flash_error', :text => I18n.t(:error_cannot_reassign_time_entries_to_an_issue_about_to_be_deleted) end + def test_destroy_issues_and_nullify_time_entries_should_fail_when_issue_is_required_for_time_entries + @request.session[:user_id] = 2 + + with_settings :timelog_required_fields => ['issue_id'] do + assert_no_difference 'Issue.count' do + assert_no_difference 'TimeEntry.count' do + delete :destroy, :params => { + :ids => [1, 3], + :todo => 'nullify' + } + end + end + end + assert_response :success + assert_select '#flash_error', :text => 'Issue cannot be blank' + end + def test_destroy_issues_from_different_projects @request.session[:user_id] = 2