Commit f8b5429599254a21f88abb7541ff22b21833103e
Exists in
spb-stable
and in
3 other branches
Merge branch 'honor_notification_level' into 'master'
Honor notification levels Fixes #1093
Showing
2 changed files
with
88 additions
and
25 deletions
Show diff stats
app/services/notification_service.rb
| ... | ... | @@ -178,29 +178,29 @@ class NotificationService |
| 178 | 178 | |
| 179 | 179 | # Get project users with WATCH notification level |
| 180 | 180 | def project_watchers(project) |
| 181 | - # Gather all user ids that have WATCH notification setting for project | |
| 182 | - project_notification_uids = project_notification_list(project, Notification::N_WATCH) | |
| 181 | + project_members = users_project_notification(project) | |
| 183 | 182 | |
| 184 | - # Gather all user ids that have WATCH notification setting for group | |
| 185 | - group_notification_uids = group_notification_list(project, Notification::N_WATCH) | |
| 183 | + users_with_project_level_global = users_project_notification(project, Notification::N_GLOBAL) | |
| 184 | + users_with_group_level_global = users_group_notification(project, Notification::N_GLOBAL) | |
| 185 | + users = users_with_global_level_watch([users_with_project_level_global, users_with_group_level_global].flatten.uniq) | |
| 186 | 186 | |
| 187 | - # Gather all user ids that have GLOBAL setting | |
| 188 | - global_notification_uids = global_notification_list(project) | |
| 187 | + users_with_project_setting = select_users_project_setting(project, users_with_project_level_global, users) | |
| 188 | + users_with_group_setting = select_users_group_setting(project, project_members, users_with_group_level_global, users) | |
| 189 | 189 | |
| 190 | - project_and_group_uids = [project_notification_uids, group_notification_uids].flatten.uniq | |
| 191 | - group_and_project_watchers = User.where(id: project_and_group_uids) | |
| 192 | - | |
| 193 | - # Find all users that have WATCH as their GLOBAL setting | |
| 194 | - global_watchers = User.where(id: global_notification_uids, notification_level: Notification::N_WATCH) | |
| 195 | - | |
| 196 | - [group_and_project_watchers, global_watchers].flatten.uniq | |
| 190 | + User.where(id: users_with_project_setting.concat(users_with_group_setting).uniq).to_a | |
| 197 | 191 | end |
| 198 | 192 | |
| 199 | - def project_notification_list(project, notification_level) | |
| 200 | - project.users_projects.where(notification_level: notification_level).pluck(:user_id) | |
| 193 | + def users_project_notification(project, notification_level=nil) | |
| 194 | + project_members = project.users_projects | |
| 195 | + | |
| 196 | + if notification_level | |
| 197 | + project_members.where(notification_level: notification_level).pluck(:user_id) | |
| 198 | + else | |
| 199 | + project_members.pluck(:user_id) | |
| 200 | + end | |
| 201 | 201 | end |
| 202 | 202 | |
| 203 | - def group_notification_list(project, notification_level) | |
| 203 | + def users_group_notification(project, notification_level) | |
| 204 | 204 | if project.group |
| 205 | 205 | project.group.users_groups.where(notification_level: notification_level).pluck(:user_id) |
| 206 | 206 | else |
| ... | ... | @@ -208,11 +208,47 @@ class NotificationService |
| 208 | 208 | end |
| 209 | 209 | end |
| 210 | 210 | |
| 211 | - def global_notification_list(project) | |
| 212 | - [ | |
| 213 | - project_notification_list(project, Notification::N_GLOBAL), | |
| 214 | - group_notification_list(project, Notification::N_GLOBAL) | |
| 215 | - ].flatten | |
| 211 | + def users_with_global_level_watch(ids) | |
| 212 | + User.where( | |
| 213 | + id: ids, | |
| 214 | + notification_level: Notification::N_WATCH | |
| 215 | + ).pluck(:id) | |
| 216 | + end | |
| 217 | + | |
| 218 | + # Build a list of users based on project notifcation settings | |
| 219 | + def select_users_project_setting(project, global_setting, users_global_level_watch) | |
| 220 | + users = users_project_notification(project, Notification::N_WATCH) | |
| 221 | + | |
| 222 | + # If project setting is global, add to watch list if global setting is watch | |
| 223 | + global_setting.each do |user_id| | |
| 224 | + if users_global_level_watch.include?(user_id) | |
| 225 | + users << user_id | |
| 226 | + end | |
| 227 | + end | |
| 228 | + | |
| 229 | + users | |
| 230 | + end | |
| 231 | + | |
| 232 | + # Build a list of users based on group notifcation settings | |
| 233 | + def select_users_group_setting(project, project_members, global_setting, users_global_level_watch) | |
| 234 | + uids = users_group_notification(project, Notification::N_WATCH) | |
| 235 | + | |
| 236 | + # Group setting is watch, add to users list if user is not project member | |
| 237 | + users = [] | |
| 238 | + uids.each do |user_id| | |
| 239 | + if project_members.exclude?(user_id) | |
| 240 | + users << user_id | |
| 241 | + end | |
| 242 | + end | |
| 243 | + | |
| 244 | + # Group setting is global, add to users list if global setting is watch | |
| 245 | + global_setting.each do |user_id| | |
| 246 | + if project_members.exclude?(user_id) && users_global_level_watch.include?(user_id) | |
| 247 | + users << user_id | |
| 248 | + end | |
| 249 | + end | |
| 250 | + | |
| 251 | + users | |
| 216 | 252 | end |
| 217 | 253 | |
| 218 | 254 | # Remove users with disabled notifications from array | ... | ... |
spec/services/notification_service_spec.rb
| ... | ... | @@ -57,15 +57,42 @@ describe NotificationService do |
| 57 | 57 | Notify.should_not_receive(:note_issue_email) |
| 58 | 58 | notification.new_note(mentioned_note) |
| 59 | 59 | end |
| 60 | + end | |
| 60 | 61 | |
| 61 | - def should_email(user_id) | |
| 62 | - Notify.should_receive(:note_issue_email).with(user_id, note.id) | |
| 62 | + describe 'new note on issue in project that belongs to a group' do | |
| 63 | + let(:group) { create(:group) } | |
| 64 | + | |
| 65 | + before do | |
| 66 | + note.project.namespace_id = group.id | |
| 67 | + note.project.group.add_user(@u_watcher, UsersGroup::MASTER) | |
| 68 | + note.project.save | |
| 69 | + user_project = note.project.users_projects.find_by_user_id(@u_watcher.id) | |
| 70 | + user_project.notification_level = Notification::N_PARTICIPATING | |
| 71 | + user_project.save | |
| 72 | + user_group = note.project.group.users_groups.find_by_user_id(@u_watcher.id) | |
| 73 | + user_group.notification_level = Notification::N_GLOBAL | |
| 74 | + user_group.save | |
| 63 | 75 | end |
| 64 | 76 | |
| 65 | - def should_not_email(user_id) | |
| 66 | - Notify.should_not_receive(:note_issue_email).with(user_id, note.id) | |
| 77 | + it do | |
| 78 | + should_email(note.noteable.author_id) | |
| 79 | + should_email(note.noteable.assignee_id) | |
| 80 | + should_email(@u_mentioned.id) | |
| 81 | + should_not_email(@u_watcher.id) | |
| 82 | + should_not_email(note.author_id) | |
| 83 | + should_not_email(@u_participating.id) | |
| 84 | + should_not_email(@u_disabled.id) | |
| 85 | + notification.new_note(note) | |
| 67 | 86 | end |
| 68 | 87 | end |
| 88 | + | |
| 89 | + def should_email(user_id) | |
| 90 | + Notify.should_receive(:note_issue_email).with(user_id, note.id) | |
| 91 | + end | |
| 92 | + | |
| 93 | + def should_not_email(user_id) | |
| 94 | + Notify.should_not_receive(:note_issue_email).with(user_id, note.id) | |
| 95 | + end | |
| 69 | 96 | end |
| 70 | 97 | |
| 71 | 98 | context 'commit note' do | ... | ... |