From afbaebde11093fae8b420aaaf71dcd56d8c0f9fd Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 05 Jun 2014 10:24:39 -0400
Subject: [PATCH] Add "email me on my ticket changes" preference

---
 src/main/java/com/gitblit/wicket/pages/UserPage.html      |    3 ++-
 src/main/java/com/gitblit/ConfigUserService.java          |    4 ++++
 src/main/java/com/gitblit/wicket/pages/UserPage.java      |    9 +++++++++
 src/main/java/com/gitblit/wicket/GitBlitWebApp.properties |    2 ++
 src/main/java/com/gitblit/models/UserPreferences.java     |   13 +++++++++++++
 src/main/java/com/gitblit/tickets/TicketNotifier.java     |   11 +++++++++--
 6 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/gitblit/ConfigUserService.java b/src/main/java/com/gitblit/ConfigUserService.java
index b5dfde3..9759eff 100644
--- a/src/main/java/com/gitblit/ConfigUserService.java
+++ b/src/main/java/com/gitblit/ConfigUserService.java
@@ -96,6 +96,8 @@
 
 	private static final String LOCALE = "locale";
 
+	private static final String EMAILONMYTICKETCHANGES = "emailMeOnMyTicketChanges";
+
 	private static final String ACCOUNTTYPE = "accountType";
 
 	private static final String DISABLED = "disabled";
@@ -711,6 +713,7 @@
 					String val = model.getPreferences().getLocale().getLanguage() + "_" + model.getPreferences().getLocale().getCountry();
 					config.setString(USER, model.username, LOCALE, val);
 				}
+				config.setBoolean(USER, model.username, EMAILONMYTICKETCHANGES, model.getPreferences().isEmailMeOnMyTicketChanges());
 			}
 
 			// user roles
@@ -887,6 +890,7 @@
 
 					// preferences
 					user.getPreferences().setLocale(config.getString(USER, username, LOCALE));
+					user.getPreferences().setEmailMeOnMyTicketChanges(config.getBoolean(USER, username, EMAILONMYTICKETCHANGES, true));
 
 					// user roles
 					Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList(
diff --git a/src/main/java/com/gitblit/models/UserPreferences.java b/src/main/java/com/gitblit/models/UserPreferences.java
index 61db353..c95b0da 100644
--- a/src/main/java/com/gitblit/models/UserPreferences.java
+++ b/src/main/java/com/gitblit/models/UserPreferences.java
@@ -39,6 +39,8 @@
 
 	private String locale;
 
+	private Boolean emailMeOnMyTicketChanges;
+
 	private final Map<String, UserRepositoryPreferences> repositoryPreferences = new TreeMap<String, UserRepositoryPreferences>();
 
 	public UserPreferences(String username) {
@@ -100,4 +102,15 @@
 		Collections.sort(list);
 		return list;
 	}
+
+	public boolean isEmailMeOnMyTicketChanges() {
+		if (emailMeOnMyTicketChanges == null) {
+			return true;
+		}
+		return emailMeOnMyTicketChanges;
+	}
+
+	public void setEmailMeOnMyTicketChanges(boolean value) {
+		this.emailMeOnMyTicketChanges = value;
+	}
 }
diff --git a/src/main/java/com/gitblit/tickets/TicketNotifier.java b/src/main/java/com/gitblit/tickets/TicketNotifier.java
index 9a5e4e1..07371b1 100644
--- a/src/main/java/com/gitblit/tickets/TicketNotifier.java
+++ b/src/main/java/com/gitblit/tickets/TicketNotifier.java
@@ -545,7 +545,6 @@
 				}
 			}
 		}
-		mailing.setRecipients(toAddresses);
 
 		//
 		// CC recipients
@@ -554,7 +553,7 @@
 
 		// repository owners
 		if (!ArrayUtils.isEmpty(repository.owners)) {
-			tos.addAll(repository.owners);
+			ccs.addAll(repository.owners);
 		}
 
 		// cc users mentioned in last comment
@@ -595,6 +594,14 @@
 		}
 		ccAddresses.addAll(settings.getStrings(Keys.mail.mailingLists));
 
+		// respect the author's email preference
+		UserModel lastAuthor = userManager.getUserModel(lastChange.author);
+		if (!lastAuthor.getPreferences().isEmailMeOnMyTicketChanges()) {
+			toAddresses.remove(lastAuthor.emailAddress);
+			ccAddresses.remove(lastAuthor.emailAddress);
+		}
+
+		mailing.setRecipients(toAddresses);
 		mailing.setCCs(ccAddresses);
 	}
 
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index 90d30f2..c80d45c 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -728,6 +728,8 @@
 gb.accountPreferencesDescription = Specify your account preferences
 gb.languagePreference = Language Preference
 gb.languagePreferenceDescription = Select your preferred translation for Gitblit
+gb.emailMeOnMyTicketChanges = Email me on my ticket changes
+gb.emailMeOnMyTicketChangesDescription  = Send me an email notification for changes that I make to a ticket
 gb.displayNameDescription = The preferred name for display
 gb.emailAddressDescription = The primary email address for receiving notifications
 gb.sshKeys = SSH Keys
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.html b/src/main/java/com/gitblit/wicket/pages/UserPage.html
index d71cb2b..017fcb1 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.html
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.html
@@ -64,7 +64,8 @@
 		<form wicket:id="prefsForm">
 			<div wicket:id="displayName"></div>
 			<div wicket:id="emailAddress"></div>
-			<div wicket:id="language"></div>	
+			<div wicket:id="language"></div>
+			<div wicket:id="emailMeOnMyTicketChanges"></div>
 			
 			<div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /></div>
 		</form>	
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index 9404896..505f55d 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -48,6 +48,7 @@
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.GitblitRedirectException;
 import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.BooleanOption;
 import com.gitblit.wicket.panels.ChoiceOption;
 import com.gitblit.wicket.panels.ProjectRepositoryPanel;
 import com.gitblit.wicket.panels.SshKeysPanel;
@@ -219,6 +220,7 @@
 		final IModel<String> displayName = Model.of(user.getDisplayName());
 		final IModel<String> emailAddress = Model.of(user.emailAddress == null ? "" : user.emailAddress);
 		final IModel<Language> language = Model.of(preferredLanguage);
+		final IModel<Boolean> emailMeOnMyTicketChanges = Model.of(user.getPreferences().isEmailMeOnMyTicketChanges());
 
 		prefs.add(new TextOption("displayName",
 				getString("gb.displayName"),
@@ -236,6 +238,11 @@
 				language,
 				languages));
 
+		prefs.add(new BooleanOption("emailMeOnMyTicketChanges",
+				getString("gb.emailMeOnMyTicketChanges"),
+				getString("gb.emailMeOnMyTicketChangesDescription"),
+				emailMeOnMyTicketChanges).setVisible(app().notifier().isSendingMail()));
+
 		prefs.add(new AjaxButton("save") {
 
 			private static final long serialVersionUID = 1L;
@@ -253,6 +260,8 @@
 					user.getPreferences().setLocale(lang.code);
 				}
 
+				user.getPreferences().setEmailMeOnMyTicketChanges(emailMeOnMyTicketChanges.getObject());
+
 				try {
 					app().gitblit().reviseUser(user.username, user);
 

--
Gitblit v1.9.1