mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 12:12:26 +08:00
FEATURE: correct muted category implementation
- Don't change tracking state on muted categories - Exclude muted sub categories from parent
This commit is contained in:
parent
b0f8b104d2
commit
dc0266cc22
|
@ -60,15 +60,6 @@ class CategoryUser < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
def self.auto_mute_new_topic(topic)
|
||||
apply_default_to_topic(
|
||||
topic,
|
||||
TopicUser.notification_levels[:muted],
|
||||
TopicUser.notification_reasons[:auto_mute_category]
|
||||
)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.apply_default_to_topic(topic, level, reason)
|
||||
|
|
10
db/migrate/20140618001820_dont_auto_muto_topics.rb
Normal file
10
db/migrate/20140618001820_dont_auto_muto_topics.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
class DontAutoMutoTopics < ActiveRecord::Migration
|
||||
def change
|
||||
# muting all new topics was a mistake, revert it
|
||||
execute 'DELETE FROM topic_users WHERE notification_level = 0 and notifications_reason_id =7 AND first_visited_at IS NULL'
|
||||
|
||||
execute 'UPDATE topic_users SET notification_level = 1,
|
||||
notifications_reason_id = NULL
|
||||
WHERE notification_level = 0 AND notifications_reason_id =7'
|
||||
end
|
||||
end
|
|
@ -19,17 +19,12 @@ class TopicCreator
|
|||
process_private_message
|
||||
save_topic
|
||||
watch_topic
|
||||
auto_mute_topic
|
||||
|
||||
@topic
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def auto_mute_topic
|
||||
CategoryUser.auto_mute_new_topic(@topic)
|
||||
end
|
||||
|
||||
def watch_topic
|
||||
unless @opts[:auto_track] == false
|
||||
@topic.notifier.watch_topic!(@topic.user_id)
|
||||
|
|
|
@ -210,6 +210,13 @@ class TopicQuery
|
|||
result.order("topics.#{sort_column} #{sort_dir}")
|
||||
end
|
||||
|
||||
def get_category_id(category_id_or_slug)
|
||||
return nil unless category_id_or_slug
|
||||
category_id = category_id_or_slug.to_i
|
||||
category_id = Category.where(slug: category_id_or_slug).pluck(:id).first if category_id == 0
|
||||
category_id
|
||||
end
|
||||
|
||||
|
||||
# Create results based on a bunch of default options
|
||||
def default_results(options={})
|
||||
|
@ -224,19 +231,14 @@ class TopicQuery
|
|||
.references('tu')
|
||||
end
|
||||
|
||||
category_id = nil
|
||||
if options[:category].present?
|
||||
category_id = options[:category].to_i
|
||||
category_id = Category.where(slug: options[:category]).pluck(:id).first if category_id == 0
|
||||
|
||||
if category_id
|
||||
if options[:no_subcategories]
|
||||
result = result.where('categories.id = ?', category_id)
|
||||
else
|
||||
result = result.where('categories.id = ? or categories.parent_category_id = ?', category_id, category_id)
|
||||
end
|
||||
result = result.references(:categories)
|
||||
category_id = get_category_id(options[:category])
|
||||
if category_id
|
||||
if options[:no_subcategories]
|
||||
result = result.where('categories.id = ?', category_id)
|
||||
else
|
||||
result = result.where('categories.id = ? or categories.parent_category_id = ?', category_id, category_id)
|
||||
end
|
||||
result = result.references(:categories)
|
||||
end
|
||||
|
||||
result = apply_ordering(result, options)
|
||||
|
@ -287,18 +289,25 @@ class TopicQuery
|
|||
|
||||
def latest_results(options={})
|
||||
result = default_results(options)
|
||||
result = remove_muted_categories(result, @user) unless options[:category].present?
|
||||
result = remove_muted_categories(result, @user, exclude: options[:category])
|
||||
result
|
||||
end
|
||||
|
||||
def remove_muted_categories(list, user)
|
||||
def remove_muted_categories(list, user, opts)
|
||||
category_id = get_category_id(opts[:exclude]) if opts
|
||||
if user
|
||||
list = list.where("NOT EXISTS(
|
||||
SELECT 1 FROM category_users cu
|
||||
WHERE cu.user_id = ? AND
|
||||
cu.category_id = topics.category_id AND
|
||||
cu.notification_level = ?
|
||||
)", user.id, CategoryUser.notification_levels[:muted]).references('cu')
|
||||
cu.notification_level = ? AND
|
||||
cu.category_id <> ?
|
||||
)",
|
||||
user.id,
|
||||
CategoryUser.notification_levels[:muted],
|
||||
category_id || -1
|
||||
)
|
||||
.references('cu')
|
||||
end
|
||||
|
||||
list
|
||||
|
@ -314,7 +323,7 @@ class TopicQuery
|
|||
|
||||
def new_results(options={})
|
||||
result = TopicQuery.new_filter(default_results(options.reverse_merge(:unordered => true)), @user.treat_as_new_topic_start_date)
|
||||
result = remove_muted_categories(result, @user) unless options[:category].present?
|
||||
result = remove_muted_categories(result, @user, exclude: options[:category])
|
||||
suggested_ordering(result, options)
|
||||
end
|
||||
|
||||
|
|
|
@ -50,9 +50,6 @@ describe CategoryUser do
|
|||
tu.notification_level.should == TopicUser.notification_levels[:tracking]
|
||||
tu.notifications_reason_id.should == TopicUser.notification_reasons[:auto_track_category]
|
||||
|
||||
tu = TopicUser.get(muted_post.topic, user)
|
||||
tu.notification_level.should == TopicUser.notification_levels[:muted]
|
||||
tu.notifications_reason_id.should == TopicUser.notification_reasons[:auto_mute_category]
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue
Block a user