Fix #4554: Searches with "-status:active" not showing deleted posts.

Also fixes #4542: Quoted search metatag status:"deleted" yields no results.
This commit is contained in:
evazion
2020-08-12 20:50:11 -05:00
parent d884cb6642
commit 78b9613498
3 changed files with 29 additions and 13 deletions

View File

@@ -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

View File

@@ -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 "<em>none</em>".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]

View File

@@ -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