Files
danbooru/app/logical/user_promotion.rb
evazion b1af644f67 dmails: send automated dmails from Danbooru.config.system_user.
Sends automated dmails from `Danbooru.config.system_user`, rather than
whichever user is performing the action happens to be (usually User.admins.first).

Also adds a notice in the view that the dmail was automated.
2017-02-23 22:51:17 -06:00

114 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.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]
update_saved_searches
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]")
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]")
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
def update_saved_searches
if user.is_gold?
user.saved_searches.each do |ss|
ss.update_listbooru_on_create
end
else
user.saved_searches.each do |ss|
ss.update_listbooru_on_destroy
end
end
end
end