mirror of
https://github.com/discourse/discourse.git
synced 2025-05-23 19:41:18 +08:00
FIX: properly set notification levels on group invite
Previously we relied on side effects to set tracking state correctly when inviting groups to messages Also has a minor optimisation in that we use pluck instead of pulling in full record
This commit is contained in:
@ -359,6 +359,25 @@ class Group < ActiveRecord::Base
|
|||||||
(10..19).to_a
|
(10..19).to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_message_default_notification_levels!(topic, ignore_existing: false)
|
||||||
|
group_users.pluck(:user_id, :notification_level).each do |user_id, notification_level|
|
||||||
|
next if user_id == -1
|
||||||
|
next if user_id == topic.user_id
|
||||||
|
next if ignore_existing && TopicUser.where(user_id: user_id, topic_id: topic.id).exists?
|
||||||
|
|
||||||
|
action =
|
||||||
|
case notification_level
|
||||||
|
when TopicUser.notification_levels[:tracking] then "track!"
|
||||||
|
when TopicUser.notification_levels[:regular] then "regular!"
|
||||||
|
when TopicUser.notification_levels[:muted] then "mute!"
|
||||||
|
when TopicUser.notification_levels[:watching] then "watch!"
|
||||||
|
else "track!"
|
||||||
|
end
|
||||||
|
|
||||||
|
topic.notifier.public_send(action, user_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.refresh_automatic_group!(name)
|
def self.refresh_automatic_group!(name)
|
||||||
return unless id = AUTO_GROUPS[name]
|
return unless id = AUTO_GROUPS[name]
|
||||||
|
|
||||||
|
@ -821,6 +821,8 @@ class Topic < ActiveRecord::Base
|
|||||||
|
|
||||||
group_id = group.id
|
group_id = group.id
|
||||||
|
|
||||||
|
group.set_message_default_notification_levels!(self, ignore_existing: true)
|
||||||
|
|
||||||
group.users.where(
|
group.users.where(
|
||||||
"group_users.notification_level = :level",
|
"group_users.notification_level = :level",
|
||||||
level: NotificationLevels.all[:tracking],
|
level: NotificationLevels.all[:tracking],
|
||||||
@ -845,6 +847,7 @@ class Topic < ActiveRecord::Base
|
|||||||
group_id: group_id
|
group_id: group_id
|
||||||
}.to_json
|
}.to_json
|
||||||
)
|
)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -84,21 +84,8 @@ class TopicCreator
|
|||||||
topic.notifier.watch!(tau.user_id)
|
topic.notifier.watch!(tau.user_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
topic.reload.topic_allowed_groups.each do |tag|
|
topic.reload.topic_allowed_groups.each do |topic_allowed_group|
|
||||||
tag.group.group_users.each do |gu|
|
topic_allowed_group.group.set_message_default_notification_levels!(topic)
|
||||||
next if gu.user_id == -1 || gu.user_id == topic.user_id
|
|
||||||
|
|
||||||
action =
|
|
||||||
case gu.notification_level
|
|
||||||
when TopicUser.notification_levels[:tracking] then "track!"
|
|
||||||
when TopicUser.notification_levels[:regular] then "regular!"
|
|
||||||
when TopicUser.notification_levels[:muted] then "mute!"
|
|
||||||
when TopicUser.notification_levels[:watching] then "watch!"
|
|
||||||
else "track!"
|
|
||||||
end
|
|
||||||
|
|
||||||
topic.notifier.public_send(action, gu.user_id)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -279,8 +279,8 @@ describe TopicUser do
|
|||||||
it "should use group's default notification level" do
|
it "should use group's default notification level" do
|
||||||
another_user = Fabricate(:user)
|
another_user = Fabricate(:user)
|
||||||
group.add(another_user)
|
group.add(another_user)
|
||||||
|
|
||||||
topic.invite_group(target_user, group)
|
topic.invite_group(target_user, group)
|
||||||
TopicUser.track_visit!(topic.id, another_user.id)
|
|
||||||
|
|
||||||
expect(TopicUser.get(topic, another_user).notification_level)
|
expect(TopicUser.get(topic, another_user).notification_level)
|
||||||
.to eq(TopicUser.notification_levels[:tracking])
|
.to eq(TopicUser.notification_levels[:tracking])
|
||||||
|
Reference in New Issue
Block a user