diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index 3ab5f69194..8bab7d4a48 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -395,4 +395,9 @@ def smtp_test
s.close
end
+
+ def test_digest_email_spam
+ DigestSpamJob.perform_async(0)
+ redirect_to "/spam"
+ end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 9c844b2e14..5b5606de10 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -401,7 +401,9 @@ def save_settings
digest_settings = [
'digest:weekly',
- 'digest:daily'
+ 'digest:daily',
+ 'digest:weekly:spam',
+ 'digest:daily:spam'
]
digest_settings.each do |setting|
if params[setting] == "on"
diff --git a/app/jobs/digest_spam_job.rb b/app/jobs/digest_spam_job.rb
new file mode 100644
index 0000000000..d32f20f13b
--- /dev/null
+++ b/app/jobs/digest_spam_job.rb
@@ -0,0 +1,15 @@
+class DigestSpamJob
+ include Sidekiq::Worker
+ def perform(frequency_digest)
+ if frequency_digest.zero?
+ tag_digest = 'digest:daily:spam'
+ elsif frequency_digest == 1
+ tag_digest = 'digest:weekly:spam'
+ end
+ users = User.where(role: %w(moderator admin))
+ .includes(:user_tags)
+ .where('user_tags.value=?', tag_digest)
+ .references(:user_tags)
+ users.each(&:send_digest_email_spam)
+ end
+end
diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb
index 952e2b0198..05be8b7e45 100644
--- a/app/mailers/admin_mailer.rb
+++ b/app/mailers/admin_mailer.rb
@@ -120,4 +120,15 @@ def notify_moderators_of_spam(node, moderator)
subject: subject
)
end
+
+ def send_digest_spam(nodes, frequency_digest)
+ if frequency_digest == User::Frequency::DAILY
+ @subject = 'Your daily digest for moderation'
+ elsif frequency_digest == User::Frequency::WEEKLY
+ @subject = 'Your weekly digest for moderation'
+ end
+ moderators = User.where(role: %w(moderator admin)).collect(&:email)
+ @nodes = nodes
+ mail(to: moderators, subject: @subject)
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index ef44ea5461..0e67b21b04 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -268,6 +268,23 @@ def content_followed_in_period(start_time, end_time, node_type = 'note', include
.distinct
end
+ def unmoderated_in_period(start_time, end_time)
+ tag_following = TagSelection.where(following: true, user_id: uid)
+ ids = []
+ tag_following.each do |tagname|
+ ids += NodeTag.where(tid: tagname.tid).collect(&:nid)
+ end
+ range = "(created >= #{start_time.to_i} AND created <= #{end_time.to_i})"
+ Node.where(nid: ids)
+ .includes(:revision, :tag)
+ .references(:node_revision)
+ .where('node.status = 4')
+ .where(type: 'note')
+ .where(range)
+ .order('node_revisions.timestamp DESC')
+ .distinct
+ end
+
def social_link(site)
return nil unless has_power_tag(site)
@@ -356,6 +373,19 @@ def send_digest_email
end
end
+ def send_digest_email_spam
+ if has_tag('digest:weekly:spam')
+ @frequency_digest = Frequency::WEEKLY
+ @nodes_unmoderated = unmoderated_in_period(1.week.ago, Time.current)
+ elsif has_tag('digest:daily:spam')
+ @frequency_digest = Frequency::DAILY
+ @nodes_unmoderated = unmoderated_in_period(1.day.ago, Time.current)
+ end
+ if @nodes_unmoderated.size.positive?
+ AdminMailer.send_digest_spam(@nodes_unmoderated, @frequency_digest).deliver_now
+ end
+ end
+
def tag_counts
tags = {}
Node.order('nid DESC').where(type: 'note', status: 1, uid: id).limit(20).each do |node|
diff --git a/app/views/admin_mailer/send_digest_spam.html.erb b/app/views/admin_mailer/send_digest_spam.html.erb
new file mode 100644
index 0000000000..bf689af0a5
--- /dev/null
+++ b/app/views/admin_mailer/send_digest_spam.html.erb
@@ -0,0 +1,39 @@
+ [Public Lab] <%= @subject %> <%= Time.now.strftime("%B %-d %Y") %> Unmoderated Notes at PublicLab.org
+
+
+ <% if n.author.photo? %>
+ |
+
+ <%= n.author.username.capitalize %> + Created at <%= n.created_at.strftime("%B %-d %Y") %> + |
<%= n.body.truncate(300) %>
+