search: change behavior of disapproval:<reason> metatag.

* Change the `disapproval:<reason>` metatag to `disapproved:<reason>`.

* Change `disapproved:<reason>` to show all posts disapproved for a
  given reason, not just those disapproved by the current user.

* Allow searching for your own disapprovals with `disapproved:<my_name>`.

* Drop the `disapproved:<any|none>` metatags. `disapproved:any` is
  equivalent to `disapproved:<my_name>` and `disapproved:none` is
  equivalent to `-disapproved:<my_name>`.

These changes are so that you can search e.g. disapproved:poor_quality
to find all posts disapproved for poor quality.
This commit is contained in:
evazion
2020-02-29 17:32:43 -06:00
parent ba66ca62c4
commit b232470248
4 changed files with 31 additions and 37 deletions

View File

@@ -117,7 +117,7 @@ Autocomplete.initialize_tag_autocomplete = function() {
case "child": case "child":
case "parent": case "parent":
case "filetype": case "filetype":
case "disapproval": case "disapproved":
case "embedded": case "embedded":
results = Autocomplete.static_metatag_source(term, metatag); results = Autocomplete.static_metatag_source(term, metatag);
break; break;
@@ -286,8 +286,8 @@ Autocomplete.static_metatags = {
filetype: [ filetype: [
"jpg", "png", "gif", "swf", "zip", "webm", "mp4" "jpg", "png", "gif", "swf", "zip", "webm", "mp4"
], ],
disapproval: [ disapproved: [
"any", "none", "disinterest", "poor_quality", "breaks_rules" "disinterest", "poor_quality", "breaks_rules"
] ]
} }

View File

@@ -266,31 +266,27 @@ class PostQueryBuilder
end end
end end
if q[:disapproval] if q[:disapproved]
q[:disapproval].each do |disapproval| q[:disapproved].each do |disapproved|
disapprovals = CurrentUser.user.post_disapprovals.select(:post_id) if disapproved == CurrentUser.name
disapprovals = CurrentUser.user.post_disapprovals.select(:post_id)
if disapproval.in?(%w[none false])
relation = relation.where.not("posts.id": disapprovals)
elsif disapproval.in?(%w[any all true])
relation = relation.where("posts.id": disapprovals)
else else
relation = relation.where("posts.id": disapprovals.where(reason: disapproval)) disapprovals = PostDisapproval.where(reason: disapproved)
end end
relation = relation.where("posts.id": disapprovals.select(:post_id))
end end
end end
if q[:disapproval_neg] if q[:disapproved_neg]
q[:disapproval_neg].each do |disapproval| q[:disapproved_neg].each do |disapproved|
disapprovals = CurrentUser.user.post_disapprovals.select(:post_id) if disapproved == CurrentUser.name
disapprovals = CurrentUser.user.post_disapprovals.select(:post_id)
if disapproval.in?(%w[none false])
relation = relation.where("posts.id": disapprovals)
elsif disapproval.in?(%w[any all true])
relation = relation.where.not("posts.id": disapprovals)
else else
relation = relation.where.not("posts.id": disapprovals.where(reason: disapproval)) disapprovals = PostDisapproval.where(reason: disapproved)
end end
relation = relation.where.not("posts.id": disapprovals.select(:post_id))
end end
end end

View File

@@ -17,7 +17,7 @@ class Tag < ApplicationRecord
-locked locked width height mpixels ratio score favcount filesize source -locked locked width height mpixels ratio score favcount filesize source
-source id -id date age order limit -status status tagcount parent -parent -source id -id date age order limit -status status tagcount parent -parent
child pixiv_id pixiv search upvote downvote filetype -filetype flagger child pixiv_id pixiv search upvote downvote filetype -filetype flagger
-flagger appealer -appealer disapproval -disapproval embedded -flagger appealer -appealer disapproved -disapproved embedded
] + TagCategory.short_name_list.map {|x| "#{x}tags"} + COUNT_METATAGS + COUNT_METATAG_SYNONYMS ] + TagCategory.short_name_list.map {|x| "#{x}tags"} + COUNT_METATAGS + COUNT_METATAG_SYNONYMS
SUBQUERY_METATAGS = %w[commenter comm noter noteupdater artcomm flagger -flagger appealer -appealer] SUBQUERY_METATAGS = %w[commenter comm noter noteupdater artcomm flagger -flagger appealer -appealer]
@@ -583,13 +583,13 @@ class Tag < ApplicationRecord
user_id = User.name_to_id(g2) user_id = User.name_to_id(g2)
q[:artcomm_ids] << user_id unless user_id.blank? q[:artcomm_ids] << user_id unless user_id.blank?
when "disapproval" when "disapproved"
q[:disapproval] ||= [] q[:disapproved] ||= []
q[:disapproval] << g2 q[:disapproved] << g2
when "-disapproval" when "-disapproved"
q[:disapproval_neg] ||= [] q[:disapproved_neg] ||= []
q[:disapproval_neg] << g2 q[:disapproved_neg] << g2
when "-pool" when "-pool"
q[:pool_neg] ||= [] q[:pool_neg] ||= []

View File

@@ -2374,21 +2374,19 @@ class PostTest < ActiveSupport::TestCase
end end
end end
should "return posts for a disapproval:<type> metatag" do should "return posts for a disapproved:<type> metatag" do
CurrentUser.scoped(FactoryBot.create(:mod_user)) do CurrentUser.scoped(FactoryBot.create(:mod_user)) do
pending = FactoryBot.create(:post, is_pending: true) pending = FactoryBot.create(:post, is_pending: true)
disapproved = FactoryBot.create(:post, is_pending: true) disapproved = FactoryBot.create(:post, is_pending: true)
disapproval = FactoryBot.create(:post_disapproval, user: CurrentUser.user, post: disapproved, reason: "disinterest") disapproval = FactoryBot.create(:post_disapproval, user: CurrentUser.user, post: disapproved, reason: "disinterest")
assert_tag_match([pending], "disapproval:none") assert_tag_match([disapproved], "disapproved:#{CurrentUser.name}")
assert_tag_match([disapproved], "disapproval:any") assert_tag_match([disapproved], "disapproved:disinterest")
assert_tag_match([disapproved], "disapproval:disinterest") assert_tag_match([], "disapproved:breaks_rules")
assert_tag_match([], "disapproval:breaks_rules")
assert_tag_match([disapproved], "-disapproval:none") assert_tag_match([pending], "-disapproved:#{CurrentUser.name}")
assert_tag_match([pending], "-disapproval:any") assert_tag_match([pending], "-disapproved:disinterest")
assert_tag_match([pending], "-disapproval:disinterest") assert_tag_match([disapproved, pending], "-disapproved:breaks_rules")
assert_tag_match([disapproved, pending], "-disapproval:breaks_rules")
end end
end end