diff --git a/app/models/user.rb b/app/models/user.rb index fdca6f1677e..cca5693bbfd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -655,7 +655,9 @@ class User < ActiveRecord::Base # Flag all posts from a user as spam def flag_linked_posts_as_spam admin = Discourse.system_user - topic_links.includes(:post).each do |tl| + + disagreed_flag_post_ids = PostAction.where(post_action_type_id: PostActionType.types[:spam]).where.not(disagreed_at: nil).pluck(:post_id) + topic_links.includes(:post).where.not(post_id: disagreed_flag_post_ids).each do |tl| begin PostAction.act(admin, tl.post, PostActionType.types[:spam], message: I18n.t('flag_reason.spam_hosts')) rescue PostAction::AlreadyActed diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 4c9c7324d3f..2f3fbfd2730 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -705,7 +705,19 @@ describe User do # It doesn't raise an exception if called again user.flag_linked_posts_as_spam + end + it "does not flags post as spam if the previous flag for that post was disagreed" do + user.flag_linked_posts_as_spam + + post.reload + expect(post.spam_count).to eq(1) + + PostAction.clear_flags!(post, admin) + user.flag_linked_posts_as_spam + + post.reload + expect(post.spam_count).to eq(0) end end