From acc4a216876f0b9f94cbfbba5d268fd0436f1cab Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 5 Jun 2022 15:23:24 -0500 Subject: [PATCH] posts: allow admins to approve the same post twice. This is so admins can overrule flags and always have the final say in whether a post is approved, even in the event of coordinated or sockpuppet flagging. Fixes #4980: Way to mark flags as invalid for admins --- app/models/post_approval.rb | 2 +- app/policies/post_approval_policy.rb | 4 ++++ test/unit/post_approval_test.rb | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb index 74a847779..f2dd2acf5 100644 --- a/app/models/post_approval.rb +++ b/app/models/post_approval.rb @@ -18,7 +18,7 @@ class PostApproval < ApplicationRecord errors.add(:base, "You cannot approve a post you uploaded") end - if post.approver == user || post.approvals.exists?(user: user) + if (post.approver == user || post.approvals.exists?(user: user)) && !policy(user).can_bypass_approval_limits? errors.add(:base, "You have previously approved this post and cannot approve it again") end end diff --git a/app/policies/post_approval_policy.rb b/app/policies/post_approval_policy.rb index bb39f3b4e..72f736c68 100644 --- a/app/policies/post_approval_policy.rb +++ b/app/policies/post_approval_policy.rb @@ -4,4 +4,8 @@ class PostApprovalPolicy < ApplicationPolicy def create? user.is_approver? end + + def can_bypass_approval_limits? + user.is_admin? + end end diff --git a/test/unit/post_approval_test.rb b/test/unit/post_approval_test.rb index 9dd91f871..d974501dd 100644 --- a/test/unit/post_approval_test.rb +++ b/test/unit/post_approval_test.rb @@ -26,6 +26,28 @@ class PostApprovalTest < ActiveSupport::TestCase assert_equal(false, @approval2.valid?) assert_equal(["You have previously approved this post and cannot approve it again"], @approval2.errors[:base]) end + + should "allow an admin to approve the same post twice" do + @approver = create(:admin_user) + + create(:post_approval, post: @post, user: @approver) + assert_equal(1, @post.approvals.count) + assert_equal(@approver, @post.approver) + assert_equal(false, @post.reload.is_pending?) + assert_equal(true, @post.reload.is_active?) + + flag = create(:post_flag, post: @post, creator: create(:user)) + assert_equal(true, @post.reload.is_flagged?) + assert_equal(false, @post.reload.is_active?) + assert_equal("pending", flag.reload.status) + + create(:post_approval, post: @post, user: @approver) + assert_equal(2, @post.approvals.count) + assert_equal(@approver, @post.approver) + assert_equal(false, @post.reload.is_flagged?) + assert_equal(true, @post.reload.is_active?) + assert_equal("rejected", flag.reload.status) + end end end