pull moderator into own column, rename trust levels

This commit is contained in:
Sam 2013-03-19 21:05:19 -07:00
parent 0f5046a9cc
commit 62c60540be
21 changed files with 75 additions and 62 deletions

View file

@ -67,7 +67,7 @@ class Admin::UsersController < Admin::AdminController
def revoke_moderation def revoke_moderation
@moderator = User.where(id: params[:user_id]).first @moderator = User.where(id: params[:user_id]).first
guardian.ensure_can_revoke_moderation!(@moderator) guardian.ensure_can_revoke_moderation!(@moderator)
@moderator.change_trust_level(:advanced) @moderator.moderator = false
@moderator.save @moderator.save
render nothing: true render nothing: true
end end
@ -75,7 +75,7 @@ class Admin::UsersController < Admin::AdminController
def grant_moderation def grant_moderation
@user = User.where(id: params[:user_id]).first @user = User.where(id: params[:user_id]).first
guardian.ensure_can_grant_moderation!(@user) guardian.ensure_can_grant_moderation!(@user)
@user.change_trust_level(:moderator) @user.moderator = true
@user.save @user.save
render_serialized(@user, AdminUserSerializer) render_serialized(@user, AdminUserSerializer)
end end

View file

@ -71,8 +71,8 @@ class PostActionsController < ApplicationController
requires_parameter(:id) requires_parameter(:id)
finder = Post.where(id: params[:id]) finder = Post.where(id: params[:id])
# Include deleted posts if the user is a moderator # Include deleted posts if the user is a moderator (to guardian ?)
finder = finder.with_deleted if current_user.try(:has_trust_level?, :moderator) finder = finder.with_deleted if current_user.moderator?
@post = finder.first @post = finder.first
guardian.ensure_can_see!(@post) guardian.ensure_can_see!(@post)

View file

@ -153,7 +153,7 @@ class PostsController < ApplicationController
finder = Post.where(id: params[:id] || params[:post_id]) finder = Post.where(id: params[:id] || params[:post_id])
# Include deleted posts if the user is a moderator # Include deleted posts if the user is a moderator
finder = finder.with_deleted if current_user.try(:has_trust_level?, :moderator) finder = finder.with_deleted if current_user.try(:moderator?)
post = finder.first post = finder.first
guardian.ensure_can_see!(post) guardian.ensure_can_see!(post)

View file

@ -237,7 +237,10 @@ class User < ActiveRecord::Base
end end
def moderator? def moderator?
has_trust_level?(:moderator) # this saves us from checking both, admins are always moderators
#
# in future we may split this out
admin || moderator
end end
def regular? def regular?
@ -399,7 +402,7 @@ class User < ActiveRecord::Base
# Takes into account admin, etc. # Takes into account admin, etc.
def has_trust_level?(level) def has_trust_level?(level)
raise "Invalid trust level #{level}" unless TrustLevel.valid_level?(level) raise "Invalid trust level #{level}" unless TrustLevel.valid_level?(level)
admin? || TrustLevel.compare(trust_level, level) admin? || moderator? || TrustLevel.compare(trust_level, level)
end end
# a touch faster than automatic # a touch faster than automatic

View file

@ -36,7 +36,7 @@ class AdminDetailedUserSerializer < AdminUserSerializer
end end
def moderator def moderator
object.has_trust_level?(:moderator) object.moderator
end end
end end

View file

@ -27,7 +27,7 @@ class CurrentUserSerializer < BasicUserSerializer
end end
def moderator? def moderator?
object.has_trust_level?(:moderator) object.moderator?
end end
def site_flagged_posts_count def site_flagged_posts_count

View file

@ -53,7 +53,7 @@ class PostSerializer < ApplicationSerializer
end end
def moderator? def moderator?
object.user.has_trust_level?(:moderator) object.user.moderator?
end end
def avatar_template def avatar_template

View file

@ -80,18 +80,16 @@ en:
post_template: "%{replace_paragraph}\n\nUse this space below for a longer description, as well as to establish any rules or discussion!" post_template: "%{replace_paragraph}\n\nUse this space below for a longer description, as well as to establish any rules or discussion!"
trust_levels: trust_levels:
new: visitor:
title: "new user" title: "visitor"
basic: basic:
title: "basic user" title: "basic user"
regular: regular:
title: "regular user" title: "regular user"
experienced: leader:
title: "experienced user" title: "leader"
advanced: elder:
title: "advanced user" title: "elder"
moderator:
title: "moderator"
rate_limiter: rate_limiter:
too_many_requests: "You're doing that too often. Please wait %{time_left} before trying again." too_many_requests: "You're doing that too often. Please wait %{time_left} before trying again."

View file

@ -0,0 +1,10 @@
class AddModeratorToUser < ActiveRecord::Migration
def up
add_column :users, :moderator, :boolean, default: false
execute "UPDATE users SET trust_level = 1, moderator = 't' where trust_level = 5"
end
def down
remove_column :users, :moderator
end
end

View file

@ -50,7 +50,7 @@ class Guardian
def can_moderate?(obj) def can_moderate?(obj)
return false if obj.blank? return false if obj.blank?
return false if @user.blank? return false if @user.blank?
@user.has_trust_level?(:moderator) @user.moderator?
end end
alias :can_move_posts? :can_moderate? alias :can_move_posts? :can_moderate?
alias :can_see_flags? :can_moderate? alias :can_see_flags? :can_moderate?
@ -99,7 +99,7 @@ class Guardian
return false if target.blank? return false if target.blank?
return false if @user.blank? return false if @user.blank?
return false if target.approved? return false if target.approved?
@user.has_trust_level?(:moderator) @user.moderator?
end end
def can_ban?(user) def can_ban?(user)
@ -112,7 +112,7 @@ class Guardian
def can_clear_flags?(post) def can_clear_flags?(post)
return false if @user.blank? return false if @user.blank?
return false if post.blank? return false if post.blank?
@user.has_trust_level?(:moderator) @user.moderator?
end end
def can_revoke_admin?(admin) def can_revoke_admin?(admin)
@ -135,7 +135,7 @@ class Guardian
return false unless @user.try(:admin?) return false unless @user.try(:admin?)
return false if moderator.blank? return false if moderator.blank?
return false if @user.id == moderator.id return false if @user.id == moderator.id
return false unless moderator.trust_level == TrustLevel.levels[:moderator] return false unless moderator.moderator?
true true
end end
@ -144,7 +144,7 @@ class Guardian
return false if user.blank? return false if user.blank?
return false if @user.id == user.id return false if @user.id == user.id
return false if user.admin? return false if user.admin?
return false if user.has_trust_level?(:moderator) return false if user.moderator?
true true
end end
@ -175,7 +175,7 @@ class Guardian
return false if @user.blank? return false if @user.blank?
return false unless can_see?(object) return false unless can_see?(object)
return false if SiteSetting.must_approve_users? return false if SiteSetting.must_approve_users?
@user.has_trust_level?(:moderator) @user.moderator?
end end
@ -218,11 +218,11 @@ class Guardian
# Creating Methods # Creating Methods
def can_create_category?(parent) def can_create_category?(parent)
@user.has_trust_level?(:moderator) @user.moderator?
end end
def can_create_post_on_topic?(topic) def can_create_post_on_topic?(topic)
return true if @user.has_trust_level?(:moderator) return true if @user.moderator?
return false if topic.closed? return false if topic.closed?
return false if topic.archived? return false if topic.archived?
true true
@ -230,11 +230,11 @@ class Guardian
# Editing Methods # Editing Methods
def can_edit_category?(category) def can_edit_category?(category)
@user.has_trust_level?(:moderator) @user.moderator?
end end
def can_edit_post?(post) def can_edit_post?(post)
return true if @user.has_trust_level?(:moderator) return true if @user.moderator?
return false if post.topic.archived? return false if post.topic.archived?
(post.user == @user) (post.user == @user)
end end
@ -245,7 +245,7 @@ class Guardian
end end
def can_edit_topic?(topic) def can_edit_topic?(topic)
return true if @user.has_trust_level?(:moderator) return true if @user.moderator?
return true if topic.user == @user return true if topic.user == @user
false false
end end
@ -258,22 +258,22 @@ class Guardian
# You can delete your own posts # You can delete your own posts
return !post.user_deleted? if post.user == @user return !post.user_deleted? if post.user == @user
@user.has_trust_level?(:moderator) @user.moderator?
end end
# Recovery Method # Recovery Method
def can_recover_post?(post) def can_recover_post?(post)
return false if @user.blank? return false if @user.blank?
@user.has_trust_level?(:moderator) @user.moderator?
end end
def can_delete_category?(category) def can_delete_category?(category)
return false unless @user.has_trust_level?(:moderator) return false unless @user.moderator?
return category.topic_count == 0 return category.topic_count == 0
end end
def can_delete_topic?(topic) def can_delete_topic?(topic)
return false unless @user.has_trust_level?(:moderator) return false unless @user.moderator?
return false if Category.exists?(topic_id: topic.id) return false if Category.exists?(topic_id: topic.id)
true true
end end

View file

@ -21,7 +21,7 @@ class Promotion
false false
end end
def review_new def review_visitor
return false if @user.topics_entered < SiteSetting.basic_requires_topics_entered return false if @user.topics_entered < SiteSetting.basic_requires_topics_entered
return false if @user.posts_read_count < SiteSetting.basic_requires_read_posts return false if @user.posts_read_count < SiteSetting.basic_requires_read_posts
return false if (@user.time_read / 60) < SiteSetting.basic_requires_time_spent_mins return false if (@user.time_read / 60) < SiteSetting.basic_requires_time_spent_mins

View file

@ -22,7 +22,7 @@ class RateLimiter
def can_perform? def can_perform?
return true if RateLimiter.disabled? return true if RateLimiter.disabled?
return true if @user.has_trust_level?(:moderator) return true if @user.moderator?
result = $redis.get(@key) result = $redis.get(@key)
return true if result.blank? return true if result.blank?
@ -32,7 +32,7 @@ class RateLimiter
def performed! def performed!
return if RateLimiter.disabled? return if RateLimiter.disabled?
return if @user.has_trust_level?(:moderator) return if @user.moderator?
result = $redis.incr(@key).to_i result = $redis.incr(@key).to_i
$redis.expire(@key, @secs) if result == 1 $redis.expire(@key, @secs) if result == 1

View file

@ -6,7 +6,7 @@ class TrustLevel
class << self class << self
def levels def levels
@levels ||= Enum.new( @levels ||= Enum.new(
:new, :basic, :regular, :experienced, :advanced, :moderator, start: 0 :visitor, :basic, :regular, :leader, :elder, start: 0
) )
end end
@ -21,7 +21,7 @@ class TrustLevel
end end
def compare(current_level, level) def compare(current_level, level)
(current_level || levels[:new]) >= levels[level] rescue binding.pry (current_level || levels[:visitor]) >= levels[level] rescue binding.pry
end end
end end

View file

@ -126,7 +126,7 @@ describe PostCreator do
end end
it "returns a post for moderators" do it "returns a post for moderators" do
user.trust_level = TrustLevel.levels[:moderator] user.moderator = true
new_post_creator.create new_post_creator.create
new_post_creator.errors.should be_blank new_post_creator.errors.should be_blank
end end

View file

@ -3,9 +3,9 @@ require 'promotion'
describe Promotion do describe Promotion do
context "new user" do context "visitor" do
let(:user) { Fabricate(:user, trust_level: TrustLevel.levels[:new])} let(:user) { Fabricate(:user, trust_level: TrustLevel.levels[:visitor])}
let(:promotion) { Promotion.new(user) } let(:promotion) { Promotion.new(user) }
it "doesn't raise an error with a nil user" do it "doesn't raise an error with a nil user" do
@ -20,7 +20,7 @@ describe Promotion do
end end
it "has not changed the user's trust level" do it "has not changed the user's trust level" do
user.trust_level.should == TrustLevel.levels[:new] user.trust_level.should == TrustLevel.levels[:visitor]
end end
end end

View file

@ -66,12 +66,12 @@ describe RateLimiter do
end end
it "returns true for can_perform if the user is a mod" do it "returns true for can_perform if the user is a mod" do
user.trust_level = TrustLevel.levels[:moderator] user.moderator = true
rate_limiter.can_perform?.should be_true rate_limiter.can_perform?.should be_true
end end
it "doesn't raise an error when a moderator performs the task" do it "doesn't raise an error when a moderator performs the task" do
user.trust_level = TrustLevel.levels[:moderator] user.moderator = true
lambda { rate_limiter.performed! }.should_not raise_error lambda { rate_limiter.performed! }.should_not raise_error
end end

View file

@ -134,7 +134,7 @@ describe Admin::UsersController do
it 'updates the moderator flag' do it 'updates the moderator flag' do
xhr :put, :revoke_moderation, user_id: @moderator.id xhr :put, :revoke_moderation, user_id: @moderator.id
@moderator.reload @moderator.reload
@moderator.has_trust_level?(:moderator).should_not be_true @moderator.moderator.should_not be_true
end end
end end
@ -157,7 +157,7 @@ describe Admin::UsersController do
it 'updates the moderator flag' do it 'updates the moderator flag' do
xhr :put, :grant_moderation, user_id: @another_user.id xhr :put, :grant_moderation, user_id: @another_user.id
@another_user.reload @another_user.reload
@another_user.has_trust_level?(:moderator).should be_true @another_user.moderator.should be_true
end end
end end

View file

@ -326,7 +326,7 @@ describe TopicsController do
end end
it "reviews the user for a promotion if they're new" do it "reviews the user for a promotion if they're new" do
user.update_column(:trust_level, TrustLevel.levels[:new]) user.update_column(:trust_level, TrustLevel.levels[:visitor])
Promotion.any_instance.expects(:review) Promotion.any_instance.expects(:review)
get :show, id: topic.id get :show, id: topic.id
end end

View file

@ -32,7 +32,7 @@ Fabricator(:moderator, from: :user) do
name 'A. Moderator' name 'A. Moderator'
username 'moderator' username 'moderator'
email 'moderator@discourse.org' email 'moderator@discourse.org'
trust_level TrustLevel.levels[:moderator] moderator true
end end
Fabricator(:admin, from: :user) do Fabricator(:admin, from: :user) do

View file

@ -161,8 +161,8 @@ describe Invite do
context 'invite trust levels' do context 'invite trust levels' do
it "returns the trust level in default_invitee_trust_level" do it "returns the trust level in default_invitee_trust_level" do
SiteSetting.stubs(:default_invitee_trust_level).returns(TrustLevel.levels[:experienced]) SiteSetting.stubs(:default_invitee_trust_level).returns(TrustLevel.levels[:leader])
invite.redeem.trust_level.should == TrustLevel.levels[:experienced] invite.redeem.trust_level.should == TrustLevel.levels[:leader]
end end
end end

View file

@ -225,11 +225,13 @@ describe User do
end end
describe "trust levels" do describe "trust levels" do
let(:user) { Fabricate(:user, trust_level: TrustLevel.levels[:new]) }
# NOTE be sure to use build to avoid db calls
let(:user) { Fabricate.build(:user, trust_level: TrustLevel.levels[:visitor]) }
it "sets to the default trust level setting" do it "sets to the default trust level setting" do
SiteSetting.expects(:default_trust_level).returns(TrustLevel.levels[:advanced]) SiteSetting.expects(:default_trust_level).returns(TrustLevel.levels[:elder])
User.new.trust_level.should == TrustLevel.levels[:advanced] User.new.trust_level.should == TrustLevel.levels[:elder]
end end
describe 'has_trust_level?' do describe 'has_trust_level?' do
@ -239,39 +241,39 @@ describe User do
end end
it "is true for your basic level" do it "is true for your basic level" do
user.has_trust_level?(:new).should be_true user.has_trust_level?(:visitor).should be_true
end end
it "is false for a higher level" do it "is false for a higher level" do
user.has_trust_level?(:moderator).should be_false user.has_trust_level?(:regular).should be_false
end end
it "is true if you exceed the level" do it "is true if you exceed the level" do
user.trust_level = TrustLevel.levels[:advanced] user.trust_level = TrustLevel.levels[:elder]
user.has_trust_level?(:basic).should be_true user.has_trust_level?(:visitor).should be_true
end end
it "is true for an admin even with a low trust level" do it "is true for an admin even with a low trust level" do
user.trust_level = TrustLevel.levels[:new] user.trust_level = TrustLevel.levels[:new]
user.admin = true user.admin = true
user.has_trust_level?(:advanced).should be_true user.has_trust_level?(:elder).should be_true
end end
end end
describe 'moderator' do describe 'moderator' do
it "isn't a moderator by default" do it "isn't a moderator by default" do
user.has_trust_level?(:moderator).should be_false user.moderator?.should be_false
end end
it "is a moderator if the user level is moderator" do it "is a moderator if the user level is moderator" do
user.trust_level = TrustLevel.levels[:moderator] user.moderator = true
user.has_trust_level?(:moderator).should be_true user.has_trust_level?(:elder).should be_true
end end
it "is a moderator if the user is an admin" do it "is a moderator if the user is an admin" do
user.admin = true user.admin = true
user.has_trust_level?(:moderator).should be_true user.moderator?.should be_true
end end
end end