From 89c4fe150ab510f2d8ab7298eb216186bc7154c3 Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 23 Aug 2018 14:08:02 -0500 Subject: [PATCH 1/2] search: add disapproval: metatag. --- .../src/javascripts/autocomplete.js.erb | 4 +++ app/logical/anonymous_user.rb | 6 +++- app/logical/post_query_builder.rb | 28 +++++++++++++++++++ app/models/tag.rb | 10 ++++++- test/unit/post_test.rb | 18 ++++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/app/javascript/src/javascripts/autocomplete.js.erb b/app/javascript/src/javascripts/autocomplete.js.erb index 08033ae17..d92caa6b4 100644 --- a/app/javascript/src/javascripts/autocomplete.js.erb +++ b/app/javascript/src/javascripts/autocomplete.js.erb @@ -128,6 +128,7 @@ Autocomplete.initialize_tag_autocomplete = function() { case "child": case "parent": case "filetype": + case "disapproval": Autocomplete.static_metatag_source(term, resp, metatag); return; case "user": @@ -415,6 +416,9 @@ Autocomplete.static_metatags = { filetype: [ "jpg", "png", "gif", "swf", "zip", "webm", "mp4" ], + disapproval: [ + "any", "none", "disinterest", "poor_quality", "breaks_rules" + ] } Autocomplete.static_metatag_source = function(term, resp, metatag) { diff --git a/app/logical/anonymous_user.rb b/app/logical/anonymous_user.rb index 6db9b7149..8d51dc5dd 100644 --- a/app/logical/anonymous_user.rb +++ b/app/logical/anonymous_user.rb @@ -229,8 +229,12 @@ class AnonymousUser false end + def post_disapprovals + PostDisapproval.none + end + def saved_searches - SavedSearch.where(false) + SavedSearch.none end def has_saved_searches? diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 3584229da..c040a9baa 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -222,6 +222,34 @@ class PostQueryBuilder end end + if q[:disapproval] + q[:disapproval].each do |disapproval| + 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 + relation = relation.where("posts.id": disapprovals.where(reason: disapproval)) + end + end + end + + if q[:disapproval_neg] + q[:disapproval_neg].each do |disapproval| + 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 + relation = relation.where.not("posts.id": disapprovals.where(reason: disapproval)) + end + end + end + if q[:flagger_ids_neg] q[:flagger_ids_neg].each do |flagger_id| if CurrentUser.can_view_flagger?(flagger_id) diff --git a/app/models/tag.rb b/app/models/tag.rb index 85ec7894f..97e32b061 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -1,6 +1,6 @@ class Tag < ApplicationRecord COSINE_SIMILARITY_RELATED_TAG_THRESHOLD = 300 - METATAGS = "-user|user|-approver|approver|commenter|comm|noter|noteupdater|artcomm|-pool|pool|ordpool|-favgroup|favgroup|-fav|fav|ordfav|md5|-rating|rating|-locked|locked|width|height|mpixels|ratio|score|favcount|filesize|source|-source|id|-id|date|age|order|limit|-status|status|tagcount|parent|-parent|child|pixiv_id|pixiv|search|upvote|downvote|filetype|-filetype|flagger|-flagger|appealer|-appealer|" + + METATAGS = "-user|user|-approver|approver|commenter|comm|noter|noteupdater|artcomm|-pool|pool|ordpool|-favgroup|favgroup|-fav|fav|ordfav|md5|-rating|rating|-locked|locked|width|height|mpixels|ratio|score|favcount|filesize|source|-source|id|-id|date|age|order|limit|-status|status|tagcount|parent|-parent|child|pixiv_id|pixiv|search|upvote|downvote|filetype|-filetype|flagger|-flagger|appealer|-appealer|disapproval|-disapproval|" + TagCategory.short_name_list.map {|x| "#{x}tags"}.join("|") SUBQUERY_METATAGS = "commenter|comm|noter|noteupdater|artcomm|flagger|-flagger|appealer|-appealer" has_one :wiki_page, :foreign_key => "title", :primary_key => "name" @@ -577,6 +577,14 @@ class Tag < ApplicationRecord user_id = User.name_to_id(g2) q[:artcomm_ids] << user_id unless user_id.blank? + when "disapproval" + q[:disapproval] ||= [] + q[:disapproval] << g2 + + when "-disapproval" + q[:disapproval_neg] ||= [] + q[:disapproval_neg] << g2 + when "-pool" if g2.downcase == "none" q[:pool] = "any" diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index b01ed3a2c..732679b4f 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -2308,6 +2308,24 @@ class PostTest < ActiveSupport::TestCase end end + should "return posts for a disapproval: metatag" do + CurrentUser.scoped(FactoryBot.create(:mod_user)) do + pending = FactoryBot.create(:post, is_pending: true) + disapproved = FactoryBot.create(:post, is_pending: true) + disapproval = FactoryBot.create(:post_disapproval, post: disapproved, reason: "disinterest") + + assert_tag_match([pending], "disapproval:none") + assert_tag_match([disapproved], "disapproval:any") + assert_tag_match([disapproved], "disapproval:disinterest") + assert_tag_match([], "disapproval:breaks_rules") + + assert_tag_match([disapproved], "-disapproval:none") + assert_tag_match([pending], "-disapproval:any") + assert_tag_match([pending], "-disapproval:disinterest") + assert_tag_match([disapproved, pending], "-disapproval:breaks_rules") + end + end + should "return posts ordered by a particular attribute" do posts = (1..2).map do |n| tags = ["tagme", "gentag1 gentag2 artist:arttag char:chartag copy:copytag"] From 4f02c7f70a7239e6652387c9616e1f91c14f5881 Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 23 Aug 2018 14:45:33 -0500 Subject: [PATCH 2/2] search: add status:modqueue, status:unmoderated metatags. * status:modqueue = ~status:pending ~status:flagged * status:unmoderated = status:modqueue -user:self -approver:self -disapproval:any --- app/javascript/src/javascripts/autocomplete.js.erb | 2 +- app/logical/post_query_builder.rb | 6 ++++++ app/models/post.rb | 4 +++- test/unit/post_test.rb | 13 +++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/javascript/src/javascripts/autocomplete.js.erb b/app/javascript/src/javascripts/autocomplete.js.erb index d92caa6b4..cb7ef0c3d 100644 --- a/app/javascript/src/javascripts/autocomplete.js.erb +++ b/app/javascript/src/javascripts/autocomplete.js.erb @@ -399,7 +399,7 @@ Autocomplete.static_metatags = { "custom" ].concat(<%= TagCategory.short_name_list.map {|category| [category + "tags", category + "tags_asc"]}.flatten %>), status: [ - "any", "deleted", "active", "pending", "flagged", "banned" + "any", "deleted", "active", "pending", "flagged", "banned", "modqueue", "unmoderated" ], rating: [ "safe", "questionable", "explicit" diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index c040a9baa..fa3f78bd9 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -131,18 +131,24 @@ class PostQueryBuilder relation = relation.where("posts.is_pending = TRUE") elsif q[:status] == "flagged" relation = relation.where("posts.is_flagged = TRUE") + elsif q[:status] == "modqueue" + relation = relation.where("posts.is_pending = TRUE OR posts.is_flagged = TRUE") elsif q[:status] == "deleted" relation = relation.where("posts.is_deleted = TRUE") elsif q[:status] == "banned" relation = relation.where("posts.is_banned = TRUE") elsif q[:status] == "active" relation = relation.where("posts.is_pending = FALSE AND posts.is_deleted = FALSE AND posts.is_banned = FALSE AND posts.is_flagged = FALSE") + elsif q[:status] == "unmoderated" + relation = relation.merge(Post.pending_or_flagged.available_for_moderation) elsif q[:status] == "all" || q[:status] == "any" # do nothing elsif q[:status_neg] == "pending" relation = relation.where("posts.is_pending = FALSE") elsif q[:status_neg] == "flagged" relation = relation.where("posts.is_flagged = FALSE") + elsif q[:status_neg] == "modqueue" + relation = relation.where("posts.is_pending = FALSE AND posts.is_flagged = FALSE") elsif q[:status_neg] == "deleted" relation = relation.where("posts.is_deleted = FALSE") elsif q[:status_neg] == "banned" diff --git a/app/models/post.rb b/app/models/post.rb index 100562244..766beeef6 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1645,7 +1645,9 @@ class Post < ApplicationRecord where("uploader_id = ?", user_id) end - def available_for_moderation(hidden, user = CurrentUser.user) + def available_for_moderation(hidden = false, user = CurrentUser.user) + return none if user.is_anonymous? + approved_posts = user.post_approvals.select(:post_id) disapproved_posts = user.post_disapprovals.select(:post_id) diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 732679b4f..73a5c5a08 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -2130,6 +2130,7 @@ class PostTest < ActiveSupport::TestCase banned = FactoryBot.create(:post, is_banned: true) all = [banned, deleted, flagged, pending] + assert_tag_match([flagged, pending], "status:modqueue") assert_tag_match([pending], "status:pending") assert_tag_match([flagged], "status:flagged") assert_tag_match([deleted], "status:deleted") @@ -2138,6 +2139,7 @@ class PostTest < ActiveSupport::TestCase assert_tag_match(all, "status:any") assert_tag_match(all, "status:all") + assert_tag_match(all - [flagged, pending], "-status:modqueue") assert_tag_match(all - [pending], "-status:pending") assert_tag_match(all - [flagged], "-status:flagged") assert_tag_match(all - [deleted], "-status:deleted") @@ -2145,6 +2147,17 @@ class PostTest < ActiveSupport::TestCase assert_tag_match(all, "-status:active") end + should "return posts for the status:unmoderated metatag" do + flagged = FactoryBot.create(:post, is_flagged: true) + pending = FactoryBot.create(:post, is_pending: true) + disapproved = FactoryBot.create(:post, is_pending: true) + + FactoryBot.create(:post_flag, post: flagged) + FactoryBot.create(:post_disapproval, post: disapproved, reason: "disinterest") + + assert_tag_match([pending, flagged], "status:unmoderated") + end + should "respect the 'Deleted post filter' option when using the status:banned metatag" do deleted = FactoryBot.create(:post, is_deleted: true, is_banned: true) undeleted = FactoryBot.create(:post, is_banned: true)