mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 20:01:14 +08:00
FEATURE: implement lock/unlock trust level mechanics
This commit is contained in:
@ -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),
|
isSuspended: Em.computed.equal('suspended', true),
|
||||||
canSuspend: Em.computed.not('staff'),
|
canSuspend: Em.computed.not('staff'),
|
||||||
|
|
||||||
|
@ -10,15 +10,5 @@
|
|||||||
Discourse.AdminUserTl3RequirementsRoute = Discourse.Route.extend({
|
Discourse.AdminUserTl3RequirementsRoute = Discourse.Route.extend({
|
||||||
model: function() {
|
model: function() {
|
||||||
return this.modelFor('adminUser');
|
return this.modelFor('adminUser');
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
lock_trust_level: function() {
|
|
||||||
this.modelFor('adminUser').lockTrustLevel(true);
|
|
||||||
},
|
|
||||||
|
|
||||||
unlock_trust_level: function() {
|
|
||||||
this.modelFor('adminUser').lockTrustLevel(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -267,12 +267,6 @@
|
|||||||
<div class='field'>{{i18n trust_level}}</div>
|
<div class='field'>{{i18n trust_level}}</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
{{combo-box content=trustLevels value=trust_level nameProperty="detailedName"}}
|
{{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}}
|
{{#if dirty}}
|
||||||
<div>
|
<div>
|
||||||
<button class='btn ok no-text' {{action saveTrustLevel target="content"}}><i class='fa fa-check'></i></button>
|
<button class='btn ok no-text' {{action saveTrustLevel target="content"}}><i class='fa fa-check'></i></button>
|
||||||
@ -280,6 +274,19 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</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>
|
||||||
|
|
||||||
<div {{bind-attr class=":display-row isSuspended:highlight-danger"}}>
|
<div {{bind-attr class=":display-row isSuspended:highlight-danger"}}>
|
||||||
|
@ -85,17 +85,6 @@
|
|||||||
<td>{{num_likes_received}}</td>
|
<td>{{num_likes_received}}</td>
|
||||||
<td>{{min_likes_received}}</td>
|
<td>{{min_likes_received}}</td>
|
||||||
</tr>
|
</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>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{/with}}
|
{{/with}}
|
||||||
|
@ -128,7 +128,20 @@ class Admin::UsersController < Admin::AdminController
|
|||||||
|
|
||||||
def trust_level
|
def trust_level
|
||||||
guardian.ensure_can_change_trust_level!(@user)
|
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)
|
render_serialized(@user, AdminUserSerializer)
|
||||||
rescue Discourse::InvalidAccess => e
|
rescue Discourse::InvalidAccess => e
|
||||||
@ -138,13 +151,23 @@ class Admin::UsersController < Admin::AdminController
|
|||||||
def trust_level_lock
|
def trust_level_lock
|
||||||
guardian.ensure_can_change_trust_level!(@user)
|
guardian.ensure_can_change_trust_level!(@user)
|
||||||
|
|
||||||
new_lock = params[:locked]
|
new_lock = params[:locked].to_s
|
||||||
unless new_lock =~ /t|f|true|false/
|
unless new_lock =~ /true|false/
|
||||||
return render_json_error I18n.t('errors.invalid_boolaen')
|
return render_json_error I18n.t('errors.invalid_boolaen')
|
||||||
end
|
end
|
||||||
|
|
||||||
@user.trust_level_locked = !!(new_lock =~ /t|true/)
|
@user.trust_level_locked = new_lock == "true"
|
||||||
@user.save
|
@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
|
render nothing: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ class AdminUserSerializer < BasicUserSerializer
|
|||||||
:created_at_age,
|
:created_at_age,
|
||||||
:username_lower,
|
:username_lower,
|
||||||
:trust_level,
|
:trust_level,
|
||||||
|
:trust_level_locked,
|
||||||
:flag_level,
|
:flag_level,
|
||||||
:username,
|
:username,
|
||||||
:title,
|
:title,
|
||||||
|
@ -1959,6 +1959,10 @@ en:
|
|||||||
suspend_modal_title: "Suspend User"
|
suspend_modal_title: "Suspend User"
|
||||||
trust_level_2_users: "Trust Level 2 Users"
|
trust_level_2_users: "Trust Level 2 Users"
|
||||||
trust_level_3_requirements: "Trust Level 3 Requirements"
|
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:
|
tl3_requirements:
|
||||||
title: "Requirements for Trust Level 3"
|
title: "Requirements for Trust Level 3"
|
||||||
table_title: "In the last 100 days:"
|
table_title: "In the last 100 days:"
|
||||||
@ -1975,9 +1979,6 @@ en:
|
|||||||
flagged_by_users: "Users Who Flagged"
|
flagged_by_users: "Users Who Flagged"
|
||||||
likes_given: "Likes Given"
|
likes_given: "Likes Given"
|
||||||
likes_received: "Likes Received"
|
likes_received: "Likes Received"
|
||||||
trust_level_locked: "Trust Level Locked"
|
|
||||||
lock_tl: "Lock"
|
|
||||||
unlock_tl: "Unlock"
|
|
||||||
qualifies: "Qualifies for trust level 3."
|
qualifies: "Qualifies for trust level 3."
|
||||||
does_not_qualify: "Doesn't qualify for trust level 3."
|
does_not_qualify: "Doesn't qualify for trust level 3."
|
||||||
will_be_promoted: "Will be promoted soon."
|
will_be_promoted: "Will be promoted soon."
|
||||||
|
@ -297,7 +297,7 @@ en:
|
|||||||
title: "regular"
|
title: "regular"
|
||||||
elder:
|
elder:
|
||||||
title: "leader"
|
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:
|
rate_limiter:
|
||||||
|
@ -12,7 +12,7 @@ class Promotion
|
|||||||
# Returns true if the user was promoted, false otherwise.
|
# Returns true if the user was promoted, false otherwise.
|
||||||
def review
|
def review
|
||||||
# nil users are never promoted
|
# 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.
|
# Promotion beyond basic requires some expensive queries, so don't do that here.
|
||||||
return false if @user.trust_level >= TrustLevel[2]
|
return false if @user.trust_level >= TrustLevel[2]
|
||||||
@ -42,7 +42,7 @@ class Promotion
|
|||||||
old_level = @user.trust_level
|
old_level = @user.trust_level
|
||||||
new_level = level
|
new_level = level
|
||||||
|
|
||||||
if new_level < old_level
|
if new_level < old_level && !@user.trust_level_locked
|
||||||
next_up = new_level+1
|
next_up = new_level+1
|
||||||
key = "tl#{next_up}_met?"
|
key = "tl#{next_up}_met?"
|
||||||
if self.class.respond_to?(key) && self.class.send(key, @user)
|
if self.class.respond_to?(key) && self.class.send(key, @user)
|
||||||
|
Reference in New Issue
Block a user