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

+
+
+ + +
+

Click here to choose your followed topics

+

Click here to change your subscription settings

+
diff --git a/app/views/users/profile.html.erb b/app/views/users/profile.html.erb index 7213f25947..f61a2410bf 100644 --- a/app/views/users/profile.html.erb +++ b/app/views/users/profile.html.erb @@ -209,6 +209,9 @@ <%= form_tag "/users/test_digest_email", method: :post do %> <%= submit_tag "Test Digest Email", class: "btn btn-info", style: "width: 100%;" %> <% end %> + <%= form_tag "/admin/test_digest_email_spam", method: :post do %> + <%= submit_tag "Test Spam Digest Email", class: "btn btn-sm btn-primary mt-2", style: "width: 100%;" %> + <% end %> <% end %> <% end %> diff --git a/app/views/users/settings.html.erb b/app/views/users/settings.html.erb index 7cc2c467e1..a6b1d3b496 100644 --- a/app/views/users/settings.html.erb +++ b/app/views/users/settings.html.erb @@ -4,7 +4,7 @@
- Do you want to be notified by email for comments on your posts? + Do you want to be notified by a email for comments on your posts?