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:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-05-03 14:00:51 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-05-03 14:00:51 +0300
commit4291e28af72890ee4f9c0f306ba691ba84c3435d (patch)
tree980036c1fb0affa984da0c8135d0ffca115baa7c /app/models/user.rb
parent0df317f7297b9a72e888edc09aed51f83414f92a (diff)
parentd386bb780864f4fc36490e19ea654f31bf193d0f (diff)
Merge branch 'change-primary-email' into 'master'
Allow primary email to be set to an email that you've already added. Fixes gitlab-com/support-forum#106. When the user sets their primary email to an email that they've already added to their account, this patch makes sure that secondary email record is destroyed, and a new email record is created for the old primary email. This is based on the assumption that in this case no email was meant to be deleted, but the user simply wanted to change which of their emails is primary. See merge request !591
Diffstat (limited to 'app/models/user.rb')
-rw-r--r--app/models/user.rb28
1 files changed, 26 insertions, 2 deletions
diff --git a/app/models/user.rb b/app/models/user.rb
index f22fdc28435..9f198368129 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -139,6 +139,7 @@ class User < ActiveRecord::Base
validate :avatar_type, if: ->(user) { user.avatar_changed? }
validate :unique_email, if: ->(user) { user.email_changed? }
validate :owns_notification_email, if: ->(user) { user.notification_email_changed? }
+ validate :owns_public_email, if: ->(user) { user.public_email_changed? }
validates :avatar, file_size: { maximum: 200.kilobytes.to_i }
before_validation :generate_password, on: :create
@@ -147,6 +148,7 @@ class User < ActiveRecord::Base
before_validation :set_notification_email, if: ->(user) { user.email_changed? }
before_validation :set_public_email, if: ->(user) { user.public_email_changed? }
+ after_update :update_emails_with_primary_email, if: ->(user) { user.email_changed? }
before_save :ensure_authentication_token
after_save :ensure_namespace_correct
after_initialize :set_projects_limit
@@ -277,13 +279,29 @@ class User < ActiveRecord::Base
end
def unique_email
- self.errors.add(:email, 'has already been taken') if Email.exists?(email: self.email)
+ if !self.emails.exists?(email: self.email) && Email.exists?(email: self.email)
+ self.errors.add(:email, 'has already been taken')
+ end
end
def owns_notification_email
self.errors.add(:notification_email, "is not an email you own") unless self.all_emails.include?(self.notification_email)
end
+ def owns_public_email
+ self.errors.add(:public_email, "is not an email you own") unless self.all_emails.include?(self.public_email)
+ end
+
+ def update_emails_with_primary_email
+ primary_email_record = self.emails.find_by(email: self.email)
+ if primary_email_record
+ primary_email_record.destroy
+ self.emails.create(email: self.email_was)
+
+ self.update_secondary_emails!
+ end
+ end
+
# Groups user has access to
def authorized_groups
@authorized_groups ||= begin
@@ -449,10 +467,16 @@ class User < ActiveRecord::Base
def set_public_email
if self.public_email.blank? || !self.all_emails.include?(self.public_email)
- self.public_email = ''
+ self.public_email = nil
end
end
+ def update_secondary_emails!
+ self.set_notification_email
+ self.set_public_email
+ self.save if self.notification_email_changed? || self.public_email_changed?
+ end
+
def set_projects_limit
connection_default_value_defined = new_record? && !projects_limit_changed?
return unless self.projects_limit.nil? || connection_default_value_defined