mirror of
https://github.com/discourse/discourse.git
synced 2026-09-05 04:40:41 -05:00
FEATURE: Ability to clear a user's penalty history
You can do this manually if you want to allow them to reach TL3 without their penalty history counting against them.
This commit is contained in:
@@ -103,6 +103,16 @@ export default Ember.Controller.extend(CanCheckEmails, {
|
||||
anonymize() { return this.get('model').anonymize(); },
|
||||
disableSecondFactor() { return this.get('model').disableSecondFactor(); },
|
||||
|
||||
|
||||
clearPenaltyHistory() {
|
||||
let user = this.get('model');
|
||||
return ajax(`/admin/users/${user.get('id')}/penalty_history`, {
|
||||
type: 'DELETE'
|
||||
}).then(() => {
|
||||
user.set('tl3_requirements.penalty_counts.total', 0);
|
||||
}).catch(popupAjaxError);
|
||||
},
|
||||
|
||||
destroy() {
|
||||
const postCount = this.get('model.post_count');
|
||||
if (postCount <= 5) {
|
||||
|
||||
@@ -408,6 +408,21 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if model.tl3_requirements.penalty_counts.total}}
|
||||
<div class='display-row clear-penalty-history'>
|
||||
<div class='field'>{{i18n 'admin.user.penalty_count'}}</div>
|
||||
<div class='value'>{{model.tl3_requirements.penalty_counts.total}}</div>
|
||||
{{#if currentUser.admin}}
|
||||
<div class='controls'>
|
||||
{{d-button label="admin.user.clear_penalty_history.title"
|
||||
icon="times"
|
||||
action=(action "clearPenaltyHistory")}}
|
||||
{{i18n "admin.user.clear_penalty_history.description"}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
</section>
|
||||
|
||||
{{#if currentUser.admin}}
|
||||
|
||||
@@ -54,6 +54,46 @@ class Admin::UsersController < Admin::AdminController
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE action to delete penalty history for a user
|
||||
def penalty_history
|
||||
|
||||
# We don't delete any history, we merely remove the action type
|
||||
# with a removed type. It can still be viewed in the logs but
|
||||
# will not affect TL3 promotions.
|
||||
sql = <<~SQL
|
||||
UPDATE user_histories
|
||||
SET action = CASE
|
||||
WHEN action = :silence_user THEN :removed_silence_user
|
||||
WHEN action = :unsilence_user THEN :removed_unsilence_user
|
||||
WHEN action = :suspend_user THEN :removed_suspend_user
|
||||
WHEN action = :unsuspend_user THEN :removed_unsuspend_user
|
||||
END
|
||||
WHERE target_user_id = :user_id
|
||||
AND action IN (
|
||||
:silence_user,
|
||||
:suspend_user,
|
||||
:unsilence_user,
|
||||
:unsuspend_user
|
||||
)
|
||||
SQL
|
||||
|
||||
UserHistory.exec_sql(
|
||||
sql,
|
||||
UserHistory.actions.slice(
|
||||
:silence_user,
|
||||
:suspend_user,
|
||||
:unsilence_user,
|
||||
:unsuspend_user,
|
||||
:removed_silence_user,
|
||||
:removed_unsilence_user,
|
||||
:removed_suspend_user,
|
||||
:removed_unsuspend_user
|
||||
).merge(user_id: params[:user_id].to_i)
|
||||
)
|
||||
|
||||
render json: success_json
|
||||
end
|
||||
|
||||
def suspend
|
||||
guardian.ensure_can_suspend!(@user)
|
||||
@user.suspended_till = params[:suspend_until]
|
||||
|
||||
@@ -76,6 +76,10 @@ class UserHistory < ActiveRecord::Base
|
||||
create_badge: 57,
|
||||
change_badge: 58,
|
||||
delete_badge: 59,
|
||||
removed_silence_user: 60,
|
||||
removed_suspend_user: 61,
|
||||
removed_unsilence_user: 62,
|
||||
removed_unsuspend_user: 63,
|
||||
)
|
||||
end
|
||||
|
||||
@@ -90,6 +94,8 @@ class UserHistory < ActiveRecord::Base
|
||||
:change_site_text,
|
||||
:suspend_user,
|
||||
:unsuspend_user,
|
||||
:removed_suspend_user,
|
||||
:removed_unsuspend_user,
|
||||
:grant_badge,
|
||||
:revoke_badge,
|
||||
:check_email,
|
||||
@@ -106,6 +112,8 @@ class UserHistory < ActiveRecord::Base
|
||||
:create_category,
|
||||
:silence_user,
|
||||
:unsilence_user,
|
||||
:removed_silence_user,
|
||||
:removed_unsilence_user,
|
||||
:grant_admin,
|
||||
:revoke_admin,
|
||||
:grant_moderation,
|
||||
|
||||
Reference in New Issue
Block a user