Add reject option to pending users page

This commit is contained in:
Neil Lalonde 2013-08-16 11:42:24 -04:00
parent 30caa0d0b0
commit b6285b85d2
7 changed files with 104 additions and 0 deletions

View File

@ -119,6 +119,24 @@ Discourse.AdminUsersListController = Ember.ArrayController.extend(Discourse.Pres
approveUsers: function() {
Discourse.AdminUser.bulkApprove(this.get('content').filterProperty('selected'));
this.refreshUsers();
},
/**
Reject all the currently selected users.
@method rejectUsers
**/
rejectUsers: function() {
var controller = this;
Discourse.AdminUser.bulkReject(this.get('content').filterProperty('selected')).then(function(result){
var message = I18n.t("admin.users.reject_successful", {count: result.success});
if (result.failed > 0) {
message += ' ' + I18n.t("admin.users.reject_failures", {count: result.failed});
message += ' ' + I18n.t("admin.user.delete_forbidden", {count: Discourse.SiteSettings.delete_user_max_age});
}
bootbox.alert(message);
controller.refreshUsers();
});
}
});

View File

@ -343,6 +343,21 @@ Discourse.AdminUser.reopenClass({
});
},
bulkReject: function(users) {
_.each(users, function(user){
user.set('can_approve', false);
user.set('selected', false);
});
return Discourse.ajax("/admin/users/reject-bulk", {
type: 'DELETE',
data: {
users: users.map(function(u) { return u.id; }),
context: window.location.pathname
}
});
},
find: function(username) {
return Discourse.ajax("/admin/users/" + username).then(function (result) {
result.loadedDetails = true;

View File

@ -20,6 +20,7 @@
{{#if hasSelection}}
<div id='selected-controls'>
<button {{action approveUsers}} class='btn'>{{countI18n admin.users.approved_selected countBinding="selectedCount"}}</button>
<button {{action rejectUsers}} class='btn btn-danger'>{{countI18n admin.users.reject_selected countBinding="selectedCount"}}</button>
</div>
{{/if}}

View File

@ -114,6 +114,15 @@ class Admin::UsersController < Admin::AdminController
render nothing: true
end
def reject_bulk
d = UserDestroyer.new(current_user)
success_count = 0
User.where(id: params[:users]).each do |u|
success_count += 1 if guardian.can_delete_user?(u) and d.destroy(u, params.slice(:context)) rescue UserDestroyer::PostsExistError
end
render json: {success: success_count, failed: (params[:users].try(:size) || 0) - success_count}
end
def destroy
user = User.where(id: params[:id]).first
guardian.ensure_can_delete_user!(user)

View File

@ -1233,6 +1233,9 @@ en:
approved_selected:
one: "approve user"
other: "approve users ({{count}})"
reject_selected:
one: "reject user"
other: "reject users ({{count}})"
titles:
active: 'Active Users'
new: 'New Users'
@ -1246,6 +1249,12 @@ en:
moderators: 'Moderators'
blocked: 'Blocked Users'
banned: 'Banned Users'
reject_successful:
one: "Successfully rejected 1 user."
other: "Successfully rejected %{count} users."
reject_failures:
one: "Failed to reject 1 user."
other: "Failed to reject %{count} users."
user:
ban_failed: "Something went wrong banning this user {{error}}"

View File

@ -36,6 +36,7 @@ Discourse::Application.routes.draw do
collection do
get 'list/:query' => 'users#index'
put 'approve-bulk' => 'users#approve_bulk'
delete 'reject-bulk' => 'users#reject_bulk'
end
put 'ban'
put 'delete_all_posts'

View File

@ -196,6 +196,57 @@ describe Admin::UsersController do
end
end
context '.reject_bulk' do
let(:reject_me) { Fabricate(:user) }
let(:reject_me_too) { Fabricate(:user) }
it 'does nothing without users' do
UserDestroyer.any_instance.expects(:destroy).never
xhr :delete, :reject_bulk
end
it "won't delete users if not allowed" do
Guardian.any_instance.stubs(:can_delete_user?).returns(false)
UserDestroyer.any_instance.expects(:destroy).never
xhr :delete, :reject_bulk, users: [reject_me.id]
end
it "reports successes" do
Guardian.any_instance.stubs(:can_delete_user?).returns(true)
UserDestroyer.any_instance.stubs(:destroy).returns(true)
xhr :delete, :reject_bulk, users: [reject_me.id, reject_me_too.id]
response.should be_success
json = ::JSON.parse(response.body)
json['success'].to_i.should == 2
json['failed'].to_i.should == 0
end
context 'failures' do
before do
Guardian.any_instance.stubs(:can_delete_user?).returns(true)
end
it 'can handle some successes and some failures' do
UserDestroyer.any_instance.stubs(:destroy).with(reject_me, anything).returns(false)
UserDestroyer.any_instance.stubs(:destroy).with(reject_me_too, anything).returns(true)
xhr :delete, :reject_bulk, users: [reject_me.id, reject_me_too.id]
response.should be_success
json = ::JSON.parse(response.body)
json['success'].to_i.should == 1
json['failed'].to_i.should == 1
end
it 'reports failure due to a user still having posts' do
UserDestroyer.any_instance.expects(:destroy).with(reject_me, anything).raises(UserDestroyer::PostsExistError)
xhr :delete, :reject_bulk, users: [reject_me.id]
response.should be_success
json = ::JSON.parse(response.body)
json['success'].to_i.should == 0
json['failed'].to_i.should == 1
end
end
end
context '.destroy' do
before do
@delete_me = Fabricate(:user)