Merge "Add a dropdown to control email notifications on user preference page"

This commit is contained in:
David Pursehouse
2015-12-08 07:46:07 +00:00
committed by Gerrit Code Review
12 changed files with 165 additions and 53 deletions

View File

@@ -1947,6 +1947,12 @@ link:rest-api-config.html#top-menu-item-info[TopMenuItemInfo] entities.
|`url_aliases` |optional| |`url_aliases` |optional|
A map of URL path pairs, where the first URL path is an alias for the A map of URL path pairs, where the first URL path is an alias for the
second URL path. 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]] [[preferences-input]]

View File

@@ -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.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; 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.ReviewCategoryStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JavaScriptObject;
@@ -44,7 +45,6 @@ public class AccountPreferencesInfo extends JavaScriptObject {
p.useFlashClipboard(defaultPrefs.isUseFlashClipboard()); p.useFlashClipboard(defaultPrefs.isUseFlashClipboard());
p.downloadScheme(defaultPrefs.getDownloadUrl()); p.downloadScheme(defaultPrefs.getDownloadUrl());
p.downloadCommand(defaultPrefs.getDownloadCommand()); p.downloadCommand(defaultPrefs.getDownloadCommand());
p.copySelfOnEmail(defaultPrefs.isCopySelfOnEmails());
p.dateFormat(defaultPrefs.getDateFormat()); p.dateFormat(defaultPrefs.getDateFormat());
p.timeFormat(defaultPrefs.getTimeFormat()); p.timeFormat(defaultPrefs.getTimeFormat());
p.relativeDateInChangeTable(defaultPrefs.isRelativeDateInChangeTable()); p.relativeDateInChangeTable(defaultPrefs.isRelativeDateInChangeTable());
@@ -53,6 +53,7 @@ public class AccountPreferencesInfo extends JavaScriptObject {
p.muteCommonPathPrefixes(defaultPrefs.isMuteCommonPathPrefixes()); p.muteCommonPathPrefixes(defaultPrefs.isMuteCommonPathPrefixes());
p.reviewCategoryStrategy(defaultPrefs.getReviewCategoryStrategy()); p.reviewCategoryStrategy(defaultPrefs.getReviewCategoryStrategy());
p.diffView(defaultPrefs.getDiffView()); p.diffView(defaultPrefs.getDiffView());
p.emailStrategy(defaultPrefs.getEmailStrategy());
return p; return p;
} }
@@ -82,9 +83,6 @@ public class AccountPreferencesInfo extends JavaScriptObject {
private final native String downloadCommandRaw() private final native String downloadCommandRaw()
/*-{ return this.download_command }-*/; /*-{ return this.download_command }-*/;
public final native boolean copySelfOnEmail()
/*-{ return this.copy_self_on_email || false }-*/;
public final DateFormat dateFormat() { public final DateFormat dateFormat() {
String s = dateFormatRaw(); String s = dateFormatRaw();
return s != null ? DateFormat.valueOf(s) : null; return s != null ? DateFormat.valueOf(s) : null;
@@ -125,6 +123,14 @@ public class AccountPreferencesInfo extends JavaScriptObject {
private final native String diffViewRaw() private final native String diffViewRaw()
/*-{ return this.diff_view }-*/; /*-{ 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<TopMenuItem> my() public final native JsArray<TopMenuItem> my()
/*-{ return this.my; }-*/; /*-{ return this.my; }-*/;
@@ -146,9 +152,6 @@ public class AccountPreferencesInfo extends JavaScriptObject {
public final native void downloadCommandRaw(String d) public final native void downloadCommandRaw(String d)
/*-{ this.download_command = d }-*/; /*-{ this.download_command = d }-*/;
public final native void copySelfOnEmail(boolean c)
/*-{ this.copy_self_on_email = c }-*/;
public final void dateFormat(DateFormat f) { public final void dateFormat(DateFormat f) {
dateFormatRaw(f != null ? f.toString() : null); dateFormatRaw(f != null ? f.toString() : null);
} }
@@ -185,6 +188,12 @@ public class AccountPreferencesInfo extends JavaScriptObject {
private final native void diffViewRaw(String d) private final native void diffViewRaw(String d)
/*-{ this.diff_view = 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<TopMenuItem> myMenus) { public final void setMyMenus(List<TopMenuItem> myMenus) {
initMy(); initMy();
for (TopMenuItem n : myMenus) { for (TopMenuItem n : myMenus) {

View File

@@ -31,7 +31,6 @@ public interface AccountConstants extends Constants {
String contextWholeFile(); String contextWholeFile();
String showSiteHeader(); String showSiteHeader();
String useFlashClipboard(); String useFlashClipboard();
String copySelfOnEmails();
String reviewCategoryLabel(); String reviewCategoryLabel();
String messageShowInReviewCategoryNone(); String messageShowInReviewCategoryNone();
String messageShowInReviewCategoryName(); String messageShowInReviewCategoryName();
@@ -159,4 +158,9 @@ public interface AccountConstants extends Constants {
String welcomeAgreementText(); String welcomeAgreementText();
String welcomeAgreementLater(); String welcomeAgreementLater();
String welcomeContinue(); String welcomeContinue();
String messageEnabled();
String messageCCMeOnMyComments();
String messageDisabled();
String emailFieldLabel();
} }

View File

@@ -7,7 +7,6 @@ registeredOn = Registered
accountId = Account ID accountId = Account ID
showSiteHeader = Show Site Header showSiteHeader = Show Site Header
useFlashClipboard = Use Flash Clipboard Widget useFlashClipboard = Use Flash Clipboard Widget
copySelfOnEmails = CC Me On Comments I Write
reviewCategoryLabel = Display In Review Category reviewCategoryLabel = Display In Review Category
messageShowInReviewCategoryNone = None (default) messageShowInReviewCategoryNone = None (default)
messageShowInReviewCategoryName = Show Name messageShowInReviewCategoryName = Show Name
@@ -15,6 +14,11 @@ messageShowInReviewCategoryEmail = Show Email
messageShowInReviewCategoryUsername = Show Username messageShowInReviewCategoryUsername = Show Username
messageShowInReviewCategoryAbbrev = Show Abbreviated Name messageShowInReviewCategoryAbbrev = Show Abbreviated Name
emailFieldLabel = Email Notifications:
messageEnabled = Enabled
messageCCMeOnMyComments = CC Me On Comments I Write
messageDisabled = Disabled
maximumPageSizeFieldLabel = Maximum Page Size: maximumPageSizeFieldLabel = Maximum Page Size:
diffViewLabel = Diff View: diffViewLabel = Diff View:
dateFormatLabel = Date/Time Format: dateFormatLabel = Date/Time Format:

View File

@@ -29,6 +29,7 @@ import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.ScreenLoadCallback; import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.OnEditEnabler; import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; 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.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy;
import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
@@ -50,7 +51,6 @@ import java.util.List;
public class MyPreferencesScreen extends SettingsScreen { public class MyPreferencesScreen extends SettingsScreen {
private CheckBox showSiteHeader; private CheckBox showSiteHeader;
private CheckBox useFlashClipboard; private CheckBox useFlashClipboard;
private CheckBox copySelfOnEmails;
private CheckBox relativeDateInChangeTable; private CheckBox relativeDateInChangeTable;
private CheckBox sizeBarInChangeTable; private CheckBox sizeBarInChangeTable;
private CheckBox legacycidInChangeTable; private CheckBox legacycidInChangeTable;
@@ -60,6 +60,7 @@ public class MyPreferencesScreen extends SettingsScreen {
private ListBox timeFormat; private ListBox timeFormat;
private ListBox reviewCategoryStrategy; private ListBox reviewCategoryStrategy;
private ListBox diffView; private ListBox diffView;
private ListBox emailStrategy;
private StringListPanel myMenus; private StringListPanel myMenus;
private Button save; private Button save;
@@ -69,7 +70,6 @@ public class MyPreferencesScreen extends SettingsScreen {
showSiteHeader = new CheckBox(Util.C.showSiteHeader()); showSiteHeader = new CheckBox(Util.C.showSiteHeader());
useFlashClipboard = new CheckBox(Util.C.useFlashClipboard()); useFlashClipboard = new CheckBox(Util.C.useFlashClipboard());
copySelfOnEmails = new CheckBox(Util.C.copySelfOnEmails());
maximumPageSize = new ListBox(); maximumPageSize = new ListBox();
for (final short v : PAGESIZE_CHOICES) { for (final short v : PAGESIZE_CHOICES) {
maximumPageSize.addItem(Util.M.rowsPerPage(v), String.valueOf(v)); maximumPageSize.addItem(Util.M.rowsPerPage(v), String.valueOf(v));
@@ -92,6 +92,20 @@ public class MyPreferencesScreen extends SettingsScreen {
Util.C.messageShowInReviewCategoryAbbrev(), Util.C.messageShowInReviewCategoryAbbrev(),
AccountGeneralPreferences.ReviewCategoryStrategy.ABBREV.name()); 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 = new ListBox();
diffView.addItem( diffView.addItem(
com.google.gerrit.client.changes.Util.C.sideBySide(), com.google.gerrit.client.changes.Util.C.sideBySide(),
@@ -141,7 +155,7 @@ public class MyPreferencesScreen extends SettingsScreen {
muteCommonPathPrefixes = new CheckBox(Util.C.muteCommonPathPrefixes()); muteCommonPathPrefixes = new CheckBox(Util.C.muteCommonPathPrefixes());
boolean flashClippy = !UserAgent.hasJavaScriptClipboard() && UserAgent.Flash.isInstalled(); 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; int row = 0;
formGrid.setText(row, labelIdx, ""); formGrid.setText(row, labelIdx, "");
@@ -154,10 +168,6 @@ public class MyPreferencesScreen extends SettingsScreen {
row++; row++;
} }
formGrid.setText(row, labelIdx, "");
formGrid.setWidget(row, fieldIdx, copySelfOnEmails);
row++;
formGrid.setText(row, labelIdx, Util.C.reviewCategoryLabel()); formGrid.setText(row, labelIdx, Util.C.reviewCategoryLabel());
formGrid.setWidget(row, fieldIdx, reviewCategoryStrategy); formGrid.setWidget(row, fieldIdx, reviewCategoryStrategy);
row++; row++;
@@ -186,6 +196,10 @@ public class MyPreferencesScreen extends SettingsScreen {
formGrid.setWidget(row, fieldIdx, muteCommonPathPrefixes); formGrid.setWidget(row, fieldIdx, muteCommonPathPrefixes);
row++; row++;
formGrid.setText(row, labelIdx, Util.C.emailFieldLabel());
formGrid.setWidget(row, fieldIdx, emailStrategy);
row++;
formGrid.setText(row, labelIdx, Util.C.diffViewLabel()); formGrid.setText(row, labelIdx, Util.C.diffViewLabel());
formGrid.setWidget(row, fieldIdx, diffView); formGrid.setWidget(row, fieldIdx, diffView);
@@ -208,7 +222,6 @@ public class MyPreferencesScreen extends SettingsScreen {
final OnEditEnabler e = new OnEditEnabler(save); final OnEditEnabler e = new OnEditEnabler(save);
e.listenTo(showSiteHeader); e.listenTo(showSiteHeader);
e.listenTo(useFlashClipboard); e.listenTo(useFlashClipboard);
e.listenTo(copySelfOnEmails);
e.listenTo(maximumPageSize); e.listenTo(maximumPageSize);
e.listenTo(dateFormat); e.listenTo(dateFormat);
e.listenTo(timeFormat); e.listenTo(timeFormat);
@@ -218,6 +231,7 @@ public class MyPreferencesScreen extends SettingsScreen {
e.listenTo(muteCommonPathPrefixes); e.listenTo(muteCommonPathPrefixes);
e.listenTo(diffView); e.listenTo(diffView);
e.listenTo(reviewCategoryStrategy); e.listenTo(reviewCategoryStrategy);
e.listenTo(emailStrategy);
} }
@Override @Override
@@ -240,7 +254,6 @@ public class MyPreferencesScreen extends SettingsScreen {
private void enable(final boolean on) { private void enable(final boolean on) {
showSiteHeader.setEnabled(on); showSiteHeader.setEnabled(on);
useFlashClipboard.setEnabled(on); useFlashClipboard.setEnabled(on);
copySelfOnEmails.setEnabled(on);
maximumPageSize.setEnabled(on); maximumPageSize.setEnabled(on);
dateFormat.setEnabled(on); dateFormat.setEnabled(on);
timeFormat.setEnabled(on); timeFormat.setEnabled(on);
@@ -250,12 +263,12 @@ public class MyPreferencesScreen extends SettingsScreen {
muteCommonPathPrefixes.setEnabled(on); muteCommonPathPrefixes.setEnabled(on);
reviewCategoryStrategy.setEnabled(on); reviewCategoryStrategy.setEnabled(on);
diffView.setEnabled(on); diffView.setEnabled(on);
emailStrategy.setEnabled(on);
} }
private void display(AccountPreferencesInfo p) { private void display(AccountPreferencesInfo p) {
showSiteHeader.setValue(p.showSiteHeader()); showSiteHeader.setValue(p.showSiteHeader());
useFlashClipboard.setValue(p.useFlashClipboard()); useFlashClipboard.setValue(p.useFlashClipboard());
copySelfOnEmails.setValue(p.copySelfOnEmail());
setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage()); setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage());
setListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, // setListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, //
p.dateFormat()); p.dateFormat());
@@ -271,6 +284,9 @@ public class MyPreferencesScreen extends SettingsScreen {
setListBox(diffView, setListBox(diffView,
AccountGeneralPreferences.DiffView.SIDE_BY_SIDE, AccountGeneralPreferences.DiffView.SIDE_BY_SIDE,
p.diffView()); p.diffView());
setListBox(emailStrategy,
AccountGeneralPreferences.EmailStrategy.ENABLED,
p.emailStrategy());
display(p.my()); display(p.my());
} }
@@ -337,7 +353,6 @@ public class MyPreferencesScreen extends SettingsScreen {
AccountPreferencesInfo p = AccountPreferencesInfo.create(); AccountPreferencesInfo p = AccountPreferencesInfo.create();
p.showSiteHeader(showSiteHeader.getValue()); p.showSiteHeader(showSiteHeader.getValue());
p.useFlashClipboard(useFlashClipboard.getValue()); p.useFlashClipboard(useFlashClipboard.getValue());
p.copySelfOnEmail(copySelfOnEmails.getValue());
p.changesPerPage(getListBox(maximumPageSize, DEFAULT_PAGESIZE)); p.changesPerPage(getListBox(maximumPageSize, DEFAULT_PAGESIZE));
p.dateFormat(getListBox(dateFormat, p.dateFormat(getListBox(dateFormat,
AccountGeneralPreferences.DateFormat.STD, AccountGeneralPreferences.DateFormat.STD,
@@ -355,6 +370,8 @@ public class MyPreferencesScreen extends SettingsScreen {
p.diffView(getListBox(diffView, p.diffView(getListBox(diffView,
AccountGeneralPreferences.DiffView.SIDE_BY_SIDE, AccountGeneralPreferences.DiffView.SIDE_BY_SIDE,
AccountGeneralPreferences.DiffView.values())); AccountGeneralPreferences.DiffView.values()));
p.emailStrategy(getListBox(emailStrategy,
EmailStrategy.ENABLED, EmailStrategy.values()));
List<TopMenuItem> items = new ArrayList<>(); List<TopMenuItem> items = new ArrayList<>();
for (List<String> v : myMenus.getValues()) { for (List<String> v : myMenus.getValues()) {

View File

@@ -76,6 +76,12 @@ public final class AccountGeneralPreferences {
UNIFIED_DIFF UNIFIED_DIFF
} }
public static enum EmailStrategy {
ENABLED,
CC_ON_OWN_COMMENTS,
DISABLED
}
public static enum TimeFormat { public static enum TimeFormat {
/** 12-hour clock: 1:15 am, 2:13 pm */ /** 12-hour clock: 1:15 am, 2:13 pm */
HHMM_12("h:mm a"), HHMM_12("h:mm a"),
@@ -120,9 +126,7 @@ public final class AccountGeneralPreferences {
@Column(id = 6, length = 20, notNull = false) @Column(id = 6, length = 20, notNull = false)
protected String downloadCommand; protected String downloadCommand;
/** If true we CC the user on their own changes. */ // DELETED: id = 7 (copySelfOnEmail)
@Column(id = 7)
protected boolean copySelfOnEmail;
@Column(id = 8, length = 10, notNull = false) @Column(id = 8, length = 10, notNull = false)
protected String dateFormat; protected String dateFormat;
@@ -155,6 +159,9 @@ public final class AccountGeneralPreferences {
@Column(id = 19) @Column(id = 19)
protected boolean muteCommonPathPrefixes; protected boolean muteCommonPathPrefixes;
@Column(id = 20, length = 30, notNull = false)
protected String emailStrategy;
public AccountGeneralPreferences() { 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() { public boolean isShowInfoInReviewCategory() {
return getReviewCategoryStrategy() != ReviewCategoryStrategy.NONE; return getReviewCategoryStrategy() != ReviewCategoryStrategy.NONE;
} }
@@ -307,6 +306,17 @@ public final class AccountGeneralPreferences {
this.diffView = diffView.name(); 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() { public boolean isSizeBarInChangeTable() {
return sizeBarInChangeTable; return sizeBarInChangeTable;
} }
@@ -336,7 +346,6 @@ public final class AccountGeneralPreferences {
maximumPageSize = DEFAULT_PAGESIZE; maximumPageSize = DEFAULT_PAGESIZE;
showSiteHeader = true; showSiteHeader = true;
useFlashClipboard = true; useFlashClipboard = true;
copySelfOnEmail = false;
reviewCategoryStrategy = null; reviewCategoryStrategy = null;
downloadUrl = null; downloadUrl = null;
downloadCommand = null; downloadCommand = null;
@@ -347,5 +356,6 @@ public final class AccountGeneralPreferences {
sizeBarInChangeTable = true; sizeBarInChangeTable = true;
legacycidInChangeTable = false; legacycidInChangeTable = false;
muteCommonPathPrefixes = true; muteCommonPathPrefixes = true;
emailStrategy = null;
} }
} }

View File

@@ -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.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; 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.ReviewCategoryStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -104,7 +105,6 @@ public class GetPreferences implements RestReadView<AccountResource> {
Boolean useFlashClipboard; Boolean useFlashClipboard;
String downloadScheme; String downloadScheme;
DownloadCommand downloadCommand; DownloadCommand downloadCommand;
Boolean copySelfOnEmail;
DateFormat dateFormat; DateFormat dateFormat;
TimeFormat timeFormat; TimeFormat timeFormat;
Boolean relativeDateInChangeTable; Boolean relativeDateInChangeTable;
@@ -113,6 +113,7 @@ public class GetPreferences implements RestReadView<AccountResource> {
Boolean muteCommonPathPrefixes; Boolean muteCommonPathPrefixes;
ReviewCategoryStrategy reviewCategoryStrategy; ReviewCategoryStrategy reviewCategoryStrategy;
DiffView diffView; DiffView diffView;
EmailStrategy emailStrategy;
List<TopMenu.MenuItem> my; List<TopMenu.MenuItem> my;
Map<String, String> urlAliases; Map<String, String> urlAliases;
@@ -124,7 +125,6 @@ public class GetPreferences implements RestReadView<AccountResource> {
useFlashClipboard = p.isUseFlashClipboard() ? true : null; useFlashClipboard = p.isUseFlashClipboard() ? true : null;
downloadScheme = p.getDownloadUrl(); downloadScheme = p.getDownloadUrl();
downloadCommand = p.getDownloadCommand(); downloadCommand = p.getDownloadCommand();
copySelfOnEmail = p.isCopySelfOnEmails() ? true : null;
dateFormat = p.getDateFormat(); dateFormat = p.getDateFormat();
timeFormat = p.getTimeFormat(); timeFormat = p.getTimeFormat();
relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null; relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null;
@@ -133,6 +133,7 @@ public class GetPreferences implements RestReadView<AccountResource> {
muteCommonPathPrefixes = p.isMuteCommonPathPrefixes() ? true : null; muteCommonPathPrefixes = p.isMuteCommonPathPrefixes() ? true : null;
reviewCategoryStrategy = p.getReviewCategoryStrategy(); reviewCategoryStrategy = p.getReviewCategoryStrategy();
diffView = p.getDiffView(); diffView = p.getDiffView();
emailStrategy = p.getEmailStrategy();
} }
loadFromAllUsers(v, allUsers); loadFromAllUsers(v, allUsers);
} }

View File

@@ -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.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; 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.ReviewCategoryStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -64,7 +65,6 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
public Boolean useFlashClipboard; public Boolean useFlashClipboard;
public String downloadScheme; public String downloadScheme;
public DownloadCommand downloadCommand; public DownloadCommand downloadCommand;
public Boolean copySelfOnEmail;
public DateFormat dateFormat; public DateFormat dateFormat;
public TimeFormat timeFormat; public TimeFormat timeFormat;
public Boolean relativeDateInChangeTable; public Boolean relativeDateInChangeTable;
@@ -73,6 +73,7 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
public Boolean muteCommonPathPrefixes; public Boolean muteCommonPathPrefixes;
public ReviewCategoryStrategy reviewCategoryStrategy; public ReviewCategoryStrategy reviewCategoryStrategy;
public DiffView diffView; public DiffView diffView;
public EmailStrategy emailStrategy;
public List<TopMenu.MenuItem> my; public List<TopMenu.MenuItem> my;
public Map<String, String> urlAliases; public Map<String, String> urlAliases;
} }
@@ -146,9 +147,6 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
if (i.downloadCommand != null) { if (i.downloadCommand != null) {
p.setDownloadCommand(i.downloadCommand); p.setDownloadCommand(i.downloadCommand);
} }
if (i.copySelfOnEmail != null) {
p.setCopySelfOnEmails(i.copySelfOnEmail);
}
if (i.dateFormat != null) { if (i.dateFormat != null) {
p.setDateFormat(i.dateFormat); p.setDateFormat(i.dateFormat);
} }
@@ -173,6 +171,9 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
if (i.diffView != null) { if (i.diffView != null) {
p.setDiffView(i.diffView); p.setDiffView(i.diffView);
} }
if (i.emailStrategy != null) {
p.setEmailStrategy(i.emailStrategy);
}
db.get().accounts().update(Collections.singleton(a)); db.get().accounts().update(Collections.singleton(a));
db.get().commit(); db.get().commit();

View File

@@ -48,13 +48,14 @@ public class SetPreferences implements RestModifyView<ConfigResource, Input> {
IOException, ConfigInvalidException { IOException, ConfigInvalidException {
if (i.changesPerPage != null || i.showSiteHeader != null if (i.changesPerPage != null || i.showSiteHeader != null
|| i.useFlashClipboard != null || i.downloadScheme != null || i.useFlashClipboard != null || i.downloadScheme != null
|| i.downloadCommand != null || i.copySelfOnEmail != null || i.downloadCommand != null
|| i.dateFormat != null || i.timeFormat != null || i.dateFormat != null || i.timeFormat != null
|| i.relativeDateInChangeTable != null || i.relativeDateInChangeTable != null
|| i.sizeBarInChangeTable != null || i.sizeBarInChangeTable != null
|| i.legacycidInChangeTable != null || i.legacycidInChangeTable != null
|| i.muteCommonPathPrefixes != null || i.muteCommonPathPrefixes != null
|| i.reviewCategoryStrategy != null) { || i.reviewCategoryStrategy != null
|| i.emailStrategy != null) {
throw new BadRequestException("unsupported option"); throw new BadRequestException("unsupported option");
} }

View File

@@ -19,6 +19,7 @@ import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Account; 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.reviewdb.client.UserIdentity;
import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.mail.EmailHeader.AddressList; import com.google.gerrit.server.mail.EmailHeader.AddressList;
@@ -95,28 +96,29 @@ public abstract class OutgoingEmail {
if (shouldSendMessage()) { if (shouldSendMessage()) {
if (fromId != null) { if (fromId != null) {
final Account fromUser = args.accountCache.get(fromId).getAccount(); 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 // 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 // this message so they can always review and audit what we sent
// on their behalf to others. // on their behalf to others.
// //
add(RecipientType.CC, fromId); add(RecipientType.CC, fromId);
} else if (rcptTo.remove(fromId)) { } else if (rcptTo.remove(fromId)) {
// If they don't want a copy, but we queued one up anyway, // If they don't want a copy, but we queued one up anyway,
// drop them from the recipient lists. // drop them from the recipient lists.
// //
final String fromEmail = fromUser.getPreferredEmail(); removeUser(fromUser);
for (Iterator<Address> 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);
} }
// 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()) { if (smtpRcptTo.isEmpty()) {
@@ -476,6 +478,20 @@ public abstract class OutgoingEmail {
return r.toString(); return r.toString();
} }
private void removeUser(Account user) {
String fromEmail = user.getPreferredEmail();
for (Iterator<Address> 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) { private static String safeToString(Object obj) {
return obj != null ? obj.toString() : ""; return obj != null ? obj.toString() : "";
} }

View File

@@ -32,7 +32,7 @@ import java.util.List;
/** A version of the database schema. */ /** A version of the database schema. */
public abstract class SchemaVersion { public abstract class SchemaVersion {
/** The current schema version. */ /** The current schema version. */
public static final Class<Schema_115> C = Schema_115.class; public static final Class<Schema_116> C = Schema_116.class;
public static int getBinaryVersion() { public static int getBinaryVersion() {
return guessVersion(C); return guessVersion(C);

View File

@@ -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<Schema_115> 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')");
}
}
}