Commit ea25e091 authored by Sean McGivern's avatar Sean McGivern

Exclude projects pending delete from notifications

If the Sidekiq job fails for some reason, a project can be 'stuck'
pending deletion. The project can't be viewed, so it shouldn't be
available through the notification settings association as this will
throw an exception when we try to show the link.
parent 3c89a788
...@@ -17,6 +17,7 @@ v 8.10.0 (unreleased) ...@@ -17,6 +17,7 @@ v 8.10.0 (unreleased)
- Fix MR-auto-close text added to description. !4836 - Fix MR-auto-close text added to description. !4836
- Fix issue, preventing users w/o push access to sort tags !5105 (redetection) - Fix issue, preventing users w/o push access to sort tags !5105 (redetection)
- Add Spring EmojiOne updates. - Add Spring EmojiOne updates.
- Fix viewing notification settings when a project is pending deletion
- Fix pagination when sorting by columns with lots of ties (like priority) - Fix pagination when sorting by columns with lots of ties (like priority)
- Updated project header design - Updated project header design
- Exclude email check from the standard health check - Exclude email check from the standard health check
......
...@@ -5,6 +5,7 @@ class NotificationSetting < ActiveRecord::Base ...@@ -5,6 +5,7 @@ class NotificationSetting < ActiveRecord::Base
belongs_to :user belongs_to :user
belongs_to :source, polymorphic: true belongs_to :source, polymorphic: true
belongs_to :project, foreign_key: 'source_id'
validates :user, presence: true validates :user, presence: true
validates :level, presence: true validates :level, presence: true
...@@ -13,7 +14,13 @@ class NotificationSetting < ActiveRecord::Base ...@@ -13,7 +14,13 @@ class NotificationSetting < ActiveRecord::Base
allow_nil: true } allow_nil: true }
scope :for_groups, -> { where(source_type: 'Namespace') } scope :for_groups, -> { where(source_type: 'Namespace') }
scope :for_projects, -> { where(source_type: 'Project') }
# Exclude projects not included by the Project model's default scope (those that are
# pending delete).
#
scope :for_projects, -> do
includes(:project).references(:projects).where(source_type: 'Project').where.not(projects: { id: nil })
end
EMAIL_EVENTS = [ EMAIL_EVENTS = [
:new_note, :new_note,
......
FactoryGirl.define do
factory :notification_setting do
source factory: :empty_project
user
level 3
events []
end
end
...@@ -38,4 +38,21 @@ RSpec.describe NotificationSetting, type: :model do ...@@ -38,4 +38,21 @@ RSpec.describe NotificationSetting, type: :model do
end end
end end
end end
describe '#for_projects' do
let(:user) { create(:user) }
before do
1.upto(4) do |i|
setting = create(:notification_setting, user: user)
setting.project.update_attributes(pending_delete: true) if i.even?
end
end
it 'excludes projects pending delete' do
expect(user.notification_settings.for_projects).to all(have_attributes(project: an_instance_of(Project)))
expect(user.notification_settings.for_projects.map(&:project)).to all(have_attributes(pending_delete: false))
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment