103 lines
3.8 KiB
Ruby
103 lines
3.8 KiB
Ruby
class JanitorTrial < ActiveRecord::Base
|
|
belongs_to :user
|
|
after_create :send_dmail
|
|
after_create :promote_user
|
|
validates_presence_of :user
|
|
before_validation :initialize_creator
|
|
attr_accessible :user_id, :user_name
|
|
validates_inclusion_of :status, :in => %w(active inactive)
|
|
before_validation :initialize_status
|
|
validates_uniqueness_of :user_id
|
|
|
|
def self.search(params)
|
|
q = where("status = ?", "active")
|
|
return q if params.blank?
|
|
|
|
if params[:user_name]
|
|
q = q.where("user_id = (select _.id from users _ where lower(_.name) = ?)", params[:user_name].mb_chars.downcase)
|
|
end
|
|
|
|
if params[:user_id]
|
|
q = q.where("user_id = ?", params[:user_id].to_i)
|
|
end
|
|
|
|
q
|
|
end
|
|
|
|
def self.message_candidates!
|
|
admin = User.admins.first
|
|
|
|
User.where("last_logged_in_at >= ? and created_at <= ? and email is not null and (favorite_count >= 400 OR post_upload_count >= 400) and level between ? and ?", 1.week.ago, 6.months.ago, User::Levels::MEMBER, User::Levels::CONTRIBUTOR).order("random()").limit(10).each do |user|
|
|
if !Dmail.where("from_id = ? and to_id = ? and title = ?", admin.id, user.id, "Test Janitor Invitation").exists?
|
|
favorites = user.favorites.order("random()").limit(400).map(&:post_id)
|
|
uploads = user.posts.order("random()").limit(400).map(&:id)
|
|
p50 = ActiveRecord::Base.select_value_sql("select percentile_cont(0.50) within group (order by score) from posts where id in (?)", favorites + uploads).to_f
|
|
|
|
if p50 > 3 and p50 <= 10
|
|
CurrentUser.scoped(admin, "127.0.0.1") do
|
|
body = <<-EOS
|
|
Janitors on #{Danbooru.config.app_name} are responsible for helping maintain a high level of quality on the site. They approve uploads from other users and help with other moderation efforts. You would be expected at a minimum to approve a few posts a week. If you are interested, please respond to this message.
|
|
EOS
|
|
|
|
Dmail.create_split(:title => "Test Janitor Invitation", :body => body, :to_id => user.id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def initialize_status
|
|
self.status = "active"
|
|
end
|
|
|
|
def initialize_creator
|
|
self.creator_id = CurrentUser.id
|
|
end
|
|
|
|
def user_name
|
|
user.try(:name)
|
|
end
|
|
|
|
def user_name=(name)
|
|
self.user_id = User.name_to_id(name)
|
|
end
|
|
|
|
def send_dmail
|
|
body = "You have been selected as a test janitor. You can now approve pending posts and have access to the moderation interface. You should reacquaint yourself with the [[howto:upload]] guide to make sure you understand the site rules.\n\nOver the next several weeks your approvals will be monitored. If the majority of them are not quality uploads you will fail the trial period and lose your approval privileges. You will also receive a negative user record indicating you previously attempted and failed a test janitor trial.\n\nThere is a minimum quota of 1 approval a month to indicate that you are being active. Remember, the goal isn't to approve as much as possible. It's to filter out borderline-quality art.\n\nIf you have any questions please respond to this message."
|
|
|
|
Dmail.create_split(:title => "Test Janitor Trial Period", :body => body, :to_id => user_id)
|
|
end
|
|
|
|
def promote_user
|
|
user.can_approve_posts = true
|
|
user.save
|
|
end
|
|
|
|
def create_feedback
|
|
user.feedback.create(
|
|
:category => "negative",
|
|
:body => "Lost approval privileges"
|
|
)
|
|
end
|
|
|
|
def promote!
|
|
update_attribute(:status, "inactive")
|
|
user.feedback.create(:category => "neutral", :body => "Gained approval privileges")
|
|
end
|
|
|
|
def demote!
|
|
user.can_approve_posts = false
|
|
user.save
|
|
update_attribute(:status, "inactive")
|
|
self.create_feedback
|
|
end
|
|
|
|
def active?
|
|
status == "active"
|
|
end
|
|
|
|
def inactive?
|
|
status == "inactive"
|
|
end
|
|
end
|