From 78b96134989c0fafad28331c79aac4e26becb5a3 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 12 Aug 2020 20:50:11 -0500 Subject: [PATCH] Fix #4554: Searches with "-status:active" not showing deleted posts. Also fixes #4542: Quoted search metatag status:"deleted" yields no results. --- app/logical/post_sets/post.rb | 22 +++++++++++++--------- app/presenters/post_presenter.rb | 8 ++++---- test/functional/posts_controller_test.rb | 12 ++++++++++++ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 7d5d2a47f..ff48e9c4c 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -59,6 +59,12 @@ module PostSets posts.any? {|x| x.rating == "e"} end + def shown_posts + shown_posts = posts.select(&:visible?) + shown_posts = shown_posts.reject(&:is_deleted?) unless show_deleted? + shown_posts + end + def hidden_posts posts.reject(&:visible?) end @@ -136,24 +142,22 @@ module PostSets def post_previews_html(template) html = "" - if none_shown + if shown_posts.empty? return template.render("post_sets/blank") end - posts.each do |post| - html << PostPresenter.preview(post, show_cropped: true, tags: tag_string) + shown_posts.each do |post| + html << PostPresenter.preview(post, show_deleted: show_deleted?, show_cropped: true, tags: tag_string) html << "\n" end html.html_safe end - def not_shown(post) - post.is_deleted? && tag_string !~ /status:(?:all|any|deleted|banned|modqueue)/ - end - - def none_shown - posts.reject {|post| not_shown(post) }.empty? + def show_deleted? + query.select_metatags("status").any? do |metatag| + metatag.value.in?(%w[all any active unmoderated modqueue deleted appealed]) + end end concerning :TagListMethods do diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb index 2f956e469..60d6ba4b1 100644 --- a/app/presenters/post_presenter.rb +++ b/app/presenters/post_presenter.rb @@ -2,12 +2,12 @@ class PostPresenter attr_reader :pool, :next_post_in_pool delegate :tag_list_html, :split_tag_list_html, :split_tag_list_text, :inline_tag_list_html, to: :tag_set_presenter - def self.preview(post, options = {}) + def self.preview(post, show_deleted: false, tags: "", **options) if post.nil? return "none".html_safe end - if !options[:show_deleted] && post.is_deleted? && options[:tags] !~ /status:(?:all|any|deleted|banned|modqueue)/ + if post.is_deleted? && !show_deleted return "" end @@ -31,8 +31,8 @@ class PostPresenter locals[:link_target] = options[:link_target] || post locals[:link_params] = {} - if options[:tags].present? && !CurrentUser.is_anonymous? - locals[:link_params]["q"] = options[:tags] + if tags.present? && !CurrentUser.is_anonymous? + locals[:link_params]["q"] = tags end if options[:pool_id] locals[:link_params]["pool_id"] = options[:pool_id] diff --git a/test/functional/posts_controller_test.rb b/test/functional/posts_controller_test.rb index e70c2d358..af6eb6360 100644 --- a/test/functional/posts_controller_test.rb +++ b/test/functional/posts_controller_test.rb @@ -361,6 +361,18 @@ class PostsControllerTest < ActionDispatch::IntegrationTest assert_response :success assert_select "#post_#{@post.id}", 1 end + + should 'show deleted posts when searching for status:"deleted"' do + get posts_path(tags: 'status:"deleted"') + assert_response :success + assert_select "#post_#{@post.id}", 1 + end + + should "show deleted posts when searching for -status:active" do + get posts_path(tags: "-status:active") + assert_response :success + assert_select "#post_#{@post.id}", 1 + end end context "with restricted posts" do