FEATURE: New 'Reviewable' model to make reviewable items generic

Includes support for flags, reviewable users and queued posts, with REST API
backwards compatibility.

Co-Authored-By: romanrizzi <romanalejandro@gmail.com>
Co-Authored-By: jjaffeux <j.jaffeux@gmail.com>
This commit is contained in:
Robin Ward
2019-01-03 12:03:01 -05:00
parent 9a56b398a1
commit b58867b6e9
354 changed files with 8090 additions and 5225 deletions

View File

@@ -22,47 +22,37 @@ class SpamRule::AutoSilence
return false if @user.staged?
return false if @user.has_trust_level?(TrustLevel[1])
if SiteSetting.num_spam_flags_to_silence_new_user > 0 &&
if SiteSetting.spam_score_to_silence_new_user > 0 &&
SiteSetting.num_users_to_silence_new_user > 0 &&
num_spam_flags_against_user >= SiteSetting.num_spam_flags_to_silence_new_user &&
num_users_who_flagged_spam_against_user >= SiteSetting.num_users_to_silence_new_user
return true
end
if SiteSetting.num_tl3_flags_to_silence_new_user > 0 &&
SiteSetting.num_tl3_users_to_silence_new_user > 0 &&
num_tl3_flags_against_user >= SiteSetting.num_tl3_flags_to_silence_new_user &&
num_tl3_users_who_flagged >= SiteSetting.num_tl3_users_to_silence_new_user
user_spam_stats.total_spam_score >= SiteSetting.spam_score_to_silence_new_user &&
user_spam_stats.spam_user_count >= SiteSetting.num_users_to_silence_new_user
return true
end
false
end
def num_spam_flags_against_user
Post.where(user_id: @user.id).sum(:spam_count)
end
def user_spam_stats
return @user_spam_stats if @user_spam_stats
def num_users_who_flagged_spam_against_user
post_ids = Post.where('user_id = ? and spam_count > 0', @user.id).pluck(:id)
return 0 if post_ids.empty?
PostAction.spam_flags.where(post_id: post_ids).pluck(:user_id).uniq.size
end
params = {
user_id: @user.id,
spam_type: PostActionType.types[:spam],
pending: ReviewableScore.statuses[:pending],
agreed: ReviewableScore.statuses[:agreed]
}
def num_tl3_flags_against_user
if flagged_post_ids.empty?
0
else
PostAction.where(post_id: flagged_post_ids).joins(:user).where('users.trust_level >= ?', 3).count
end
end
result = DB.query(<<~SQL, params)
SELECT COALESCE(SUM(rs.score), 0) AS total_spam_score,
COUNT(DISTINCT rs.user_id) AS spam_user_count
FROM reviewables AS r
INNER JOIN reviewable_scores AS rs ON rs.reviewable_id = r.id
WHERE r.target_created_by_id = :user_id
AND rs.reviewable_score_type = :spam_type
AND rs.status IN (:pending, :agreed)
SQL
def num_tl3_users_who_flagged
if flagged_post_ids.empty?
0
else
PostAction.where(post_id: flagged_post_ids).joins(:user).where('users.trust_level >= ?', 3).pluck(:user_id).uniq.size
end
@user_spam_stats = result[0]
end
def flagged_post_ids