From 66e66f2023438e247390ead30f468c860ff515cc Mon Sep 17 00:00:00 2001 From: Tyrone Yeh Date: Thu, 30 Jun 2022 15:16:33 +0800 Subject: [PATCH 1/5] Add my own email notification options --- models/user/user.go | 6 ++++-- models/user/user_test.go | 3 +++ options/locale/locale_en-US.ini | 1 + routers/web/user/setting/account.go | 3 ++- services/mailer/mail_issue.go | 5 ++++- templates/user/settings/account.tmpl | 1 + 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 9460bd38fe428..8fb52c56e5fe0 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -70,6 +70,8 @@ const ( EmailNotificationsOnMention = "onmention" // EmailNotificationsDisabled indicates that the user would not like to be notified via email. EmailNotificationsDisabled = "disabled" + // EmailNotificationsEnabled indicates that the user would like to receive all email notifications and your own + EmailNotificationsAndYourOwn = "andyourown" ) // User represents the object of individual and member of organization. @@ -1034,7 +1036,7 @@ func GetMaileableUsersByIDs(ids []int64, isMention bool) ([]*User, error) { Where("`type` = ?", UserTypeIndividual). And("`prohibit_login` = ?", false). And("`is_active` = ?", true). - And("`email_notifications_preference` IN ( ?, ?)", EmailNotificationsEnabled, EmailNotificationsOnMention). + In("`email_notifications_preference`", EmailNotificationsEnabled, EmailNotificationsOnMention, EmailNotificationsAndYourOwn). Find(&ous) } @@ -1042,7 +1044,7 @@ func GetMaileableUsersByIDs(ids []int64, isMention bool) ([]*User, error) { Where("`type` = ?", UserTypeIndividual). And("`prohibit_login` = ?", false). And("`is_active` = ?", true). - And("`email_notifications_preference` = ?", EmailNotificationsEnabled). + In("`email_notifications_preference`", EmailNotificationsEnabled, EmailNotificationsAndYourOwn). Find(&ous) } diff --git a/models/user/user_test.go b/models/user/user_test.go index 4994ac53ab3df..489ee3b05da35 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -153,6 +153,9 @@ func TestEmailNotificationPreferences(t *testing.T) { assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsDisabled)) assert.Equal(t, user_model.EmailNotificationsDisabled, user.EmailNotifications()) + + assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsAndYourOwn)) + assert.Equal(t, user_model.EmailNotificationsAndYourOwn, user.EmailNotifications()) } } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index eb7ae4774313b..a04eb6464a1eb 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1784,6 +1784,7 @@ settings.mirror_sync_in_progress = Mirror synchronization is in progress. Check settings.email_notifications.enable = Enable Email Notifications settings.email_notifications.onmention = Only Email on Mention settings.email_notifications.disable = Disable Email Notifications +email_notifications.andyourown = And Your Own Email Notifications settings.email_notifications.submit = Set Email Preference settings.site = Website settings.update_settings = Update Settings diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index dfade13a1ce48..4127b44a7d909 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -156,7 +156,8 @@ func EmailPost(ctx *context.Context) { preference := ctx.FormString("preference") if !(preference == user_model.EmailNotificationsEnabled || preference == user_model.EmailNotificationsOnMention || - preference == user_model.EmailNotificationsDisabled) { + preference == user_model.EmailNotificationsDisabled || + preference == user_model.EmailNotificationsAndYourOwn) { log.Error("Email notifications preference change returned unrecognized option %s: %s", preference, ctx.Doer.Name) ctx.ServerError("SetEmailPreference", errors.New("option unrecognized")) return diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go index 5c330f6e00b87..b4827e83a757f 100644 --- a/services/mailer/mail_issue.go +++ b/services/mailer/mail_issue.go @@ -91,7 +91,9 @@ func mailIssueCommentToParticipants(ctx *mailCommentContext, mentions []*user_mo visited := make(map[int64]bool, len(unfiltered)+len(mentions)+1) // Avoid mailing the doer - visited[ctx.Doer.ID] = true + if ctx.Doer.EmailNotificationsPreference != user_model.EmailNotificationsAndYourOwn { + visited[ctx.Doer.ID] = true + } // =========== Mentions =========== if err = mailIssueCommentBatch(ctx, mentions, visited, true); err != nil { @@ -133,6 +135,7 @@ func mailIssueCommentBatch(ctx *mailCommentContext, users []*user_model.User, vi // At this point we exclude: // user that don't have all mails enabled or users only get mail on mention and this is one ... if !(user.EmailNotificationsPreference == user_model.EmailNotificationsEnabled || + user.EmailNotificationsPreference == user_model.EmailNotificationsAndYourOwn || fromMention && user.EmailNotificationsPreference == user_model.EmailNotificationsOnMention) { continue } diff --git a/templates/user/settings/account.tmpl b/templates/user/settings/account.tmpl index 326a8cb5122e4..6b1cd6a26daa3 100644 --- a/templates/user/settings/account.tmpl +++ b/templates/user/settings/account.tmpl @@ -62,6 +62,7 @@
{{$.locale.Tr "settings.email_notifications"}}
From 0f24cc95583ebb16c51774f9d63506def6ba79cd Mon Sep 17 00:00:00 2001 From: Tyrone Yeh Date: Mon, 4 Jul 2022 15:11:32 +0800 Subject: [PATCH 2/5] Fix translate issue --- options/locale/locale_en-US.ini | 2 +- templates/user/settings/account.tmpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index a04eb6464a1eb..8ef1753b66400 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1784,7 +1784,7 @@ settings.mirror_sync_in_progress = Mirror synchronization is in progress. Check settings.email_notifications.enable = Enable Email Notifications settings.email_notifications.onmention = Only Email on Mention settings.email_notifications.disable = Disable Email Notifications -email_notifications.andyourown = And Your Own Email Notifications +settings.email_notifications.andyourown = And Your Own Email Notifications settings.email_notifications.submit = Set Email Preference settings.site = Website settings.update_settings = Update Settings diff --git a/templates/user/settings/account.tmpl b/templates/user/settings/account.tmpl index 6b1cd6a26daa3..38fc430005027 100644 --- a/templates/user/settings/account.tmpl +++ b/templates/user/settings/account.tmpl @@ -62,7 +62,7 @@
{{$.locale.Tr "settings.email_notifications"}}
From e91a69cba1a12f0d125db29503b61b411830b05c Mon Sep 17 00:00:00 2001 From: Tyrone Yeh Date: Thu, 7 Jul 2022 14:45:59 +0800 Subject: [PATCH 3/5] Fix settings and your own notifications missing assignees and reviewers --- modules/notification/mail/mail.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go index 1f217304b0638..40f04924513d1 100644 --- a/modules/notification/mail/mail.go +++ b/modules/notification/mail/mail.go @@ -126,7 +126,7 @@ func (m *mailNotifier) NotifyPullRequestCodeComment(pr *issues_model.PullRequest func (m *mailNotifier) NotifyIssueChangeAssignee(doer *user_model.User, issue *issues_model.Issue, assignee *user_model.User, removed bool, comment *issues_model.Comment) { // mail only sent to added assignees and not self-assignee - if !removed && doer.ID != assignee.ID && (assignee.EmailNotifications() == user_model.EmailNotificationsEnabled || assignee.EmailNotifications() == user_model.EmailNotificationsOnMention) { + if !removed && doer.ID != assignee.ID && (assignee.EmailNotifications() == user_model.EmailNotificationsEnabled || assignee.EmailNotifications() == user_model.EmailNotificationsAndYourOwn || assignee.EmailNotifications() == user_model.EmailNotificationsOnMention) { ct := fmt.Sprintf("Assigned #%d.", issue.Index) if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{assignee}); err != nil { log.Error("Error in SendIssueAssignedMail for issue[%d] to assignee[%d]: %v", issue.ID, assignee.ID, err) @@ -135,7 +135,7 @@ func (m *mailNotifier) NotifyIssueChangeAssignee(doer *user_model.User, issue *i } func (m *mailNotifier) NotifyPullReviewRequest(doer *user_model.User, issue *issues_model.Issue, reviewer *user_model.User, isRequest bool, comment *issues_model.Comment) { - if isRequest && doer.ID != reviewer.ID && (reviewer.EmailNotifications() == user_model.EmailNotificationsEnabled || reviewer.EmailNotifications() == user_model.EmailNotificationsOnMention) { + if isRequest && doer.ID != reviewer.ID && (reviewer.EmailNotifications() == user_model.EmailNotificationsEnabled || reviewer.EmailNotifications() == user_model.EmailNotificationsAndYourOwn || reviewer.EmailNotifications() == user_model.EmailNotificationsOnMention) { ct := fmt.Sprintf("Requested to review %s.", issue.HTMLURL()) if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{reviewer}); err != nil { log.Error("Error in SendIssueAssignedMail for issue[%d] to reviewer[%d]: %v", issue.ID, reviewer.ID, err) From c1626f767062b32396209d27a0971f9bb767472a Mon Sep 17 00:00:00 2001 From: Tyrone Yeh Date: Thu, 7 Jul 2022 15:03:04 +0800 Subject: [PATCH 4/5] Adjust notify issue condition --- modules/notification/mail/mail.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go index 40f04924513d1..5085656c14a4f 100644 --- a/modules/notification/mail/mail.go +++ b/modules/notification/mail/mail.go @@ -126,7 +126,7 @@ func (m *mailNotifier) NotifyPullRequestCodeComment(pr *issues_model.PullRequest func (m *mailNotifier) NotifyIssueChangeAssignee(doer *user_model.User, issue *issues_model.Issue, assignee *user_model.User, removed bool, comment *issues_model.Comment) { // mail only sent to added assignees and not self-assignee - if !removed && doer.ID != assignee.ID && (assignee.EmailNotifications() == user_model.EmailNotificationsEnabled || assignee.EmailNotifications() == user_model.EmailNotificationsAndYourOwn || assignee.EmailNotifications() == user_model.EmailNotificationsOnMention) { + if !removed && doer.ID != assignee.ID && assignee.EmailNotifications() != user_model.EmailNotificationsDisabled { ct := fmt.Sprintf("Assigned #%d.", issue.Index) if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{assignee}); err != nil { log.Error("Error in SendIssueAssignedMail for issue[%d] to assignee[%d]: %v", issue.ID, assignee.ID, err) @@ -135,7 +135,7 @@ func (m *mailNotifier) NotifyIssueChangeAssignee(doer *user_model.User, issue *i } func (m *mailNotifier) NotifyPullReviewRequest(doer *user_model.User, issue *issues_model.Issue, reviewer *user_model.User, isRequest bool, comment *issues_model.Comment) { - if isRequest && doer.ID != reviewer.ID && (reviewer.EmailNotifications() == user_model.EmailNotificationsEnabled || reviewer.EmailNotifications() == user_model.EmailNotificationsAndYourOwn || reviewer.EmailNotifications() == user_model.EmailNotificationsOnMention) { + if isRequest && doer.ID != reviewer.ID && reviewer.EmailNotifications() != user_model.EmailNotificationsDisabled { ct := fmt.Sprintf("Requested to review %s.", issue.HTMLURL()) if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{reviewer}); err != nil { log.Error("Error in SendIssueAssignedMail for issue[%d] to reviewer[%d]: %v", issue.ID, reviewer.ID, err) From 6ac8b9436ac6b1a5d77387c2726b5d6dd865fe29 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 28 Jul 2022 12:27:25 +0800 Subject: [PATCH 5/5] Update user.go --- models/user/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/user.go b/models/user/user.go index b7d99ca892be7..91eeeb8962526 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -64,7 +64,7 @@ var AvailableHashAlgorithms = []string{ } const ( - // EmailNotificationsEnabled indicates that the user would like to receive all email notifications + // EmailNotificationsEnabled indicates that the user would like to receive all email notifications except your own EmailNotificationsEnabled = "enabled" // EmailNotificationsOnMention indicates that the user would like to be notified via email when mentioned. EmailNotificationsOnMention = "onmention"