diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index 6fbdbc45bb2..5b34b1c08b9 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -51,7 +51,7 @@ class TopicsController < ApplicationController def wordpress params.require(:best) params.require(:topic_id) - params.permit(:min_trust_level, :min_score, :min_replies) + params.permit(:min_trust_level, :min_score, :min_replies, :bypass_trust_level_score) @topic_view = TopicView.new( params[:topic_id], @@ -59,7 +59,8 @@ class TopicsController < ApplicationController best: params[:best].to_i, min_trust_level: params[:min_trust_level].nil? ? 1 : params[:min_trust_level].to_i, min_score: params[:min_score].to_i, - min_replies: params[:min_replies].to_i + min_replies: params[:min_replies].to_i, + bypass_trust_level_score: params[:bypass_trust_level_score].to_i # safe cause 0 means ignore ) anonymous_etag(@topic_view.topic) do diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 48ab15d8a05..5792699540f 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -161,7 +161,17 @@ class TopicView min_trust_level = opts[:min_trust_level] if min_trust_level && min_trust_level > 0 - @posts = @posts.where('COALESCE(users.trust_level,0) >= ?', min_trust_level) + + bypass_trust_level_score = opts[:bypass_trust_level_score] + + if bypass_trust_level_score && bypass_trust_level_score > 0 + @posts = @posts.where('COALESCE(users.trust_level,0) >= ? OR posts.score >= ?', + min_trust_level, + bypass_trust_level_score + ) + else + @posts = @posts.where('COALESCE(users.trust_level,0) >= ?', min_trust_level) + end end min_score = opts[:min_score] @@ -169,6 +179,7 @@ class TopicView @posts = @posts.where('posts.score >= ?', min_score) end + @posts = @posts.to_a @posts.sort!{|a,b| a.post_number <=> b.post_number} @posts diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb index 13526c3cc20..59c81715544 100644 --- a/spec/components/topic_view_spec.rb +++ b/spec/components/topic_view_spec.rb @@ -24,6 +24,7 @@ describe TopicView do let!(:p3) { Fabricate(:post, topic: topic, user: first_poster, percent_rank: 0 )} it "it can find the best responses" do + best2 = TopicView.new(topic.id, coding_horror, best: 2) best2.posts.count.should == 2 best2.posts[0].id.should == p2.id @@ -50,6 +51,16 @@ describe TopicView do # should filter out everything if min replies not met best = TopicView.new(topic.id, nil, best: 99, min_replies: 99) best.posts.count.should == 0 + + # should punch through posts if the score is high enough + p2.update_column(:score, 100) + + best = TopicView.new(topic.id, nil, best: 99, bypass_trust_level_score: 100, min_trust_level: coding_horror.trust_level + 1) + best.posts.count.should == 1 + + # 0 means ignore + best = TopicView.new(topic.id, nil, best: 99, bypass_trust_level_score: 0, min_trust_level: coding_horror.trust_level + 1) + best.posts.count.should == 0 end