FIX: New implementation of the "notify about flag after" setting. Only notify about new flags since the last notification. Send a private message to staff. Mention the 3 most active moderators in the message so they get notification emails.
This commit is contained in:
parent
0930db221f
commit
3835e16cf7
|
@ -4,12 +4,15 @@ module Jobs
|
|||
|
||||
class PendingFlagsReminder < Jobs::Scheduled
|
||||
|
||||
every 1.day
|
||||
every 1.hour
|
||||
|
||||
def execute(args)
|
||||
if SiteSetting.notify_about_flags_after > 0 &&
|
||||
PostAction.flagged_posts_count > 0 &&
|
||||
FlagQuery.flagged_post_actions('active').where('post_actions.created_at < ?', SiteSetting.notify_about_flags_after.to_i.hours.ago).pluck(:id).count > 0
|
||||
PostAction.flagged_posts_count > 0 &&
|
||||
flag_ids.size > 0 && last_notified_id.to_i < flag_ids.max
|
||||
|
||||
mentions = active_moderator_usernames.size > 0 ?
|
||||
"@#{active_moderator_usernames.join(', @')} " : ""
|
||||
|
||||
PostCreator.create(
|
||||
Discourse.system_user,
|
||||
|
@ -17,9 +20,40 @@ module Jobs
|
|||
archetype: Archetype.private_message,
|
||||
subtype: TopicSubtype.system_message,
|
||||
title: I18n.t('flags_reminder.subject_template', { count: PostAction.flagged_posts_count }),
|
||||
raw: I18n.t('flags_reminder.flags_were_submitted', { count: SiteSetting.notify_about_flags_after })
|
||||
raw: mentions + I18n.t('flags_reminder.flags_were_submitted', { count: SiteSetting.notify_about_flags_after })
|
||||
)
|
||||
|
||||
self.last_notified_id = flag_ids.max
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def flag_ids
|
||||
@_flag_ids ||= FlagQuery.flagged_post_actions('active')
|
||||
.where('post_actions.created_at < ?', SiteSetting.notify_about_flags_after.to_i.hours.ago)
|
||||
.pluck(:id)
|
||||
end
|
||||
|
||||
def last_notified_id
|
||||
(i = $redis.get(self.class.last_notified_key)) && i.to_i
|
||||
end
|
||||
|
||||
def last_notified_id=(arg)
|
||||
$redis.set(self.class.last_notified_key, arg)
|
||||
end
|
||||
|
||||
def self.last_notified_key
|
||||
"last_notified_pending_flag_id"
|
||||
end
|
||||
|
||||
def active_moderator_usernames
|
||||
@_active_moderator_usernames ||=
|
||||
User.where(moderator: true)
|
||||
.human_users
|
||||
.order('last_seen_at DESC')
|
||||
.limit(3)
|
||||
.pluck(:username)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -1446,7 +1446,7 @@ en:
|
|||
embed_username_required: "The username for topic creation is required."
|
||||
embed_whitelist_selector: "CSS selector for elements that are allowed in embeds."
|
||||
embed_blacklist_selector: "CSS selector for elements that are removed from embeds."
|
||||
notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable."
|
||||
notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send a private message to staff. Set to 0 to disable."
|
||||
show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics."
|
||||
|
||||
delete_drafts_older_than_n_days: Delete drafts older than (n) days.
|
||||
|
|
|
@ -4,15 +4,22 @@ describe Jobs::PendingFlagsReminder do
|
|||
context "notify_about_flags_after is 0" do
|
||||
before { SiteSetting.stubs(:notify_about_flags_after).returns(0) }
|
||||
|
||||
it "never emails" do
|
||||
it "never notifies" do
|
||||
PostAction.stubs(:flagged_posts_count).returns(1)
|
||||
Email::Sender.any_instance.expects(:send).never
|
||||
PostCreator.expects(:create).never
|
||||
described_class.new.execute({})
|
||||
end
|
||||
end
|
||||
|
||||
context "notify_about_flags_after is 48" do
|
||||
before { SiteSetting.stubs(:notify_about_flags_after).returns(48) }
|
||||
before do
|
||||
SiteSetting.notify_about_flags_after = 48
|
||||
$redis.del described_class.last_notified_key
|
||||
end
|
||||
|
||||
after do
|
||||
$redis.del described_class.last_notified_key
|
||||
end
|
||||
|
||||
it "doesn't send message when flags are less than 48 hours old" do
|
||||
Fabricate(:flag, created_at: 47.hours.ago)
|
||||
|
@ -27,5 +34,16 @@ describe Jobs::PendingFlagsReminder do
|
|||
PostCreator.expects(:create).once.returns(true)
|
||||
described_class.new.execute({})
|
||||
end
|
||||
|
||||
it "doesn't send a message if there are no new flags older than 48 hours old" do
|
||||
old_flag = Fabricate(:flag, created_at: 50.hours.ago)
|
||||
new_flag = Fabricate(:flag, created_at: 47.hours.ago)
|
||||
PostAction.stubs(:flagged_posts_count).returns(2)
|
||||
job = described_class.new
|
||||
job.last_notified_id = old_flag.id
|
||||
PostCreator.expects(:create).never
|
||||
job.execute({})
|
||||
expect(job.last_notified_id).to eq(old_flag.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,7 +12,9 @@ describe Jobs::PendingQueuedPostReminder do
|
|||
end
|
||||
|
||||
context "notify_about_queued_posts_after is 24" do
|
||||
before { SiteSetting.stubs(:notify_about_queued_posts_after).returns(24) }
|
||||
before do
|
||||
SiteSetting.notify_about_queued_posts_after = 24
|
||||
end
|
||||
|
||||
it "doesn't email if there are no queued posts" do
|
||||
described_class.any_instance.stubs(:should_notify_ids).returns([])
|
||||
|
|
Loading…
Reference in New Issue