From 6c8b04d6d5cf5f25ddd99a5cedb095f776a524dd Mon Sep 17 00:00:00 2001 From: Go MAEDA Date: Sun, 14 Jul 2024 01:49:53 +0000 Subject: [PATCH] Add configurable setting for copying attachments when copying an issue (#36197). Patch by Yuichi HARADA (user:yui.har). git-svn-id: https://svn.redmine.org/redmine/trunk@22926 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/issues_controller.rb | 21 ++++-- app/helpers/settings_helper.rb | 10 +++ app/views/issues/new.html.erb | 2 +- app/views/settings/_issues.html.erb | 2 + config/locales/en.yml | 1 + config/settings.yml | 2 + test/functional/issues_controller_test.rb | 82 +++++++++++++++++++++++ 7 files changed, 115 insertions(+), 5 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 089da28a7..c5af8658f 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -328,7 +328,8 @@ class IssuesController < ApplicationController @versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&) @categories = target_projects.map {|p| p.issue_categories}.reduce(:&) if @copy - @attachments_present = @issues.detect {|i| i.attachments.any?}.present? + @attachments_present = @issues.detect {|i| i.attachments.any?}.present? && + (Setting.copy_attachments_on_issue_copy == 'ask') @subtasks_present = @issues.detect {|i| !i.leaf?}.present? @watchers_present = User.current.allowed_to?(:add_issue_watchers, @projects) && Watcher.where(:watchable_type => 'Issue', @@ -347,7 +348,6 @@ class IssuesController < ApplicationController attributes = parse_params_for_bulk_update(params[:issue]) copy_subtasks = (params[:copy_subtasks] == '1') - copy_attachments = (params[:copy_attachments] == '1') copy_watchers = (params[:copy_watchers] == '1') if @copy @@ -386,7 +386,7 @@ class IssuesController < ApplicationController if @copy issue = orig_issue.copy( {}, - :attachments => copy_attachments, + :attachments => copy_attachments?(params[:copy_attachments]), :subtasks => copy_subtasks, :watchers => copy_watchers, :link => link_copy?(params[:link_copy]) @@ -593,7 +593,7 @@ class IssuesController < ApplicationController end @link_copy = link_copy?(params[:link_copy]) || request.get? - @copy_attachments = params[:copy_attachments].present? || request.get? + @copy_attachments = copy_attachments?(params[:copy_attachments]) || request.get? @copy_subtasks = params[:copy_subtasks].present? || request.get? @copy_watchers = User.current.allowed_to?(:add_issue_watchers, @project) @issue.copy_from(@copy_from, :attachments => @copy_attachments, @@ -696,6 +696,19 @@ class IssuesController < ApplicationController end end + # Returns true if the attachments should be copied + # from the original issue + def copy_attachments?(param) + case Setting.copy_attachments_on_issue_copy + when 'yes' + true + when 'no' + false + when 'ask' + param == '1' + end + end + # Redirects user after a successful issue creation def redirect_after_create if params[:continue] diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 77abaf2e3..1fb57b2d7 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -166,6 +166,16 @@ module SettingsHelper options.map {|label, value| [l(label), value.to_s]} end + def copy_attachments_on_issue_copy_options + options = [ + [:general_text_Yes, 'yes'], + [:general_text_No, 'no'], + [:label_ask, 'ask'] + ] + + options.map {|label, value| [l(label), value.to_s]} + end + def default_global_issue_query_options [[l(:label_none), '']] + IssueQuery.only_public.where(project_id: nil).pluck(:name, :id) end diff --git a/app/views/issues/new.html.erb b/app/views/issues/new.html.erb index 92f6f251a..40089215c 100644 --- a/app/views/issues/new.html.erb +++ b/app/views/issues/new.html.erb @@ -17,7 +17,7 @@ <%= check_box_tag 'link_copy', '1', @link_copy %>

<% end %> - <% if @copy_from && @copy_from.attachments.any? %> + <% if @copy_from && Setting.copy_attachments_on_issue_copy == 'ask' && @copy_from.attachments.any? %>

<%= check_box_tag 'copy_attachments', '1', @copy_attachments %> diff --git a/app/views/settings/_issues.html.erb b/app/views/settings/_issues.html.erb index 7532d5d0e..0e978fa6b 100644 --- a/app/views/settings/_issues.html.erb +++ b/app/views/settings/_issues.html.erb @@ -5,6 +5,8 @@

<%= setting_select :link_copied_issue, link_copied_issue_options %>

+

<%= setting_select :copy_attachments_on_issue_copy, copy_attachments_on_issue_copy_options %>

+

<%= setting_select :cross_project_subtasks, cross_project_subtasks_options %>

<%= setting_check_box :close_duplicate_issues %>

diff --git a/config/locales/en.yml b/config/locales/en.yml index 05e01b77a..7d51ed1b7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -503,6 +503,7 @@ en: setting_force_default_language_for_anonymous: Force default language for anonymous users setting_force_default_language_for_loggedin: Force default language for logged-in users setting_link_copied_issue: Link issues on copy + setting_copy_attachments_on_issue_copy: Copy attachments on copy setting_max_additional_emails: Maximum number of additional email addresses setting_email_domains_allowed: Allowed email domains setting_email_domains_denied: Disallowed email domains diff --git a/config/settings.yml b/config/settings.yml index 346288a4a..19d3a33c7 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -190,6 +190,8 @@ parent_issue_done_ratio: default: 'derived' link_copied_issue: default: 'ask' +copy_attachments_on_issue_copy: + default: 'ask' close_duplicate_issues: default: 1 issue_group_assignment: diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 44ad19f22..3b7521d40 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -5624,6 +5624,47 @@ class IssuesControllerTest < Redmine::ControllerTest end end + def test_create_as_copy_should_always_copy_attachments_by_settings + assert_equal 4, Issue.find(3).attachments.size + with_settings :copy_attachments_on_issue_copy => 'yes' do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + assert_difference 'Attachment.count', 4 do + post( + :create, + :params => { + :project_id => 1, + :copy_from => 3, + :issue => { + :subject => 'Copy' + } + } + ) + end + end + end + end + + def test_create_as_copy_should_never_copy_attachments_by_settings + with_settings :copy_attachments_on_issue_copy => 'no' do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + assert_no_difference 'Attachment.count' do + post( + :create, + :params => { + :project_id => 1, + :copy_from => 3, + :issue => { + :subject => 'Copy' + } + } + ) + end + end + end + end + def test_create_as_copy_should_copy_subtasks @request.session[:user_id] = 2 issue = Issue.generate_with_descendants! @@ -8085,6 +8126,47 @@ class IssuesControllerTest < Redmine::ControllerTest end end + def test_bulk_copy_should_never_copy_attachments_by_settings + with_settings :copy_attachments_on_issue_copy => 'no' do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + assert_no_difference 'Attachment.count' do + post( + :bulk_update, + :params => { + :ids => [3], + :copy => '1', + :issue => { + :project_id => '' + } + } + ) + end + end + end + end + + def test_bulk_copy_should_always_copy_attachments_by_settings + assert_equal 4, Issue.find(3).attachments.size + with_settings :copy_attachments_on_issue_copy => 'yes' do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + assert_difference 'Attachment.count', 4 do + post( + :bulk_update, + :params => { + :ids => [3], + :copy => '1', + :issue => { + :project_id => '' + } + } + ) + end + end + end + end + def test_bulk_copy_should_add_relations_with_copied_issues @request.session[:user_id] = 2 assert_difference 'Issue.count', 2 do -- 2.39.5