diff options
author | Go MAEDA <maeda@farend.jp> | 2025-04-10 10:14:30 +0000 |
---|---|---|
committer | Go MAEDA <maeda@farend.jp> | 2025-04-10 10:14:30 +0000 |
commit | 630f2863ba057cebdcfeabbe6e3b5b8a43f30886 (patch) | |
tree | aeeffb891084547cc5484be75adf3881c8963169 | |
parent | 1e9f1229e6d271423fa9422244cddc29cb92feb1 (diff) | |
download | redmine-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.rb | 10 | ||||
-rw-r--r-- | config/locales/en.yml | 1 | ||||
-rw-r--r-- | test/functional/roles_controller_test.rb | 32 |
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 |