From dc2038593236790e61eb7927361a2dac6fa07ec8 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Fri, 12 Jun 2015 12:52:24 -0700 Subject: [PATCH] work on #2408 --- app/logical/janitor_pruner.rb | 29 +++++++++++++++++++ app/logical/monthly_maintenance.rb | 6 ++++ app/logical/weekly_maintenance.rb | 1 + app/models/janitor_trial.rb | 23 ++++++++++++++- config/schedule.rb | 4 +++ .../functional/upload/twitter.yml | 2 +- .../vcr_cassettes/upload-new-twitter.yml | 2 +- 7 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 app/logical/janitor_pruner.rb create mode 100644 app/logical/monthly_maintenance.rb diff --git a/app/logical/janitor_pruner.rb b/app/logical/janitor_pruner.rb new file mode 100644 index 000000000..75511c95d --- /dev/null +++ b/app/logical/janitor_pruner.rb @@ -0,0 +1,29 @@ +class JanitorPruner + def inactive_janitors + admin = User.admins.first + + User.where("level = ?", User::Levels::JANITOR).select do |user| + approval_count = Post.where("created_at >= ? and approver_id = ?", 2.months.ago, user.id).count + approval_count == 0 + end + end + + def prune! + inactive_janitors.each do |user| + CurrentUser.scoped(admin, "127.0.0.1") do + Dmail.create_split( + :to_id => user.id, + :title => "Janitor inactivity", + :body => "You haven't approved a post in the past two months. In order to make sure the list of active janitors is up-to-date, you have lost your janitor privileges. Please reply to this message if you want to be reinstated." + ) + + janitor_trial = JanitorTrial.where(user_id: user.id).first + if janitor_trial + user.promote_to!(janitor_trial.original_level, :skip_feedback => true) + else + user.promote_to!(User::Levels::GOLD, :skip_feedback => true) + end + end + end + end +end diff --git a/app/logical/monthly_maintenance.rb b/app/logical/monthly_maintenance.rb new file mode 100644 index 000000000..057496d18 --- /dev/null +++ b/app/logical/monthly_maintenance.rb @@ -0,0 +1,6 @@ +class MonthlyMaintenance + def run + ActiveRecord::Base.connection.execute("set statement_timeout = 0") + JanitorTrial.new.message_candidates! + end +end diff --git a/app/logical/weekly_maintenance.rb b/app/logical/weekly_maintenance.rb index 0eac0f846..dcca7e6b8 100644 --- a/app/logical/weekly_maintenance.rb +++ b/app/logical/weekly_maintenance.rb @@ -2,5 +2,6 @@ class WeeklyMaintenance def run ActiveRecord::Base.connection.execute("set statement_timeout = 0") UserPasswordResetNonce.prune! + JanitorPruner.new.prune! end end diff --git a/app/models/janitor_trial.rb b/app/models/janitor_trial.rb index 070e86adb..e1004d470 100644 --- a/app/models/janitor_trial.rb +++ b/app/models/janitor_trial.rb @@ -22,6 +22,27 @@ class JanitorTrial < ActiveRecord::Base 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 >= 200 and level between ? and ?", 1.week.ago, 6.months.ago, User::Levels::MEMBER, User::Levels::CONTRIBUTOR).order("random()").limit(5).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) + p50 = ActiveRecord::Base.select_value_sql("select percentile_cont(0.50) within group (order by score) from posts where id in (?)", favorites.map(&:post_id)).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, :from_id => admin.id) + end + end + end + end + end + def initialize_creator self.creator_id = CurrentUser.id end @@ -39,7 +60,7 @@ class JanitorTrial < ActiveRecord::Base 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.\n\nOver the next several weeks your approvals will be monitored. If the majority of them are quality uploads, then you will be promoted to full janitor status which grants you the ability to delete and undelete posts, ban users, and revert tag changes from vandals. If you fail the trial period, you will be demoted back to your original level and you'll receive a negative user record indicating you previously attempted and failed a test janitor trial.\n\nThere is a minimum quota of 5 approvals a week 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." + 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 quality uploads, then you will be promoted to full janitor status which grants you the ability to delete and undelete posts, ban users, and revert tag changes from vandals. If you fail the trial period, you will be demoted back to your original level and you'll 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 diff --git a/config/schedule.rb b/config/schedule.rb index 3a8cb63f5..ef9b1156e 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -19,6 +19,10 @@ every 1.week, :at => "1:30 am" do runner "WeeklyMaintenance.new.run" end +every 1.month, :at => "2:00 am" do + runner "MonthlyMaintenance.new.run" +end + if environment == "production" every 1.hour do runner "AmazonBackup.execute" diff --git a/test/fixtures/vcr_cassettes/functional/upload/twitter.yml b/test/fixtures/vcr_cassettes/functional/upload/twitter.yml index 5b7dfdc92..4e1f41bd9 100644 --- a/test/fixtures/vcr_cassettes/functional/upload/twitter.yml +++ b/test/fixtures/vcr_cassettes/functional/upload/twitter.yml @@ -149,7 +149,7 @@ http_interactions: recorded_at: Fri, 12 Jun 2015 04:57:35 GMT - request: method: post - uri: https://ocqPCKeWr01mvWzCIcveJYRTY:8GECMr2Ves7oK3bmAneHYMLSfDPoJvTizh5gSd4pLBNbJfYNz5@api.twitter.com/oauth2/token + uri: https://SENSITIVE:SENSITIVE@api.twitter.com/oauth2/token body: encoding: UTF-8 string: grant_type=client_credentials diff --git a/test/fixtures/vcr_cassettes/upload-new-twitter.yml b/test/fixtures/vcr_cassettes/upload-new-twitter.yml index 26f211d1b..612bd5e80 100644 --- a/test/fixtures/vcr_cassettes/upload-new-twitter.yml +++ b/test/fixtures/vcr_cassettes/upload-new-twitter.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: post - uri: https://ocqPCKeWr01mvWzCIcveJYRTY:8GECMr2Ves7oK3bmAneHYMLSfDPoJvTizh5gSd4pLBNbJfYNz5@api.twitter.com/oauth2/token + uri: https://SENSITIVE:SENSITIVE@api.twitter.com/oauth2/token body: encoding: UTF-8 string: grant_type=client_credentials