summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2025-04-10 10:14:30 +0000
committerGo MAEDA <maeda@farend.jp>2025-04-10 10:14:30 +0000
commit630f2863ba057cebdcfeabbe6e3b5b8a43f30886 (patch)
treeaeeffb891084547cc5484be75adf3881c8963169
parent1e9f1229e6d271423fa9422244cddc29cb92feb1 (diff)
downloadredmine-630f2863ba057cebdcfeabbe6e3b5b8a43f30886.tar.gz
redmine-630f2863ba057cebdcfeabbe6e3b5b8a43f30886.zip
Improve role deletion error message to display projects containing members under the role (#42441).
Patch by Mizuki ISHIKAWA (user:ishikawa999). git-svn-id: https://svn.redmine.org/redmine/trunk@23619 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/roles_controller.rb10
-rw-r--r--config/locales/en.yml1
-rw-r--r--test/functional/roles_controller_test.rb32
3 files changed, 37 insertions, 6 deletions
diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb
index dfe7c2b8f..89f9ee497 100644
--- a/app/controllers/roles_controller.rb
+++ b/app/controllers/roles_controller.rb
@@ -99,7 +99,15 @@ class RolesController < ApplicationController
begin
@role.destroy
rescue
- flash[:error] = l(:error_can_not_remove_role)
+ flash[:error] = l(:error_can_not_remove_role)
+
+ if @role.members.present?
+ projects = Project.joins(members: :member_roles).where(member_roles: { role_id: @role.id }).distinct.sorted
+ links = projects.map do |p|
+ view_context.link_to(p, settings_project_path(p, tab: 'members'))
+ end.join(', ')
+ flash[:error] += l(:error_can_not_remove_role_reason_members_html, projects: links)
+ end
end
redirect_to roles_path
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f6e1d2d96..26ef5a9d6 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -207,6 +207,7 @@ en:
error_can_not_delete_custom_field: Unable to delete custom field
error_can_not_delete_tracker_html: "This tracker contains issues and cannot be deleted.<p>The following projects have issues with this tracker:<br>%{projects}</p>"
error_can_not_remove_role: "This role is in use and cannot be deleted."
+ error_can_not_remove_role_reason_members_html: "<p>The following projects have members with this role:<br>%{projects}</p>"
error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version cannot be reopened'
error_can_not_archive_project: This project cannot be archived
error_issue_done_ratios_not_updated: "Issue done ratios not updated."
diff --git a/test/functional/roles_controller_test.rb b/test/functional/roles_controller_test.rb
index c343b9bd6..cbb2da3de 100644
--- a/test/functional/roles_controller_test.rb
+++ b/test/functional/roles_controller_test.rb
@@ -239,11 +239,33 @@ class RolesControllerTest < Redmine::ControllerTest
assert_nil Role.find_by_id(r.id)
end
- def test_destroy_role_in_use
- delete :destroy, :params => {:id => 1}
- assert_redirected_to '/roles'
- assert_equal 'This role is in use and cannot be deleted.', flash[:error]
- assert_not_nil Role.find_by_id(1)
+ def test_destroy_role_with_members
+ role = Role.find(2) # Developer, has members
+
+ delete :destroy, params: { id: role.id }
+
+ assert_redirected_to roles_path
+ assert Role.find_by(id: role.id)
+
+ assert flash[:error].present?
+ assert_includes flash[:error], I18n.t(:error_can_not_remove_role)
+
+ expected_dependency_projects = Project.where(identifier: ['ecookbook', 'onlinestore', 'private-child'])
+ expected_dependency_projects.each do |project|
+ assert_includes flash[:error], project.name
+ assert_includes flash[:error], settings_project_path(project, tab: 'members')
+ end
+ end
+
+ def test_destroy_builtin
+ role = Role.anonymous
+
+ delete :destroy, params: { id: role.id }
+
+ assert_redirected_to roles_path
+ assert Role.find_by(id: role.id)
+ assert flash[:error].present?
+ assert_equal flash[:error], I18n.t(:error_can_not_remove_role)
end
def test_permissions