diff options
author | Sean McGivern <sean@mcgivern.me.uk> | 2018-06-07 20:10:45 +0000 |
---|---|---|
committer | Sean McGivern <sean@mcgivern.me.uk> | 2018-06-07 20:10:45 +0000 |
commit | 6e614bd5e03e55a6b64a89b1cdbf2973bdd6ca84 (patch) | |
tree | d5b71bf7d2f32e5f4fc8fdb658762e343433a869 /app/models/notification_recipient.rb | |
parent | 27aa2e544b9f97b701888bd17d517c5f2b697f91 (diff) | |
parent | afe5d7d56ee771dac6e4a97d23e69d678c03da2d (diff) | |
download | gitlab-ce-6e614bd5e03e55a6b64a89b1cdbf2973bdd6ca84.tar.gz |
Merge branch 'issue_44230' into 'master'
Apply notification settings level of groups to all child objects
Closes #44230
See merge request gitlab-org/gitlab-ce!19191
Diffstat (limited to 'app/models/notification_recipient.rb')
-rw-r--r-- | app/models/notification_recipient.rb | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb index 79458bd048a..1a03dd9df56 100644 --- a/app/models/notification_recipient.rb +++ b/app/models/notification_recipient.rb @@ -1,4 +1,6 @@ class NotificationRecipient + include Gitlab::Utils::StrongMemoize + attr_reader :user, :type, :reason def initialize(user, type, **opts) unless NotificationSetting.levels.key?(type) || type == :subscription @@ -142,10 +144,33 @@ class NotificationRecipient return project_setting unless project_setting.nil? || project_setting.global? - group_setting = @group && user.notification_settings_for(@group) + group_setting = closest_non_global_group_notification_settting - return group_setting unless group_setting.nil? || group_setting.global? + return group_setting unless group_setting.nil? user.global_notification_setting end + + # Returns the notificaton_setting of the lowest group in hierarchy with non global level + def closest_non_global_group_notification_settting + return unless @group + return if indexed_group_notification_settings.empty? + + notification_setting = nil + + @group.self_and_ancestors_ids.each do |id| + notification_setting = indexed_group_notification_settings[id] + break if notification_setting + end + + notification_setting + end + + def indexed_group_notification_settings + strong_memoize(:indexed_group_notification_settings) do + @group.notification_settings.where(user_id: user.id) + .where.not(level: NotificationSetting.levels[:global]) + .index_by(&:source_id) + end + end end |