summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorSean McGivern <sean@gitlab.com>2017-06-08 17:10:35 +0100
committerSean McGivern <sean@gitlab.com>2017-06-15 15:15:13 +0100
commite94c1028c1e829f899b0d0f56313cc62df6f9a0a (patch)
treed69f40f69e1ed69ce5c2c6d7fe2367ccca7cdce1 /app/models
parentf4b5fcbca100769b89e6b06e0df180012d16a7a8 (diff)
downloadgitlab-ce-e94c1028c1e829f899b0d0f56313cc62df6f9a0a.tar.gz
Deserialise existing custom notification settingsdeserialize-custom-notifications
Create a post-deployment migration to update all existing notification settings with at least one custom level enabled to the new format. Also handle the same conversion when updating settings, to catch any stragglers.
Diffstat (limited to 'app/models')
-rw-r--r--app/models/notification_setting.rb26
1 files changed, 24 insertions, 2 deletions
diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb
index 2a53484f96f..b0df7aeb323 100644
--- a/app/models/notification_setting.rb
+++ b/app/models/notification_setting.rb
@@ -42,6 +42,7 @@ class NotificationSetting < ActiveRecord::Base
].freeze
store :events, coder: JSON
+ before_save :convert_events
def self.find_or_create_for(source)
setting = find_or_initialize_by(source: source)
@@ -53,21 +54,42 @@ class NotificationSetting < ActiveRecord::Base
setting
end
- EMAIL_EVENTS.each do |event|
+ # 1. Check if this event has a value stored in its database column.
+ # 2. If it does, return that value.
+ # 3. If it doesn't (the value is nil), return the value from the serialized
+ # JSON hash in `events`.
+ (EMAIL_EVENTS - [:failed_pipeline]).each do |event|
define_method(event) do
bool = super()
bool.nil? ? !!events[event] : bool
end
+
+ alias_method :"#{event}?", event
end
# Allow people to receive failed pipeline notifications if they already have
# custom notifications enabled, as these are more like mentions than the other
# custom settings.
def failed_pipeline
- bool = read_attribute(:failed_pipeline)
+ bool = super
bool = events[:failed_pipeline] if bool.nil?
bool.nil? || bool
end
+ alias_method :failed_pipeline?, :failed_pipeline
+
+ def event_enabled?(event)
+ respond_to?(event) && public_send(event)
+ end
+
+ def convert_events
+ return if events_before_type_cast.nil?
+
+ EMAIL_EVENTS.each do |event|
+ write_attribute(event, public_send(event))
+ end
+
+ write_attribute(:events, nil)
+ end
end