diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt index f5727856b9..ee05aa3ed0 100644 --- a/Documentation/rest-api-accounts.txt +++ b/Documentation/rest-api-accounts.txt @@ -1947,6 +1947,12 @@ link:rest-api-config.html#top-menu-item-info[TopMenuItemInfo] entities. |`url_aliases` |optional| A map of URL path pairs, where the first URL path is an alias for the second URL path. +|`email_notifications` || +The type of email strategy to use. On `ENABLED`, the user will receive emails +from Gerrit. On `CC_ON_OWN_COMMENTS` the user will also receive emails for +their own comments. On `DISABLED` the user will not receive any email +notifications from Gerrit. +Allowed values are `ENABLED`, `CC_ON_OWN_COMMENTS`, `DISABLED`. |============================================ [[preferences-input]] diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountPreferencesInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountPreferencesInfo.java index 11a1b6a516..afde038e77 100644 --- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountPreferencesInfo.java +++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountPreferencesInfo.java @@ -21,6 +21,7 @@ import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.EmailStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gwt.core.client.JavaScriptObject; @@ -44,7 +45,6 @@ public class AccountPreferencesInfo extends JavaScriptObject { p.useFlashClipboard(defaultPrefs.isUseFlashClipboard()); p.downloadScheme(defaultPrefs.getDownloadUrl()); p.downloadCommand(defaultPrefs.getDownloadCommand()); - p.copySelfOnEmail(defaultPrefs.isCopySelfOnEmails()); p.dateFormat(defaultPrefs.getDateFormat()); p.timeFormat(defaultPrefs.getTimeFormat()); p.relativeDateInChangeTable(defaultPrefs.isRelativeDateInChangeTable()); @@ -53,6 +53,7 @@ public class AccountPreferencesInfo extends JavaScriptObject { p.muteCommonPathPrefixes(defaultPrefs.isMuteCommonPathPrefixes()); p.reviewCategoryStrategy(defaultPrefs.getReviewCategoryStrategy()); p.diffView(defaultPrefs.getDiffView()); + p.emailStrategy(defaultPrefs.getEmailStrategy()); return p; } @@ -82,9 +83,6 @@ public class AccountPreferencesInfo extends JavaScriptObject { private final native String downloadCommandRaw() /*-{ return this.download_command }-*/; - public final native boolean copySelfOnEmail() - /*-{ return this.copy_self_on_email || false }-*/; - public final DateFormat dateFormat() { String s = dateFormatRaw(); return s != null ? DateFormat.valueOf(s) : null; @@ -125,6 +123,14 @@ public class AccountPreferencesInfo extends JavaScriptObject { private final native String diffViewRaw() /*-{ return this.diff_view }-*/; + public final EmailStrategy emailStrategy() { + String s = emailStrategyRaw(); + return s != null ? EmailStrategy.valueOf(s) : null; + } + + private final native String emailStrategyRaw() + /*-{ return this.email_strategy }-*/; + public final native JsArray my() /*-{ return this.my; }-*/; @@ -146,9 +152,6 @@ public class AccountPreferencesInfo extends JavaScriptObject { public final native void downloadCommandRaw(String d) /*-{ this.download_command = d }-*/; - public final native void copySelfOnEmail(boolean c) - /*-{ this.copy_self_on_email = c }-*/; - public final void dateFormat(DateFormat f) { dateFormatRaw(f != null ? f.toString() : null); } @@ -185,6 +188,12 @@ public class AccountPreferencesInfo extends JavaScriptObject { private final native void diffViewRaw(String d) /*-{ this.diff_view = d }-*/; + public final void emailStrategy(EmailStrategy s) { + emailStrategyRaw(s != null ? s.toString() : null); + } + private final native void emailStrategyRaw(String s) + /*-{ this.email_strategy = s }-*/; + public final void setMyMenus(List myMenus) { initMy(); for (TopMenuItem n : myMenus) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java index 94884fa7d7..e49b95fd3b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java @@ -31,7 +31,6 @@ public interface AccountConstants extends Constants { String contextWholeFile(); String showSiteHeader(); String useFlashClipboard(); - String copySelfOnEmails(); String reviewCategoryLabel(); String messageShowInReviewCategoryNone(); String messageShowInReviewCategoryName(); @@ -159,4 +158,9 @@ public interface AccountConstants extends Constants { String welcomeAgreementText(); String welcomeAgreementLater(); String welcomeContinue(); + + String messageEnabled(); + String messageCCMeOnMyComments(); + String messageDisabled(); + String emailFieldLabel(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties index 09444482eb..9a00ded335 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties @@ -7,7 +7,6 @@ registeredOn = Registered accountId = Account ID showSiteHeader = Show Site Header useFlashClipboard = Use Flash Clipboard Widget -copySelfOnEmails = CC Me On Comments I Write reviewCategoryLabel = Display In Review Category messageShowInReviewCategoryNone = None (default) messageShowInReviewCategoryName = Show Name @@ -15,6 +14,11 @@ messageShowInReviewCategoryEmail = Show Email messageShowInReviewCategoryUsername = Show Username messageShowInReviewCategoryAbbrev = Show Abbreviated Name +emailFieldLabel = Email Notifications: +messageEnabled = Enabled +messageCCMeOnMyComments = CC Me On Comments I Write +messageDisabled = Disabled + maximumPageSizeFieldLabel = Maximum Page Size: diffViewLabel = Diff View: dateFormatLabel = Date/Time Format: diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java index 2b20ad67c1..c0b556cd55 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java @@ -29,6 +29,7 @@ import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.rpc.ScreenLoadCallback; import com.google.gerrit.client.ui.OnEditEnabler; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.EmailStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ClickEvent; @@ -50,7 +51,6 @@ import java.util.List; public class MyPreferencesScreen extends SettingsScreen { private CheckBox showSiteHeader; private CheckBox useFlashClipboard; - private CheckBox copySelfOnEmails; private CheckBox relativeDateInChangeTable; private CheckBox sizeBarInChangeTable; private CheckBox legacycidInChangeTable; @@ -60,6 +60,7 @@ public class MyPreferencesScreen extends SettingsScreen { private ListBox timeFormat; private ListBox reviewCategoryStrategy; private ListBox diffView; + private ListBox emailStrategy; private StringListPanel myMenus; private Button save; @@ -69,7 +70,6 @@ public class MyPreferencesScreen extends SettingsScreen { showSiteHeader = new CheckBox(Util.C.showSiteHeader()); useFlashClipboard = new CheckBox(Util.C.useFlashClipboard()); - copySelfOnEmails = new CheckBox(Util.C.copySelfOnEmails()); maximumPageSize = new ListBox(); for (final short v : PAGESIZE_CHOICES) { maximumPageSize.addItem(Util.M.rowsPerPage(v), String.valueOf(v)); @@ -92,6 +92,20 @@ public class MyPreferencesScreen extends SettingsScreen { Util.C.messageShowInReviewCategoryAbbrev(), AccountGeneralPreferences.ReviewCategoryStrategy.ABBREV.name()); + emailStrategy = new ListBox(); + emailStrategy.addItem(Util.C.messageEnabled(), + AccountGeneralPreferences.EmailStrategy.ENABLED.name()); + emailStrategy + .addItem( + Util.C.messageCCMeOnMyComments(), + AccountGeneralPreferences.EmailStrategy.CC_ON_OWN_COMMENTS + .name()); + emailStrategy + .addItem( + Util.C.messageDisabled(), + AccountGeneralPreferences.EmailStrategy.DISABLED + .name()); + diffView = new ListBox(); diffView.addItem( com.google.gerrit.client.changes.Util.C.sideBySide(), @@ -141,7 +155,7 @@ public class MyPreferencesScreen extends SettingsScreen { muteCommonPathPrefixes = new CheckBox(Util.C.muteCommonPathPrefixes()); boolean flashClippy = !UserAgent.hasJavaScriptClipboard() && UserAgent.Flash.isInstalled(); - final Grid formGrid = new Grid(10 + (flashClippy ? 1 : 0), 2); + final Grid formGrid = new Grid(11 + (flashClippy ? 1 : 0), 2); int row = 0; formGrid.setText(row, labelIdx, ""); @@ -154,10 +168,6 @@ public class MyPreferencesScreen extends SettingsScreen { row++; } - formGrid.setText(row, labelIdx, ""); - formGrid.setWidget(row, fieldIdx, copySelfOnEmails); - row++; - formGrid.setText(row, labelIdx, Util.C.reviewCategoryLabel()); formGrid.setWidget(row, fieldIdx, reviewCategoryStrategy); row++; @@ -186,6 +196,10 @@ public class MyPreferencesScreen extends SettingsScreen { formGrid.setWidget(row, fieldIdx, muteCommonPathPrefixes); row++; + formGrid.setText(row, labelIdx, Util.C.emailFieldLabel()); + formGrid.setWidget(row, fieldIdx, emailStrategy); + row++; + formGrid.setText(row, labelIdx, Util.C.diffViewLabel()); formGrid.setWidget(row, fieldIdx, diffView); @@ -208,7 +222,6 @@ public class MyPreferencesScreen extends SettingsScreen { final OnEditEnabler e = new OnEditEnabler(save); e.listenTo(showSiteHeader); e.listenTo(useFlashClipboard); - e.listenTo(copySelfOnEmails); e.listenTo(maximumPageSize); e.listenTo(dateFormat); e.listenTo(timeFormat); @@ -218,6 +231,7 @@ public class MyPreferencesScreen extends SettingsScreen { e.listenTo(muteCommonPathPrefixes); e.listenTo(diffView); e.listenTo(reviewCategoryStrategy); + e.listenTo(emailStrategy); } @Override @@ -240,7 +254,6 @@ public class MyPreferencesScreen extends SettingsScreen { private void enable(final boolean on) { showSiteHeader.setEnabled(on); useFlashClipboard.setEnabled(on); - copySelfOnEmails.setEnabled(on); maximumPageSize.setEnabled(on); dateFormat.setEnabled(on); timeFormat.setEnabled(on); @@ -250,12 +263,12 @@ public class MyPreferencesScreen extends SettingsScreen { muteCommonPathPrefixes.setEnabled(on); reviewCategoryStrategy.setEnabled(on); diffView.setEnabled(on); + emailStrategy.setEnabled(on); } private void display(AccountPreferencesInfo p) { showSiteHeader.setValue(p.showSiteHeader()); useFlashClipboard.setValue(p.useFlashClipboard()); - copySelfOnEmails.setValue(p.copySelfOnEmail()); setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage()); setListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, // p.dateFormat()); @@ -271,6 +284,9 @@ public class MyPreferencesScreen extends SettingsScreen { setListBox(diffView, AccountGeneralPreferences.DiffView.SIDE_BY_SIDE, p.diffView()); + setListBox(emailStrategy, + AccountGeneralPreferences.EmailStrategy.ENABLED, + p.emailStrategy()); display(p.my()); } @@ -337,7 +353,6 @@ public class MyPreferencesScreen extends SettingsScreen { AccountPreferencesInfo p = AccountPreferencesInfo.create(); p.showSiteHeader(showSiteHeader.getValue()); p.useFlashClipboard(useFlashClipboard.getValue()); - p.copySelfOnEmail(copySelfOnEmails.getValue()); p.changesPerPage(getListBox(maximumPageSize, DEFAULT_PAGESIZE)); p.dateFormat(getListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, @@ -355,6 +370,8 @@ public class MyPreferencesScreen extends SettingsScreen { p.diffView(getListBox(diffView, AccountGeneralPreferences.DiffView.SIDE_BY_SIDE, AccountGeneralPreferences.DiffView.values())); + p.emailStrategy(getListBox(emailStrategy, + EmailStrategy.ENABLED, EmailStrategy.values())); List items = new ArrayList<>(); for (List v : myMenus.getValues()) { diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java index 2e335759de..83a6ca8e90 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java @@ -76,6 +76,12 @@ public final class AccountGeneralPreferences { UNIFIED_DIFF } + public static enum EmailStrategy { + ENABLED, + CC_ON_OWN_COMMENTS, + DISABLED + } + public static enum TimeFormat { /** 12-hour clock: 1:15 am, 2:13 pm */ HHMM_12("h:mm a"), @@ -120,9 +126,7 @@ public final class AccountGeneralPreferences { @Column(id = 6, length = 20, notNull = false) protected String downloadCommand; - /** If true we CC the user on their own changes. */ - @Column(id = 7) - protected boolean copySelfOnEmail; + // DELETED: id = 7 (copySelfOnEmail) @Column(id = 8, length = 10, notNull = false) protected String dateFormat; @@ -155,6 +159,9 @@ public final class AccountGeneralPreferences { @Column(id = 19) protected boolean muteCommonPathPrefixes; + @Column(id = 20, length = 30, notNull = false) + protected String emailStrategy; + public AccountGeneralPreferences() { } @@ -242,14 +249,6 @@ public final class AccountGeneralPreferences { } } - public boolean isCopySelfOnEmails() { - return copySelfOnEmail; - } - - public void setCopySelfOnEmails(boolean includeSelfOnEmail) { - copySelfOnEmail = includeSelfOnEmail; - } - public boolean isShowInfoInReviewCategory() { return getReviewCategoryStrategy() != ReviewCategoryStrategy.NONE; } @@ -307,6 +306,17 @@ public final class AccountGeneralPreferences { this.diffView = diffView.name(); } + public EmailStrategy getEmailStrategy() { + if (emailStrategy == null) { + return EmailStrategy.ENABLED; + } + return EmailStrategy.valueOf(emailStrategy); + } + + public void setEmailStrategy(EmailStrategy strategy) { + this.emailStrategy = strategy.name(); + } + public boolean isSizeBarInChangeTable() { return sizeBarInChangeTable; } @@ -336,7 +346,6 @@ public final class AccountGeneralPreferences { maximumPageSize = DEFAULT_PAGESIZE; showSiteHeader = true; useFlashClipboard = true; - copySelfOnEmail = false; reviewCategoryStrategy = null; downloadUrl = null; downloadCommand = null; @@ -347,5 +356,6 @@ public final class AccountGeneralPreferences { sizeBarInChangeTable = true; legacycidInChangeTable = false; muteCommonPathPrefixes = true; + emailStrategy = null; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java index 08bf83e06d..1ab892839c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java @@ -24,6 +24,7 @@ import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.EmailStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -104,7 +105,6 @@ public class GetPreferences implements RestReadView { Boolean useFlashClipboard; String downloadScheme; DownloadCommand downloadCommand; - Boolean copySelfOnEmail; DateFormat dateFormat; TimeFormat timeFormat; Boolean relativeDateInChangeTable; @@ -113,6 +113,7 @@ public class GetPreferences implements RestReadView { Boolean muteCommonPathPrefixes; ReviewCategoryStrategy reviewCategoryStrategy; DiffView diffView; + EmailStrategy emailStrategy; List my; Map urlAliases; @@ -124,7 +125,6 @@ public class GetPreferences implements RestReadView { useFlashClipboard = p.isUseFlashClipboard() ? true : null; downloadScheme = p.getDownloadUrl(); downloadCommand = p.getDownloadCommand(); - copySelfOnEmail = p.isCopySelfOnEmails() ? true : null; dateFormat = p.getDateFormat(); timeFormat = p.getTimeFormat(); relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null; @@ -133,6 +133,7 @@ public class GetPreferences implements RestReadView { muteCommonPathPrefixes = p.isMuteCommonPathPrefixes() ? true : null; reviewCategoryStrategy = p.getReviewCategoryStrategy(); diffView = p.getDiffView(); + emailStrategy = p.getEmailStrategy(); } loadFromAllUsers(v, allUsers); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java index 569d128014..70420767a4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java @@ -34,6 +34,7 @@ import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.EmailStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -64,7 +65,6 @@ public class SetPreferences implements RestModifyView { public Boolean useFlashClipboard; public String downloadScheme; public DownloadCommand downloadCommand; - public Boolean copySelfOnEmail; public DateFormat dateFormat; public TimeFormat timeFormat; public Boolean relativeDateInChangeTable; @@ -73,6 +73,7 @@ public class SetPreferences implements RestModifyView { public Boolean muteCommonPathPrefixes; public ReviewCategoryStrategy reviewCategoryStrategy; public DiffView diffView; + public EmailStrategy emailStrategy; public List my; public Map urlAliases; } @@ -146,9 +147,6 @@ public class SetPreferences implements RestModifyView { if (i.downloadCommand != null) { p.setDownloadCommand(i.downloadCommand); } - if (i.copySelfOnEmail != null) { - p.setCopySelfOnEmails(i.copySelfOnEmail); - } if (i.dateFormat != null) { p.setDateFormat(i.dateFormat); } @@ -173,6 +171,9 @@ public class SetPreferences implements RestModifyView { if (i.diffView != null) { p.setDiffView(i.diffView); } + if (i.emailStrategy != null) { + p.setEmailStrategy(i.emailStrategy); + } db.get().accounts().update(Collections.singleton(a)); db.get().commit(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java index 519a4a4cbb..d6693aee7d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java @@ -48,13 +48,14 @@ public class SetPreferences implements RestModifyView { IOException, ConfigInvalidException { if (i.changesPerPage != null || i.showSiteHeader != null || i.useFlashClipboard != null || i.downloadScheme != null - || i.downloadCommand != null || i.copySelfOnEmail != null + || i.downloadCommand != null || i.dateFormat != null || i.timeFormat != null || i.relativeDateInChangeTable != null || i.sizeBarInChangeTable != null || i.legacycidInChangeTable != null || i.muteCommonPathPrefixes != null - || i.reviewCategoryStrategy != null) { + || i.reviewCategoryStrategy != null + || i.emailStrategy != null) { throw new BadRequestException("unsupported option"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java index 7dd51fe78b..5222544283 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java @@ -19,6 +19,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.collect.Sets; import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.EmailStrategy; import com.google.gerrit.reviewdb.client.UserIdentity; import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.mail.EmailHeader.AddressList; @@ -95,28 +96,29 @@ public abstract class OutgoingEmail { if (shouldSendMessage()) { if (fromId != null) { final Account fromUser = args.accountCache.get(fromId).getAccount(); + EmailStrategy strategy = + fromUser.getGeneralPreferences().getEmailStrategy(); - if (fromUser.getGeneralPreferences().isCopySelfOnEmails()) { + if (strategy == EmailStrategy.CC_ON_OWN_COMMENTS) { // If we are impersonating a user, make sure they receive a CC of // this message so they can always review and audit what we sent // on their behalf to others. // add(RecipientType.CC, fromId); - } else if (rcptTo.remove(fromId)) { // If they don't want a copy, but we queued one up anyway, // drop them from the recipient lists. // - final String fromEmail = fromUser.getPreferredEmail(); - for (Iterator
i = smtpRcptTo.iterator(); i.hasNext();) { - if (i.next().email.equals(fromEmail)) { - i.remove(); - } - } - for (EmailHeader hdr : headers.values()) { - if (hdr instanceof AddressList) { - ((AddressList) hdr).remove(fromEmail); - } + removeUser(fromUser); + } + + // Check the preferences of all recipients. If any user has disabled + // his email notifications then drop him from recipients' list + for (Account.Id id : rcptTo) { + Account thisUser = args.accountCache.get(id).getAccount(); + if (thisUser.getGeneralPreferences().getEmailStrategy() + == EmailStrategy.DISABLED) { + removeUser(thisUser); } if (smtpRcptTo.isEmpty()) { @@ -476,6 +478,20 @@ public abstract class OutgoingEmail { return r.toString(); } + private void removeUser(Account user) { + String fromEmail = user.getPreferredEmail(); + for (Iterator
j = smtpRcptTo.iterator(); j.hasNext();) { + if (j.next().email.equals(fromEmail)) { + j.remove(); + } + } + for (EmailHeader hdr : headers.values()) { + if (hdr instanceof AddressList) { + ((AddressList) hdr).remove(fromEmail); + } + } + } + private static String safeToString(Object obj) { return obj != null ? obj.toString() : ""; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java index 27df9a5c9e..78646a0c95 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java @@ -32,7 +32,7 @@ import java.util.List; /** A version of the database schema. */ public abstract class SchemaVersion { /** The current schema version. */ - public static final Class C = Schema_115.class; + public static final Class C = Schema_116.class; public static int getBinaryVersion() { return guessVersion(C); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_116.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_116.java new file mode 100644 index 0000000000..c7c2a5919b --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_116.java @@ -0,0 +1,43 @@ +// Copyright (C) 2014 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.schema; + +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gwtorm.jdbc.JdbcSchema; +import com.google.inject.Inject; +import com.google.inject.Provider; + +import java.sql.SQLException; +import java.sql.Statement; + +public class Schema_116 extends SchemaVersion { + @Inject + Schema_116(Provider prior) { + super(prior); + } + + @Override + protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException { + ui.message("Migrate user preference copySelfOnEmail to emailStrategy"); + try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement()) { + stmt.executeUpdate("UPDATE accounts SET " + + "EMAIL_STRATEGY='ENABLED' " + + "WHERE (COPY_SELF_ON_EMAIL='N')"); + stmt.executeUpdate("UPDATE accounts SET " + + "EMAIL_STRATEGY='CC_ON_OWN_COMMENTS' " + + "WHERE (COPY_SELF_ON_EMAIL='Y')"); + } + } +}