1
0
mirror of https://github.com/meineerde/redmine.git synced 2026-02-01 03:57:15 +00:00

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
This commit is contained in:
Go MAEDA 2025-04-10 10:14:30 +00:00
parent 1e9f1229e6
commit 630f2863ba
3 changed files with 37 additions and 6 deletions

View File

@ -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

View File

@ -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."

View File

@ -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