search: allow mods to search disapproved:<user> for other users.

Allow moderators to search `disapproved:<username>` with any user.
Before mods could only search for their own disapprovals, even though
they could see disapprovals by others.
This commit is contained in:
evazion
2021-09-01 01:03:44 -05:00
parent c41e3f4590
commit d00aa847ae
2 changed files with 22 additions and 14 deletions

View File

@@ -321,10 +321,9 @@ class PostQueryBuilder
def disapproved_matches(query) def disapproved_matches(query)
if query.downcase.in?(PostDisapproval::REASONS) if query.downcase.in?(PostDisapproval::REASONS)
Post.where(disapprovals: PostDisapproval.where(reason: query.downcase)) Post.where(disapprovals: PostDisapproval.where(reason: query.downcase))
elsif User.normalize_name(query) == current_user.name
Post.where(disapprovals: PostDisapproval.where(user: current_user))
else else
Post.none user = User.find_by_name(query)
Post.where(disapprovals: PostDisapproval.creator_matches(user, current_user))
end end
end end
@@ -949,7 +948,7 @@ class PostQueryBuilder
metatags.any? do |metatag| metatags.any? do |metatag|
metatag.name.in?(%w[upvoter upvote downvoter downvote search flagger fav ordfav favgroup ordfavgroup]) || metatag.name.in?(%w[upvoter upvote downvoter downvote search flagger fav ordfav favgroup ordfavgroup]) ||
metatag.name == "status" && metatag.value == "unmoderated" || metatag.name == "status" && metatag.value == "unmoderated" ||
metatag.name == "disapproved" && User.normalize_name(metatag.value) == current_user.name metatag.name == "disapproved" && !metatag.value.downcase.in?(PostDisapproval::REASONS)
end end
end end
end end

View File

@@ -874,22 +874,31 @@ class PostQueryBuilderTest < ActiveSupport::TestCase
end end
should "return posts for a disapproved:<type> metatag" do should "return posts for a disapproved:<type> metatag" do
CurrentUser.scoped(create(:mod_user)) do disapprover = create(:user)
pending = create(:post, is_pending: true) pending = create(:post, is_pending: true)
disapproved = create(:post, is_pending: true) disapproved = create(:post, is_pending: true)
disapproval = create(:post_disapproval, user: CurrentUser.user, post: disapproved, reason: "disinterest") disapproval = create(:post_disapproval, user: disapprover, post: disapproved, reason: "disinterest")
assert_tag_match([disapproved], "disapproved:#{CurrentUser.user.name}") as(disapprover) do
assert_tag_match([disapproved], "disapproved:#{CurrentUser.user.name.upcase}") assert_tag_match([disapproved], "disapproved:#{disapprover.name}")
assert_tag_match([disapproved], "disapproved:#{disapprover.name.upcase}")
assert_tag_match([disapproved], "disapproved:disinterest") assert_tag_match([disapproved], "disapproved:disinterest")
assert_tag_match([disapproved], "disapproved:DISINTEREST") assert_tag_match([disapproved], "disapproved:DISINTEREST")
assert_tag_match([], "disapproved:breaks_rules") assert_tag_match([], "disapproved:breaks_rules")
assert_tag_match([], "disapproved:breaks_rules disapproved:disinterest") assert_tag_match([], "disapproved:breaks_rules disapproved:disinterest")
assert_tag_match([pending], "-disapproved:#{CurrentUser.user.name}") assert_tag_match([pending], "-disapproved:#{disapprover.name}")
assert_tag_match([pending], "-disapproved:disinterest") assert_tag_match([pending], "-disapproved:disinterest")
assert_tag_match([disapproved, pending], "-disapproved:breaks_rules") assert_tag_match([disapproved, pending], "-disapproved:breaks_rules")
end end
as(create(:user)) do
assert_tag_match([], "disapproved:#{disapprover.name}")
end
as(create(:mod_user)) do
assert_tag_match([disapproved], "disapproved:#{disapprover.name}")
end
end end
should "return posts ordered by a particular attribute" do should "return posts ordered by a particular attribute" do