Users: add Contributor and Approver user levels
This commit is contained in:
@@ -15,12 +15,10 @@ module ApproverPruner
|
||||
# Get the list of inactive approvers.
|
||||
# @return [Array<User>] the list of inactive approvers
|
||||
def inactive_approvers
|
||||
approvers = User.bit_prefs_match(:can_approve_posts, true)
|
||||
approvers = approvers.where("level < ?", User::Levels::MODERATOR)
|
||||
|
||||
recently_promoted_approvers = UserFeedback.where("created_at >= ?", APPROVAL_PERIOD.ago).where_like(:body, "*You gained the ability to approve posts*").select(:user_id)
|
||||
approvers = approvers.where.not(id: recently_promoted_approvers)
|
||||
recently_promoted_approvers = UserFeedback.where("created_at >= ?", APPROVAL_PERIOD.ago).where_like(:body, "*You gained the ability to approve posts*").pluck(:user_id) # XXX remove in two months
|
||||
recently_promoted_approvers += UserFeedback.where("created_at >= ?", APPROVAL_PERIOD.ago).where_like(:body, "*You have been promoted to an Approver*").pluck(:user_id)
|
||||
|
||||
approvers = User.where(level: User::Levels::APPROVER).where.not(id: recently_promoted_approvers)
|
||||
approvers.select do |approver|
|
||||
approver.post_approvals.where("created_at >= ?", APPROVAL_PERIOD.ago).count < MINIMUM_APPROVALS
|
||||
end
|
||||
@@ -30,7 +28,7 @@ module ApproverPruner
|
||||
def prune!
|
||||
inactive_approvers.each do |user|
|
||||
CurrentUser.scoped(User.system) do
|
||||
user.update!(can_approve_posts: false)
|
||||
user.update!(level: User::Levels::CONTRIBUTOR)
|
||||
user.feedback.create(category: "neutral", body: "Lost approval privileges", creator: User.system)
|
||||
|
||||
Dmail.create_automated(
|
||||
|
||||
@@ -470,7 +470,7 @@ class PostQueryBuilder
|
||||
relation = relation.reorder(Arel.sql("log(3, posts.score) + (extract(epoch from posts.created_at) - extract(epoch from timestamp '2005-05-24')) / 35000 DESC"))
|
||||
|
||||
when "curated"
|
||||
contributors = User.bit_prefs_match(:can_upload_free, true)
|
||||
contributors = User.where("level >= ?", User::Levels::CONTRIBUTOR)
|
||||
|
||||
relation = relation
|
||||
.joins(:favorites)
|
||||
|
||||
@@ -39,7 +39,7 @@ class UploadLimit
|
||||
|
||||
# @return [Boolean] true if the user can't upload because they're out of upload slots.
|
||||
def limited?
|
||||
!user.can_upload_free? && used_upload_slots >= upload_slots
|
||||
!user.is_contributor? && used_upload_slots >= upload_slots
|
||||
end
|
||||
|
||||
# @return [Boolean] true if the user is at max level.
|
||||
@@ -91,7 +91,7 @@ class UploadLimit
|
||||
# @param is_approval [Boolean] true if the post is being approved or
|
||||
# undeleted, false if the post is being deleted.
|
||||
def update_limit!(is_pending, is_approval)
|
||||
return if user.can_upload_free?
|
||||
return if user.is_contributor?
|
||||
|
||||
user.with_lock do
|
||||
# If we're approving or deleting a pending post, we can simply increment
|
||||
|
||||
@@ -5,31 +5,22 @@
|
||||
# user a feedback, sends them a notification dmail, and creates a mod action for
|
||||
# the promotion.
|
||||
class UserPromotion
|
||||
attr_reader :user, :promoter, :new_level, :old_can_approve_posts, :old_can_upload_free, :can_upload_free, :can_approve_posts
|
||||
attr_reader :user, :promoter, :new_level
|
||||
|
||||
# Initialize a new promotion.
|
||||
# @param user [User] the user to promote
|
||||
# @param promoter [User] the user doing the promotion
|
||||
# @param new_level [Integer] the new user level
|
||||
# @param can_upload_free [Boolean] whether the user should gain unlimited upload privileges
|
||||
# @param can_approve_posts [Boolean] whether the user should gain approval privileges
|
||||
def initialize(user, promoter, new_level, can_upload_free: nil, can_approve_posts: nil)
|
||||
def initialize(user, promoter, new_level)
|
||||
@user = user
|
||||
@promoter = promoter
|
||||
@new_level = new_level.to_i
|
||||
@can_upload_free = can_upload_free
|
||||
@can_approve_posts = can_approve_posts
|
||||
end
|
||||
|
||||
def promote!
|
||||
validate!
|
||||
|
||||
@old_can_approve_posts = user.can_approve_posts?
|
||||
@old_can_upload_free = user.can_upload_free?
|
||||
|
||||
user.level = new_level
|
||||
user.can_upload_free = can_upload_free unless can_upload_free.nil?
|
||||
user.can_approve_posts = can_approve_posts unless can_approve_posts.nil?
|
||||
|
||||
create_user_feedback
|
||||
create_dmail
|
||||
@@ -41,18 +32,6 @@ class UserPromotion
|
||||
private
|
||||
|
||||
def create_mod_actions
|
||||
if old_can_approve_posts == false && user.can_approve_posts? == true
|
||||
ModAction.log("granted approval privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, subject: user, user: promoter)
|
||||
elsif old_can_approve_posts == true && user.can_approve_posts? == false
|
||||
ModAction.log("removed approval privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, subject: user, user: promoter)
|
||||
end
|
||||
|
||||
if old_can_upload_free == false && user.can_upload_free? == true
|
||||
ModAction.log("granted unlimited upload privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, subject: user, user: promoter)
|
||||
elsif old_can_upload_free == false && user.can_upload_free? == true
|
||||
ModAction.log("removed unlimited upload privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, subject: user, user: promoter)
|
||||
end
|
||||
|
||||
if user.level_changed? && user.level >= user.level_was
|
||||
ModAction.log(%{promoted "#{user.name}":#{Routes.user_path(user)} from #{user.level_string_was} to #{user.level_string}}, :user_level_change, subject: user, user: promoter)
|
||||
elsif user.level_changed? && user.level < user.level_was
|
||||
@@ -73,37 +52,20 @@ class UserPromotion
|
||||
end
|
||||
|
||||
# Build the dmail and user feedback message.
|
||||
def build_messages
|
||||
messages = []
|
||||
|
||||
if user.level_changed?
|
||||
if user.level > user.level_was
|
||||
messages << "You have been promoted to a #{user.level_string} level account from #{user.level_string_was}."
|
||||
elsif user.level < user.level_was
|
||||
messages << "You have been demoted to a #{user.level_string} level account from #{user.level_string_was}."
|
||||
end
|
||||
def build_message
|
||||
level_string = (user.level == User::Levels::APPROVER) ? "an Approver" : "a #{user.level_string}"
|
||||
if user.level > user.level_was
|
||||
"You have been promoted to #{level_string} level account from #{user.level_string_was}."
|
||||
elsif user.level < user.level_was
|
||||
"You have been demoted to #{level_string} level account from #{user.level_string_was}."
|
||||
end
|
||||
|
||||
if user.can_approve_posts? && !old_can_approve_posts
|
||||
messages << "You gained the ability to approve posts."
|
||||
elsif !user.can_approve_posts? && old_can_approve_posts
|
||||
messages << "You lost the ability to approve posts."
|
||||
end
|
||||
|
||||
if user.can_upload_free? && !old_can_upload_free
|
||||
messages << "You gained the ability to upload posts without limit."
|
||||
elsif !user.can_upload_free? && old_can_upload_free
|
||||
messages << "You lost the ability to upload posts without limit."
|
||||
end
|
||||
|
||||
messages.join("\n")
|
||||
end
|
||||
|
||||
def create_dmail
|
||||
Dmail.create_automated(to_id: user.id, title: "Your account has been updated", body: build_messages)
|
||||
Dmail.create_automated(to_id: user.id, title: "Your account has been updated", body: build_message)
|
||||
end
|
||||
|
||||
def create_user_feedback
|
||||
UserFeedback.create(user: user, creator: promoter, category: "neutral", body: build_messages, disable_dmail_notification: true)
|
||||
UserFeedback.create(user: user, creator: promoter, category: "neutral", body: build_message, disable_dmail_notification: true)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user