FEATURE: implement lock/unlock trust level mechanics

This commit is contained in:
Sam 2014-09-30 13:12:33 +10:00
parent e665bfd72a
commit 0fc6c751cb
9 changed files with 52 additions and 37 deletions

View file

@ -182,6 +182,10 @@ Discourse.AdminUser = Discourse.User.extend({
});
},
canLockTrustLevel: function(){
return this.get('trust_level') < 4;
}.property('trust_level'),
isSuspended: Em.computed.equal('suspended', true),
canSuspend: Em.computed.not('staff'),

View file

@ -10,15 +10,5 @@
Discourse.AdminUserTl3RequirementsRoute = Discourse.Route.extend({
model: function() {
return this.modelFor('adminUser');
},
actions: {
lock_trust_level: function() {
this.modelFor('adminUser').lockTrustLevel(true);
},
unlock_trust_level: function() {
this.modelFor('adminUser').lockTrustLevel(false);
}
}
});

View file

@ -267,12 +267,6 @@
<div class='field'>{{i18n trust_level}}</div>
<div class="value">
{{combo-box content=trustLevels value=trust_level nameProperty="detailedName"}}
</div>
<div class="controls">
{{#if tl3Requirements}}
{{#link-to 'adminUser.tl3Requirements' this class="btn"}}{{i18n admin.user.trust_level_3_requirements}}{{/link-to}}
{{/if}}
{{#if dirty}}
<div>
<button class='btn ok no-text' {{action saveTrustLevel target="content"}}><i class='fa fa-check'></i></button>
@ -280,6 +274,19 @@
</div>
{{/if}}
</div>
<div class="controls">
{{#if model.canLockTrustLevel}}
{{#if model.trust_level_locked}}
<i title='{{i18n admin.user.trust_level_locked_tip}}' {{action lockTrustLevel false target="model"}} class='fa fa-lock'></i> <button class="btn" {{action lockTrustLevel false target="model"}}>{{i18n admin.user.unlock_trust_level}}</button>
{{else}}
<i title='{{i18n admin.user.trust_level_unlocked_tip}}' class='fa fa-unlock'></i> <button class="btn" {{action lockTrustLevel true target="model"}}>{{i18n admin.user.lock_trust_level}}</button>
{{/if}}
{{/if}}
{{#if tl3Requirements}}
{{#link-to 'adminUser.tl3Requirements' this class="btn"}}{{i18n admin.user.trust_level_3_requirements}}{{/link-to}}
{{/if}}
</div>
</div>
<div {{bind-attr class=":display-row isSuspended:highlight-danger"}}>

View file

@ -85,17 +85,6 @@
<td>{{num_likes_received}}</td>
<td>{{min_likes_received}}</td>
</tr>
<tr>
<th>{{i18n admin.user.tl3_requirements.trust_level_locked}}</th>
<td><i {{bind-attr class=":fa met.level_locked:fa-lock:fa-unlock"}}></i></td>
{{#if trust_level_locked}}
<td>{{i18n yes_value}}</td>
<td><a class="btn" {{action unlock_trust_level}}>{{i18n admin.user.tl3_requirements.unlock_tl}}</a></td>
{{else}}
<td>{{i18n no_value}}</td>
<td><a class="btn" {{action lock_trust_level}}>{{i18n admin.user.tl3_requirements.lock_tl}}</a></td>
{{/if}}
</tr>
</tbody>
</table>
{{/with}}

View file

@ -128,7 +128,20 @@ class Admin::UsersController < Admin::AdminController
def trust_level
guardian.ensure_can_change_trust_level!(@user)
@user.change_trust_level!(params[:level].to_i, log_action_for: current_user)
level = params[:level].to_i
if !@user.trust_level_locked && [0,1,2].include?(level) && Promotion.send("tl#{level+1}_met?", @user)
@user.trust_level_locked = true
@user.save
end
if !@user.trust_level_locked && level == 3 && Promotion.tl3_lost?(@user)
@user.trust_level_locked = true
@user.save
end
@user.change_trust_level!(level, log_action_for: current_user)
render_serialized(@user, AdminUserSerializer)
rescue Discourse::InvalidAccess => e
@ -138,13 +151,23 @@ class Admin::UsersController < Admin::AdminController
def trust_level_lock
guardian.ensure_can_change_trust_level!(@user)
new_lock = params[:locked]
unless new_lock =~ /t|f|true|false/
new_lock = params[:locked].to_s
unless new_lock =~ /true|false/
return render_json_error I18n.t('errors.invalid_boolaen')
end
@user.trust_level_locked = !!(new_lock =~ /t|true/)
@user.trust_level_locked = new_lock == "true"
@user.save
unless @user.trust_level_locked
p = Promotion.new(@user)
2.times{ p.review }
p.review_tl2
if @user.trust_level == 3 && Promotion.tl3_lost?(@user)
@user.change_trust_level!(2, log_action_for: current_user)
end
end
render nothing: true
end

View file

@ -9,6 +9,7 @@ class AdminUserSerializer < BasicUserSerializer
:created_at_age,
:username_lower,
:trust_level,
:trust_level_locked,
:flag_level,
:username,
:title,

View file

@ -1959,6 +1959,10 @@ en:
suspend_modal_title: "Suspend User"
trust_level_2_users: "Trust Level 2 Users"
trust_level_3_requirements: "Trust Level 3 Requirements"
trust_level_locked_tip: "trust level is locked, system will not promote or demote user"
trust_level_unlocked_tip: "trust level is unlocked, system will may promote or demote user"
lock_trust_level: "Lock Trust Level"
unlock_trust_level: "Unlock Trust Level"
tl3_requirements:
title: "Requirements for Trust Level 3"
table_title: "In the last 100 days:"
@ -1975,9 +1979,6 @@ en:
flagged_by_users: "Users Who Flagged"
likes_given: "Likes Given"
likes_received: "Likes Received"
trust_level_locked: "Trust Level Locked"
lock_tl: "Lock"
unlock_tl: "Unlock"
qualifies: "Qualifies for trust level 3."
does_not_qualify: "Doesn't qualify for trust level 3."
will_be_promoted: "Will be promoted soon."

View file

@ -297,7 +297,7 @@ en:
title: "regular"
elder:
title: "leader"
change_failed_explanation: "You attempted to demote %{user_name} to '%{new_trust_level}'. However their trust level is already '%{current_trust_level}'. %{user_name} will remain at '%{current_trust_level}'"
change_failed_explanation: "You attempted to demote %{user_name} to '%{new_trust_level}'. However their trust level is already '%{current_trust_level}'. %{user_name} will remain at '%{current_trust_level}' - if you wish to demote user lock trust level first"
rate_limiter:

View file

@ -12,7 +12,7 @@ class Promotion
# Returns true if the user was promoted, false otherwise.
def review
# nil users are never promoted
return false if @user.blank?
return false if @user.blank? || @user.trust_level_locked
# Promotion beyond basic requires some expensive queries, so don't do that here.
return false if @user.trust_level >= TrustLevel[2]
@ -42,7 +42,7 @@ class Promotion
old_level = @user.trust_level
new_level = level
if new_level < old_level
if new_level < old_level && !@user.trust_level_locked
next_up = new_level+1
key = "tl#{next_up}_met?"
if self.class.respond_to?(key) && self.class.send(key, @user)