mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 22:43:33 +08:00
FIX: remove muted topics/tags/categories from top and hot topics lists (#30892)
So it matches the behavior of latest and new.
This commit is contained in:
@ -359,9 +359,7 @@ class TopicQuery
|
||||
|
||||
def list_hot
|
||||
create_list(:hot, unordered: true, prioritize_pinned: true) do |topics|
|
||||
topics = remove_muted_topics(topics, user)
|
||||
topics = remove_muted_categories(topics, user, exclude: options[:category])
|
||||
TopicQuery.remove_muted_tags(topics, user, options)
|
||||
topics = remove_muted(topics, user, options)
|
||||
topics.joins("JOIN topic_hot_scores on topics.id = topic_hot_scores.topic_id").order(
|
||||
"topic_hot_scores.score DESC",
|
||||
)
|
||||
@ -371,9 +369,9 @@ class TopicQuery
|
||||
def list_top_for(period)
|
||||
score_column = TopTopic.score_column_for_period(period)
|
||||
create_list(:top, unordered: true) do |topics|
|
||||
topics = remove_muted_categories(topics, @user)
|
||||
topics = remove_muted(topics, user, options)
|
||||
topics = topics.joins(:top_topic).where("top_topics.#{score_column} > 0")
|
||||
if period == :yearly && @user.try(:trust_level) == TrustLevel[0]
|
||||
if period == :yearly && user&.new_user?
|
||||
topics.order(<<~SQL)
|
||||
CASE WHEN (
|
||||
COALESCE(topics.pinned_at, '1900-01-01') > COALESCE(tu.cleared_pinned_at, '1900-01-01')
|
||||
@ -1215,8 +1213,7 @@ class TopicQuery
|
||||
result =
|
||||
result.where("topics.id NOT IN (?)", excluded_topic_ids) unless excluded_topic_ids.empty?
|
||||
|
||||
result = remove_muted_categories(result, @user)
|
||||
result = remove_muted_topics(result, @user)
|
||||
result = remove_muted(result, @user, @options)
|
||||
|
||||
# If we are in a category, prefer it for the random results
|
||||
if topic.category_id
|
||||
|
@ -700,18 +700,19 @@ RSpec.describe TopicQuery do
|
||||
end
|
||||
|
||||
describe "muted categories" do
|
||||
it "is removed from top, new and latest lists" do
|
||||
it "is removed from latest, new, top, and hot lists" do
|
||||
category = Fabricate(:category_with_definition)
|
||||
topic = Fabricate(:topic, category: category)
|
||||
CategoryUser.create!(
|
||||
user_id: user.id,
|
||||
category_id: category.id,
|
||||
notification_level: CategoryUser.notification_levels[:muted],
|
||||
)
|
||||
topic = Fabricate(:topic, category:)
|
||||
|
||||
notification_level = CategoryUser.notification_levels[:muted]
|
||||
CategoryUser.create!(user:, category:, notification_level:)
|
||||
TopTopic.create!(topic: topic, all_score: 1)
|
||||
TopicHotScore.create!(topic: topic, score: 1.0)
|
||||
|
||||
expect(topic_query.list_new.topics.map(&:id)).not_to include(topic.id)
|
||||
expect(topic_query.list_latest.topics.map(&:id)).not_to include(topic.id)
|
||||
TopTopic.create!(topic: topic, all_score: 1)
|
||||
expect(topic_query.list_top_for(:all).topics.map(&:id)).not_to include(topic.id)
|
||||
expect(topic_query.list_hot.topics.map(&:id)).not_to include(topic.id)
|
||||
end
|
||||
end
|
||||
|
||||
@ -784,7 +785,7 @@ RSpec.describe TopicQuery do
|
||||
end
|
||||
|
||||
describe "muted tags" do
|
||||
it "is removed from new and latest lists" do
|
||||
it "is removed from latest, new, top, and hot lists" do
|
||||
SiteSetting.tagging_enabled = true
|
||||
SiteSetting.remove_muted_tags_from_latest = "always"
|
||||
|
||||
@ -801,45 +802,32 @@ RSpec.describe TopicQuery do
|
||||
notification_level: CategoryUser.notification_levels[:muted],
|
||||
)
|
||||
|
||||
topic_ids = topic_query.list_latest.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(tagged_topic.id, untagged_topic.id)
|
||||
[muted_topic, tagged_topic, muted_tagged_topic, untagged_topic].each do |topic|
|
||||
TopTopic.create(topic:, all_score: 1)
|
||||
TopicHotScore.create!(topic:, score: 1.0)
|
||||
end
|
||||
|
||||
topic_ids = topic_query.list_new.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(tagged_topic.id, untagged_topic.id)
|
||||
ids = [tagged_topic, untagged_topic].map &:id
|
||||
expect(topic_query.list_latest.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_new.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_top_for(:all).topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_hot.topics.map(&:id)).to contain_exactly(*ids)
|
||||
|
||||
SiteSetting.remove_muted_tags_from_latest = "only_muted"
|
||||
|
||||
topic_ids = topic_query.list_latest.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(
|
||||
tagged_topic.id,
|
||||
muted_tagged_topic.id,
|
||||
untagged_topic.id,
|
||||
)
|
||||
|
||||
topic_ids = topic_query.list_new.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(
|
||||
tagged_topic.id,
|
||||
muted_tagged_topic.id,
|
||||
untagged_topic.id,
|
||||
)
|
||||
ids = [tagged_topic, muted_tagged_topic, untagged_topic].map &:id
|
||||
expect(topic_query.list_latest.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_new.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_top_for(:all).topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_hot.topics.map(&:id)).to contain_exactly(*ids)
|
||||
|
||||
SiteSetting.remove_muted_tags_from_latest = "never"
|
||||
|
||||
topic_ids = topic_query.list_latest.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(
|
||||
muted_topic.id,
|
||||
tagged_topic.id,
|
||||
muted_tagged_topic.id,
|
||||
untagged_topic.id,
|
||||
)
|
||||
|
||||
topic_ids = topic_query.list_new.topics.map(&:id)
|
||||
expect(topic_ids).to contain_exactly(
|
||||
muted_topic.id,
|
||||
tagged_topic.id,
|
||||
muted_tagged_topic.id,
|
||||
untagged_topic.id,
|
||||
)
|
||||
ids = [muted_topic, tagged_topic, muted_tagged_topic, untagged_topic].map &:id
|
||||
expect(topic_query.list_latest.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_new.topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_top_for(:all).topics.map(&:id)).to contain_exactly(*ids)
|
||||
expect(topic_query.list_hot.topics.map(&:id)).to contain_exactly(*ids)
|
||||
end
|
||||
|
||||
it "is not removed from the tag page itself" do
|
||||
|
Reference in New Issue
Block a user