Feature #37674 » 0002-user-bulk-destroy.patch
| app/controllers/users_controller.rb | ||
|---|---|---|
| 218 | 218 |
end |
| 219 | 219 |
end |
| 220 | 220 | |
| 221 |
def bulk_destroy |
|
| 222 |
@users = User.logged.where(id: params[:ids]).where.not(id: User.current) |
|
| 223 |
(render_404; return) unless @users.any? |
|
| 224 | ||
| 225 |
if params[:lock] |
|
| 226 |
@users.update_all status: User::STATUS_LOCKED |
|
| 227 |
flash[:notice] = l(:notice_successful_update) |
|
| 228 |
redirect_to users_path |
|
| 229 |
elsif params[:confirm] == I18n.t(:general_text_Yes) |
|
| 230 |
@users.destroy_all |
|
| 231 |
flash[:notice] = l(:notice_successful_delete) |
|
| 232 |
redirect_to users_path |
|
| 233 |
end |
|
| 234 |
end |
|
| 235 | ||
| 221 | 236 |
private |
| 222 | 237 | |
| 223 | 238 |
def find_user(logged = true) |
| app/views/context_menus/users.html.erb | ||
|---|---|---|
| 20 | 20 |
method: :delete, class: 'icon icon-del' %> |
| 21 | 21 |
</li> |
| 22 | 22 |
<% end %> |
| 23 |
<% else %> |
|
| 24 |
<li> |
|
| 25 |
<%= context_menu_link l(:button_delete), |
|
| 26 |
{controller: 'users', action: 'bulk_destroy', ids: @users.map(&:id)},
|
|
| 27 |
method: :delete, class: 'icon icon-del' %> |
|
| 28 |
</li> |
|
| 23 | 29 |
<% end %> |
| 24 | 30 |
</ul> |
| app/views/users/bulk_destroy.html.erb | ||
|---|---|---|
| 1 |
<%= title l(:label_confirmation) %> |
|
| 2 | ||
| 3 |
<%= form_tag(bulk_destroy_users_path(ids: @users.map(&:id)), method: :delete) do %> |
|
| 4 |
<div class="warning"> |
|
| 5 | ||
| 6 |
<p><%= simple_format l :text_users_bulk_destroy_head %></p> |
|
| 7 | ||
| 8 |
<% @users.each do |user| %> |
|
| 9 |
<p><strong><%= user.name %></strong> (<%= user.login %>)</p> |
|
| 10 |
<% end %> |
|
| 11 | ||
| 12 |
<p><%= l :text_users_bulk_destroy_confirm, yes: l(:general_text_Yes) %></p> |
|
| 13 |
<p><%= text_field_tag 'confirm' %></p> |
|
| 14 | ||
| 15 |
</div> |
|
| 16 | ||
| 17 |
<p> |
|
| 18 |
<%= submit_tag l(:button_delete), class: 'btn-alert btn-small' %> |
|
| 19 |
<%= submit_tag l(:button_lock), class: 'btn', name: 'lock' %> |
|
| 20 |
<%= link_to l(:button_cancel), users_path %> |
|
| 21 |
</p> |
|
| 22 |
<% end %> |
|
| 23 | ||
| 24 | ||
| config/locales/en.yml | ||
|---|---|---|
| 1230 | 1230 |
text_project_close_confirmation: Are you sure you want to close the '%{value}' project to make it read-only?
|
| 1231 | 1231 |
text_project_reopen_confirmation: Are you sure you want to reopen the '%{value}' project?
|
| 1232 | 1232 |
text_project_archive_confirmation: Are you sure you want to archive the '%{value}' project?
|
| 1233 |
text_users_bulk_destroy_head: 'You are about to delete the following users and remove all references to them. This cannot be undone. Often, locking users instead of deleting them is the better solution.' |
|
| 1234 |
text_users_bulk_destroy_confirm: 'To confirm, please enter "%{yes}" below.'
|
|
| 1233 | 1235 |
text_workflow_edit: Select a role and a tracker to edit the workflow |
| 1234 | 1236 |
text_are_you_sure: Are you sure? |
| 1235 | 1237 |
text_journal_changed: "%{label} changed from %{old} to %{new}"
|
| config/routes.rb | ||
|---|---|---|
| 110 | 110 | |
| 111 | 111 |
match '/users/context_menu', to: 'context_menus#users', as: :users_context_menu, via: [:get, :post] |
| 112 | 112 |
resources :users do |
| 113 |
collection do |
|
| 114 |
delete 'bulk_destroy' |
|
| 115 |
end |
|
| 113 | 116 |
resources :memberships, :controller => 'principal_memberships' |
| 114 | 117 |
resources :email_addresses, :only => [:index, :create, :update, :destroy] |
| 115 | 118 |
end |
| test/functional/users_controller_test.rb | ||
|---|---|---|
| 1085 | 1085 |
assert_response 422 |
| 1086 | 1086 |
end |
| 1087 | 1087 |
end |
| 1088 | ||
| 1089 |
def test_bulk_destroy |
|
| 1090 |
assert_difference 'User.count', -1 do |
|
| 1091 |
delete :bulk_destroy, :params => {:ids => [2], :confirm => 'Yes'}
|
|
| 1092 |
end |
|
| 1093 |
assert_redirected_to '/users' |
|
| 1094 |
assert_nil User.find_by_id(2) |
|
| 1095 |
end |
|
| 1096 | ||
| 1097 |
def test_bulk_destroy_should_not_destroy_current_user |
|
| 1098 |
assert_difference 'User.count', -1 do |
|
| 1099 |
delete :bulk_destroy, :params => {:ids => [2, 1], :confirm => 'Yes'}
|
|
| 1100 |
end |
|
| 1101 |
assert_redirected_to '/users' |
|
| 1102 |
assert_nil User.find_by_id(2) |
|
| 1103 |
end |
|
| 1104 | ||
| 1105 |
def test_bulk_destroy_with_lock_param_should_lock_instead |
|
| 1106 |
assert_no_difference 'User.count' do |
|
| 1107 |
delete :bulk_destroy, :params => {:ids => [2], :lock => 'lock'}
|
|
| 1108 |
end |
|
| 1109 |
assert_redirected_to '/users' |
|
| 1110 |
assert User.find_by_id(2).locked? |
|
| 1111 |
end |
|
| 1112 | ||
| 1113 |
def test_bulk_destroy_should_require_confirmation |
|
| 1114 |
assert_no_difference 'User.count' do |
|
| 1115 |
delete :bulk_destroy, :params => {:ids => [2]}
|
|
| 1116 |
end |
|
| 1117 |
assert_response :success |
|
| 1118 |
assert_select '.warning', :text => /You are about to delete the following users/ |
|
| 1119 |
end |
|
| 1120 | ||
| 1121 |
def test_bulk_destroy_should_require_correct_confirmation |
|
| 1122 |
assert_no_difference 'User.count' do |
|
| 1123 |
delete :bulk_destroy, :params => {:ids => [2], :confirm => 'wrong'}
|
|
| 1124 |
end |
|
| 1125 |
assert_response :success |
|
| 1126 |
assert_select '.warning', :text => /You are about to delete the following users/ |
|
| 1127 |
end |
|
| 1128 | ||
| 1129 |
def test_bulk_destroy_should_be_denied_for_non_admin_users |
|
| 1130 |
@request.session[:user_id] = 3 |
|
| 1131 | ||
| 1132 |
assert_no_difference 'User.count' do |
|
| 1133 |
delete :bulk_destroy, :params => {:ids => [2], :confirm => 'Yes'}
|
|
| 1134 |
end |
|
| 1135 |
assert_response 403 |
|
| 1136 |
end |
|
| 1137 | ||
| 1138 |
def test_bulk_destroy_should_be_denied_for_anonymous |
|
| 1139 |
assert User.find(6).anonymous? |
|
| 1140 |
assert_no_difference 'User.count' do |
|
| 1141 |
delete :bulk_destroy, :params => {:ids => [6], :confirm => "Yes"}
|
|
| 1142 |
end |
|
| 1143 |
assert_response 404 |
|
| 1144 |
end |
|
| 1088 | 1145 |
end |