Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarin Jankovski <marin@gitlab.com>2014-04-01 15:07:23 +0400
committerMarin Jankovski <marin@gitlab.com>2014-04-01 19:18:52 +0400
commit528a641e9ee5f72f3f5a1da1e1a31b9b61262efd (patch)
treebed18bc9bb273bd7f5d53a8e7e14ce293619c3ca /app/services
parentce30a56f333f61c01314cf32e15381080a9b14d3 (diff)
Use group notification settings while honoring project settings.
Diffstat (limited to 'app/services')
-rw-r--r--app/services/notification_service.rb73
1 files changed, 41 insertions, 32 deletions
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 4d6616b969d..dc5f4aa8822 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -178,28 +178,28 @@ class NotificationService
# Get project users with WATCH notification level
def project_watchers(project)
- # Gather all user that have WATCH notification setting for project and group
- project_uids, group_uids = project_and_group_watchers(project, Notification::N_WATCH)
+ project_members = project_notification_list(project)
- # Gather all user that have WATCH as their GLOBAL setting
- global_setting_project, global_setting_group = project_and_group_watchers(project, Notification::N_GLOBAL)
- global_uids = [global_setting_project, global_setting_group].flatten.uniq
- global_watchers_ids = User.where(id: global_uids, notification_level: Notification::N_WATCH).pluck(:id)
+ project_global= project_notification_list(project, Notification::N_GLOBAL)
+ group_global = group_notification_list(project, Notification::N_GLOBAL)
+ global_watch = User.where(
+ id: [project_global, group_global].flatten.uniq,
+ notification_level: Notification::N_WATCH
+ ).pluck(:id)
- # Select watchers based on what the project setting is
- project_watchers, user_ids = select_watchers(global_watchers_ids, global_setting_project, project_uids)
+ project_watch = watch_project(project, project_global, global_watch)
+ group_watch = watch_group(project, project_members, group_global, global_watch)
- # Select watchers based on what the group setting is
- group_watchers, ids = select_watchers(user_ids, global_setting_group, group_uids)
-
- project_watchers.concat(group_watchers.concat(ids)).uniq
- watchers = User.where(id: project_watchers)
-
- watchers.to_a
+ User.where(id: project_watch.concat(group_watch).uniq).to_a
end
- def project_notification_list(project, notification_level)
- project.users_projects.where(notification_level: notification_level).pluck(:user_id)
+ def project_notification_list(project, notification_level=nil)
+ project_members = project.users_projects
+ if notification_level
+ project_members.where(notification_level: notification_level).pluck(:user_id)
+ else
+ project_members.pluck(:user_id)
+ end
end
def group_notification_list(project, notification_level)
@@ -210,25 +210,34 @@ class NotificationService
end
end
- def select_watchers(user_ids, global_setting, setting)
- watchers = []
- user_ids.each do |i|
- if setting.include?(i)
- watchers << i
- elsif global_setting.include?(i)
- watchers << i
- else
- user_ids.delete(i)
+ def watch_project(project, global_setting, watch_global)
+ uids = project_notification_list(project, Notification::N_WATCH)
+
+ global_setting.each do |i|
+ if watch_global.include?(i)
+ uids << i
end
end
- [watchers, user_ids]
+ uids.uniq
end
- def project_and_group_watchers(project, notification_level)
- [
- project_notification_list(project, notification_level),
- group_notification_list(project, notification_level)
- ]
+ def watch_group(project, project_members, global_setting, watch_global)
+ uids = group_notification_list(project, Notification::N_WATCH)
+ # Group setting is watch, add to watchers list user is not project member
+ watch = []
+ uids.each do |i|
+ if project_members.exclude?(i)
+ watch << i
+ end
+ end
+
+ global_setting.each do |i|
+ if project_members.exclude?(i) && watch_global.include?(i)
+ watch << i
+ end
+ end
+
+ watch.uniq
end
# Remove users with disabled notifications from array