From b67c30c18e47e649d735e4ecd218ec4068cdeb26 Mon Sep 17 00:00:00 2001 From: ishikawa999 Date: Wed, 19 Mar 2025 05:54:48 +0000 Subject: [PATCH] Improve role deletion error message to display projects containing members under the role --- app/controllers/roles_controller.rb | 10 +++++++- config/locales/en.yml | 1 + 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..530cd2ac5 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).where(members: { role_id: @role.id }).distinct.sorted + links = @role.members.map(&:project).uniq.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 aa15095c6..2bc824f79 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.

The following projects have issues with this tracker:
%{projects}

" error_can_not_remove_role: "This role is in use and cannot be deleted." + error_can_not_remove_role_reason_members_html: "

The following projects have members with this role:
%{projects}

" 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 -- 2.47.1