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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -4,4 +4,8 @@ class PostApprovalPolicy < ApplicationPolicy
|
||||
def create?
|
||||
user.is_approver?
|
||||
end
|
||||
|
||||
def can_bypass_approval_limits?
|
||||
user.is_admin?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user