From b033f2f535ad498ed78da6599d446abe2fd5c27d Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 17 Dec 2014 17:42:54 +0200 Subject: Finish method for having multiple emails/user. All basics are implemented. Missing are the right (localized) strings and the page markup could have a look at by a frontend guy. --- routers/user/setting.go | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) (limited to 'routers/user/setting.go') diff --git a/routers/user/setting.go b/routers/user/setting.go index 304ddd362b..7dca5d8697 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -14,6 +14,7 @@ import ( "github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" + "github.com/gogits/gogs/modules/mailer" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" ) @@ -21,6 +22,7 @@ import ( const ( SETTINGS_PROFILE base.TplName = "user/settings/profile" SETTINGS_PASSWORD base.TplName = "user/settings/password" + SETTINGS_EMAILS base.TplName = "user/settings/email" SETTINGS_SSH_KEYS base.TplName = "user/settings/sshkeys" SETTINGS_SOCIAL base.TplName = "user/settings/social" SETTINGS_APPLICATIONS base.TplName = "user/settings/applications" @@ -126,6 +128,112 @@ func SettingsAvatar(ctx *middleware.Context, form auth.UploadAvatarForm) { ctx.Flash.Success(ctx.Tr("settings.update_avatar_success")) } +func SettingsEmails(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsUserSettings"] = true + ctx.Data["PageIsSettingsEmails"] = true + + var err error + ctx.Data["Emails"], err = models.GetEmailAddresses(ctx.User.Id) + + if err != nil { + ctx.Handle(500, "email.GetEmailAddresses", err) + return + } + + ctx.HTML(200, SETTINGS_EMAILS) +} + +func SettingsEmailPost(ctx *middleware.Context, form auth.AddEmailForm) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsUserSettings"] = true + ctx.Data["PageIsSettingsEmails"] = true + + var err error + ctx.Data["Emails"], err = models.GetEmailAddresses(ctx.User.Id) + if err != nil { + ctx.Handle(500, "email.GetEmailAddresses", err) + return + } + + // Delete Email address. + if ctx.Query("_method") == "DELETE" { + id := com.StrTo(ctx.Query("id")).MustInt64() + if id <= 0 { + return + } + + if err = models.DeleteEmailAddress(&models.EmailAddress{Id: id}); err != nil { + ctx.Handle(500, "DeleteEmail", err) + } else { + log.Trace("Email address deleted: %s", ctx.User.Name) + ctx.Redirect(setting.AppSubUrl + "/user/settings/email") + } + return + } + + // Make emailaddress primary. + if ctx.Query("_method") == "PRIMARY" { + id := com.StrTo(ctx.Query("id")).MustInt64() + if id <= 0 { + return + } + + if err = models.MakeEmailPrimary(&models.EmailAddress{Id: id}); err != nil { + ctx.Handle(500, "MakeEmailPrimary", err) + } else { + log.Trace("Email made primary: %s", ctx.User.Name) + ctx.Redirect(setting.AppSubUrl + "/user/settings/email") + } + return + } + + // Add Email address. + if ctx.Req.Method == "POST" { + if ctx.HasError() { + ctx.HTML(200, SETTINGS_EMAILS) + return + } + + cleanEmail := strings.Replace(form.Email, "\n", "", -1) + e := &models.EmailAddress{ + OwnerId: ctx.User.Id, + Email: cleanEmail, + IsActivated: !setting.Service.RegisterEmailConfirm, + } + + if err := models.AddEmailAddress(e); err != nil { + if err == models.ErrEmailAlreadyUsed { + ctx.RenderWithErr(ctx.Tr("form.email_has_been_used"), SETTINGS_EMAILS, &form) + return + } + ctx.Handle(500, "email.AddEmailAddress", err) + return + } else { + + // Send confirmation e-mail + if setting.Service.RegisterEmailConfirm { + mailer.SendActivateEmail(ctx.Render, ctx.User, e) + + if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil { + log.Error(4, "Set cache(MailResendLimit) fail: %v", err) + } + ctx.Flash.Success(ctx.Tr("settings.add_email_success_confirmation_email_sent")) + } else { + ctx.Flash.Success(ctx.Tr("settings.add_email_success")) + } + + log.Trace("Email address added: %s", e.Email) + + ctx.Redirect(setting.AppSubUrl + "/user/settings/email") + return + } + + } + + ctx.HTML(200, SETTINGS_EMAILS) +} + func SettingsPassword(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsUserSettings"] = true -- cgit v1.2.3 From 20b5c23a192b3a87b4fdac724c5be705588e461c Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 20 Dec 2014 09:26:51 +0200 Subject: Small fixes to multiple_emails feature --- models/user.go | 24 ++++++++++++------------ routers/user/setting.go | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) (limited to 'routers/user/setting.go') diff --git a/models/user.go b/models/user.go index fd2d8dc708..631a027474 100644 --- a/models/user.go +++ b/models/user.go @@ -100,7 +100,7 @@ type User struct { // primary email address, but is not obligatory type EmailAddress struct { Id int64 - OwnerId int64 `xorm:"INDEX NOT NULL"` + Uid int64 `xorm:"INDEX NOT NULL"` Email string `xorm:"UNIQUE NOT NULL"` IsActivated bool IsPrimary bool `xorm:"-"` @@ -261,8 +261,8 @@ func IsEmailUsed(email string) (bool, error) { if len(email) == 0 { return false, nil } - if used, err := x.Get(&EmailAddress{Email: email}); used || err != nil { - return used, err + if has, err := x.Get(&EmailAddress{Email: email}); has || err != nil { + return has, err } return x.Get(&User{Email: email}) } @@ -524,7 +524,7 @@ func DeleteUser(u *User) error { return err } // Delete all alternative email addresses - if _, err = x.Delete(&EmailAddress{OwnerId: u.Id}); err != nil { + if _, err = x.Delete(&EmailAddress{Uid: u.Id}); err != nil { return err } // Delete all SSH keys. @@ -551,7 +551,7 @@ func DeleteUser(u *User) error { func DeleteInactivateUsers() error { _, err := x.Where("is_active=?", false).Delete(new(User)) if err == nil { - _, err = x.Delete(&EmailAddress{IsActivated: false}) + _, err = x.Where("is_activated=?", false).Delete(new(EmailAddress)) } return err } @@ -639,11 +639,11 @@ func GetEmailAddresses(uid int64) ([]*EmailAddress, error) { return nil, err } - primary_email_found := false + isPrimaryFound := false for _, email := range emails { if email.Email == u.Email { - primary_email_found = true + isPrimaryFound = true email.IsPrimary = true } else { email.IsPrimary = false @@ -652,7 +652,7 @@ func GetEmailAddresses(uid int64) ([]*EmailAddress, error) { // We alway want the primary email address displayed, even if it's not in // the emailaddress table (yet) - if !primary_email_found { + if !isPrimaryFound { emails = append(emails, &EmailAddress{Email: u.Email, IsActivated: true, IsPrimary: true}) } return emails, nil @@ -676,7 +676,7 @@ func (email *EmailAddress) Activate() error { return err } - if user, err := GetUserById(email.OwnerId); err != nil { + if user, err := GetUserById(email.Uid); err != nil { return err } else { user.Rands = GetUserSalt() @@ -712,7 +712,7 @@ func MakeEmailPrimary(email *EmailAddress) error { return ErrEmailNotActivated } - user := &User{Id: email.OwnerId} + user := &User{Id: email.Uid} has, err = x.Get(user) if err != nil { return err @@ -726,7 +726,7 @@ func MakeEmailPrimary(email *EmailAddress) error { if err != nil { return err } else if !has { - former_primary_email.OwnerId = user.Id + former_primary_email.Uid = user.Id former_primary_email.IsActivated = user.IsActive x.Insert(former_primary_email) } @@ -799,7 +799,7 @@ func GetUserByEmail(email string) (*User, error) { return nil, err } if has { - return GetUserById(emailAddress.OwnerId) + return GetUserById(emailAddress.Uid) } return nil, ErrUserNotExist diff --git a/routers/user/setting.go b/routers/user/setting.go index 7dca5d8697..419e84b395 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -197,7 +197,7 @@ func SettingsEmailPost(ctx *middleware.Context, form auth.AddEmailForm) { cleanEmail := strings.Replace(form.Email, "\n", "", -1) e := &models.EmailAddress{ - OwnerId: ctx.User.Id, + Uid: ctx.User.Id, Email: cleanEmail, IsActivated: !setting.Service.RegisterEmailConfirm, } -- cgit v1.2.3