101 lines
2.9 KiB
Ruby
101 lines
2.9 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.has_key?(:can_approve_posts)
|
|
user.can_approve_posts = options[:can_approve_posts]
|
|
end
|
|
|
|
if options.has_key?(:can_upload_free)
|
|
user.can_upload_free = options[:can_upload_free]
|
|
end
|
|
|
|
user.inviter_id = promoter.id
|
|
|
|
create_user_feedback unless options[:skip_feedback]
|
|
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
|
|
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
|
|
user.feedback.create(
|
|
:category => "neutral",
|
|
:body => build_messages,
|
|
:disable_dmail_notification => true
|
|
)
|
|
end
|
|
end
|