diff --git a/app/models/category_featured_topic.rb b/app/models/category_featured_topic.rb index 66c05573fa0..c408bb46505 100644 --- a/app/models/category_featured_topic.rb +++ b/app/models/category_featured_topic.rb @@ -19,14 +19,21 @@ class CategoryFeaturedTopic < ActiveRecord::Base def self.feature_topics_for(c, existing=nil) return if c.blank? - query = TopicQuery.new(CategoryFeaturedTopic.fake_admin, + query_opts = { per_page: SiteSetting.category_featured_topics, except_topic_ids: [c.topic_id], visible: true, - no_definitions: true) + no_definitions: true + } + # Add topics, even if they're in secured categories: + query = TopicQuery.new(CategoryFeaturedTopic.fake_admin, query_opts) results = query.list_category_topic_ids(c).uniq + # Add some topics that are visible to everyone: + anon_query = TopicQuery.new(nil, query_opts.merge({except_topic_ids: [c.topic_id] + results})) + results += anon_query.list_category_topic_ids(c).uniq + return if results == existing CategoryFeaturedTopic.transaction do diff --git a/lib/topic_query.rb b/lib/topic_query.rb index 25e2b6fd488..73d47fd4ada 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -44,7 +44,7 @@ class TopicQuery def initialize(user=nil, options={}) options.assert_valid_keys(VALID_OPTIONS) - @options = options + @options = options.dup @user = user end diff --git a/spec/models/category_featured_topic_spec.rb b/spec/models/category_featured_topic_spec.rb index 38c3383a458..8aa83e21b96 100644 --- a/spec/models/category_featured_topic_spec.rb +++ b/spec/models/category_featured_topic_spec.rb @@ -34,9 +34,10 @@ describe CategoryFeaturedTopic do it 'should feature stuff in the correct order' do - SiteSetting.stubs(:category_featured_topics).returns(3) + SiteSetting.stubs(:category_featured_topics).returns(2) category = Fabricate(:category) + t5 = Fabricate(:topic, category_id: category.id, bumped_at: 12.minutes.ago) t4 = Fabricate(:topic, category_id: category.id, bumped_at: 10.minutes.ago) t3 = Fabricate(:topic, category_id: category.id, bumped_at: 7.minutes.ago) t2 = Fabricate(:topic, category_id: category.id, bumped_at: 4.minutes.ago) @@ -45,9 +46,10 @@ describe CategoryFeaturedTopic do CategoryFeaturedTopic.feature_topics_for(category) + # Should find more than we need: pinned topics first, then category_featured_topics * 2 expect( CategoryFeaturedTopic.where(category_id: category.id).pluck(:topic_id) - ).to eq([pinned.id, t2.id, t1.id, t3.id]) + ).to eq([pinned.id, t2.id, t1.id, t3.id, t4.id]) end end