The belongs_to_creator macro was used to initialize the creator_id field to the CurrentUser. This made tests complicated because it meant you had to create and set the current user every time you wanted to create an object, when lead to the current user being set over and over again. It also meant you had to constantly be aware of what the CurrentUser was in many different contexts, which was often confusing. Setting creators explicitly simplifies everything greatly.
102 lines
3.2 KiB
Ruby
102 lines
3.2 KiB
Ruby
class UserPromotion
|
|
attr_reader :user, :promoter, :new_level, :options, :old_can_approve_posts, :old_can_upload_free
|
|
|
|
def initialize(user, promoter, new_level, options = {})
|
|
@user = user
|
|
@promoter = promoter
|
|
@new_level = new_level
|
|
@options = options
|
|
end
|
|
|
|
def promote!
|
|
validate
|
|
|
|
@old_can_approve_posts = user.can_approve_posts?
|
|
@old_can_upload_free = user.can_upload_free?
|
|
|
|
user.level = new_level
|
|
|
|
if options.key?(:can_approve_posts)
|
|
user.can_approve_posts = options[:can_approve_posts]
|
|
end
|
|
|
|
if options.key?(:can_upload_free)
|
|
user.can_upload_free = options[:can_upload_free]
|
|
end
|
|
|
|
user.inviter_id = promoter.id
|
|
|
|
create_user_feedback unless options[:is_upgrade]
|
|
create_dmail unless options[:skip_dmail]
|
|
create_mod_actions
|
|
|
|
user.save
|
|
end
|
|
|
|
private
|
|
|
|
def create_mod_actions
|
|
if old_can_approve_posts != user.can_approve_posts?
|
|
ModAction.log("\"#{promoter.name}\":/users/#{promoter.id} changed approval privileges for \"#{user.name}\":/users/#{user.id} from #{old_can_approve_posts} to [b]#{user.can_approve_posts?}[/b]", :user_approval_privilege)
|
|
end
|
|
|
|
if old_can_upload_free != user.can_upload_free?
|
|
ModAction.log("\"#{promoter.name}\":/users/#{promoter.id} changed unlimited upload privileges for \"#{user.name}\":/users/#{user.id} from #{old_can_upload_free} to [b]#{user.can_upload_free?}[/b]", :user_upload_privilege)
|
|
end
|
|
|
|
if user.level_changed?
|
|
category = options[:is_upgrade] ? :user_account_upgrade : :user_level_change
|
|
ModAction.log(%{"#{user.name}":/users/#{user.id} level changed #{user.level_string_was} -> #{user.level_string}}, category)
|
|
end
|
|
end
|
|
|
|
def validate
|
|
# admins can do anything
|
|
return if promoter.is_admin?
|
|
|
|
# can't promote/demote moderators
|
|
raise User::PrivilegeError if user.is_moderator?
|
|
|
|
# can't promote to admin
|
|
raise User::PrivilegeError if new_level.to_i >= User::Levels::ADMIN
|
|
end
|
|
|
|
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
|
|
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 => "You have been promoted",
|
|
:body => build_messages
|
|
)
|
|
end
|
|
|
|
def create_user_feedback
|
|
UserFeedback.create(user: user, creator: promoter, category: "neutral", body: build_messages, disable_dmail_notification: true)
|
|
end
|
|
end
|