Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Implement email reasons for admin
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Mar 3, 2015
1 parent e6d4bd7 commit b81c7f0
Show file tree
Hide file tree
Showing 15 changed files with 219 additions and 74 deletions.
Expand Up @@ -78,6 +78,7 @@ public void translatorContactsLanguageTeamCoordinator() throws Exception {

assertThat(content)
.contains("Dear Language Team Coordinator")
.contains("There is no coordinator for")
.as("The email is to the language team coordinator");
assertThat(languagesPage.getNotificationMessage())
.contains("Your message has been sent to the administrator")
Expand Down
96 changes: 96 additions & 0 deletions zanata-war/src/main/java/org/zanata/action/ContactAdminAction.java
@@ -0,0 +1,96 @@
/*
* Copyright 2015, Red Hat, Inc. and individual contributors as indicated by the
* @author tags. See the copyright.txt file in the distribution for a full
* listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
* site: http://www.fsf.org.
*/

package org.zanata.action;

import java.io.Serializable;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.security.management.JpaIdentityStore;
import org.zanata.email.ContactAdminEmailStrategy;
import org.zanata.email.EmailStrategy;
import org.zanata.model.HAccount;
import org.zanata.service.EmailService;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
* Handles send email to admin.
* Need to separate from SendEmailAction as contact admin now pages which has footer.xhtml
*
* @see org.zanata.action.SendEmailAction
*
* @author Alex Eng <a href="mailto:aeng@redhat.com">aeng@redhat.com</a>
*/
@Name("contactAdminAction")
@Scope(ScopeType.PAGE)
@Restrict("#{identity.loggedIn}")
@Slf4j
public class ContactAdminAction implements Serializable {

@In(value = JpaIdentityStore.AUTHENTICATED_USER, required = false)
private HAccount authenticatedAccount;

@In
private EmailService emailServiceImpl;

@Getter
private String replyEmail;

@Getter
@Setter
private String subject;

@Getter
@Setter
private String htmlMessage;

private String fromName;

private String fromLoginName;

@Create
public void onCreate() {
fromName = authenticatedAccount.getPerson().getName();
fromLoginName = authenticatedAccount.getUsername();
replyEmail = authenticatedAccount.getPerson().getEmail();

subject = "";
htmlMessage = "";
}

public void send() {
EmailStrategy strategy = new ContactAdminEmailStrategy(
fromLoginName, fromName, replyEmail, subject, htmlMessage);

String msg = emailServiceImpl.sendToAdmins(strategy, null);

FacesMessages.instance().add(msg);
}
}
Expand Up @@ -68,8 +68,6 @@
/**
* Sends an email to a specified role.
*
* Currently just sends an email to admin.
*
* @author damason@redhat.com
*
*/
Expand Down Expand Up @@ -194,11 +192,11 @@ public String send() {
fromLoginName, fromName, replyEmail,
subject, htmlMessage);

String msg = emailServiceImpl.sendToAdmins(strategy);
String msg = emailServiceImpl.sendToAdmins(strategy, null);

FacesMessages.instance().add(msg);
conversationScopeMessages.setMessage(
FacesMessage.SEVERITY_INFO, msg);
FacesMessage.SEVERITY_INFO, msg);
return SUCCESS;
}
case EMAIL_TYPE_CONTACT_COORDINATOR: {
Expand Down
13 changes: 7 additions & 6 deletions zanata-war/src/main/java/org/zanata/email/EmailBuilder.java
Expand Up @@ -5,6 +5,7 @@

import java.io.StringWriter;
import java.net.ConnectException;
import java.util.List;

import javax.mail.MessagingException;
import javax.mail.Multipart;
Expand Down Expand Up @@ -89,8 +90,8 @@ private static VelocityEngine makeVelocityEngine() {
* @throws javax.mail.MessagingException
*/
public void sendMessage(EmailStrategy strategy,
String receivedReason, InternetAddress toAddress) {
sendMessage(strategy, receivedReason, new InternetAddress[] {
List<String> receivedReasons, InternetAddress toAddress) {
sendMessage(strategy, receivedReasons, new InternetAddress[] {
toAddress });
}

Expand All @@ -100,10 +101,10 @@ public void sendMessage(EmailStrategy strategy,
* @throws javax.mail.MessagingException
*/
public void sendMessage(EmailStrategy strategy,
String receivedReason, InternetAddress[] toAddresses) {
List<String> receivedReasons, InternetAddress[] toAddresses) {
try {
MimeMessage email = new MimeMessage(mailSession);
buildMessage(email, strategy, toAddresses, receivedReason);
buildMessage(email, strategy, toAddresses, receivedReasons);
logMessage(email);
Transport.send(email);
} catch (MessagingException e) {
Expand Down Expand Up @@ -145,7 +146,7 @@ private void logMessage(MimeMessage msg) {
*/
@VisibleForTesting
MimeMessage buildMessage(MimeMessage msg, EmailStrategy strategy,
InternetAddress[] toAddresses, String receivedReason)
InternetAddress[] toAddresses, List<String> receivedReasons)
throws MessagingException {

Optional<InternetAddress> from = strategy.getFromAddress();
Expand All @@ -162,7 +163,7 @@ MimeMessage buildMessage(MimeMessage msg, EmailStrategy strategy,

PersistentMap<String, Object> genericContext = map(
"msgs", msgs,
"receivedReason", receivedReason,
"receivedReasons", receivedReasons,
"serverPath", emailContext.getServerPath());

// the Map needs to be mutable for "foreach" to work
Expand Down
Expand Up @@ -35,6 +35,8 @@
import org.zanata.email.LanguageTeamPermissionChangeEmailStrategy;
import org.zanata.events.LanguageTeamPermissionChangedEvent;
import org.zanata.i18n.Messages;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

/**
Expand Down Expand Up @@ -91,7 +93,8 @@ public void handle(Serializable data) {
Addresses.getAddress(changedEvent.getEmail(),
changedEvent.getName());

emailBuilder.sendMessage(emailStrategy, receivedReason, to);
emailBuilder.sendMessage(emailStrategy,
Lists.newArrayList(receivedReason), to);
}

}
14 changes: 13 additions & 1 deletion zanata-war/src/main/java/org/zanata/service/EmailService.java
Expand Up @@ -22,6 +22,8 @@

import java.util.List;

import javax.annotation.Nullable;

import org.zanata.email.EmailStrategy;
import org.zanata.model.HLocale;
import org.zanata.model.HPerson;
Expand Down Expand Up @@ -50,8 +52,18 @@ String sendEmailValidationEmail(String toName,
/**
* sends emails to configured admin emails for server, or admin users if no
* server emails are configured.
*
* @param strategy - Email template
* @param receivedReasons
* - Reasons of why users are receiving email as admin can
* received via: 1) Direct email from logged in users. 2) User
* request to join language team when there's no coordinator. 3)
* User request to update their role in language team when
* there's no coordinator. 4) User request to join a version group
* when there's no maintainer.
*/
String sendToAdmins(EmailStrategy strategy);
String sendToAdmins(EmailStrategy strategy,
@Nullable List<String> receivedReasons);

/**
* sends emails to version group maintainers -> admin -> admin users
Expand Down
Expand Up @@ -49,8 +49,11 @@
import org.zanata.model.HPerson;
import org.zanata.service.EmailService;

import javax.annotation.Nullable;
import javax.mail.internet.InternetAddress;

import com.google.common.collect.Lists;

import static org.zanata.email.Addresses.getAddresses;

/**
Expand Down Expand Up @@ -135,29 +138,48 @@ public String sendPasswordResetEmail(HPerson person, String key) {
return msgs.get("jsf.email.passwordreset.SentNotification");
}


/**
* sends emails to configured admin emails for server, or admin users if no
* server emails are configured.
*
* @param strategy - Email template
* @param receivedReasons
* - Reasons of why users are receiving email as admin can
* received via: 1) Direct email from logged in users. 2) User
* request to join language team when there's no coordinator. 3)
* User request to update their role in language team when
* there's no coordinator. 4) User request to join a version group
* when there's no maintainer.
*/
@Override
public String sendToAdmins(EmailStrategy strategy) {
public String sendToAdmins(EmailStrategy strategy,
@Nullable List<String> receivedReasons) {
List<String> adminEmails = applicationConfiguration.getAdminEmail();
receivedReasons =
receivedReasons == null ? Lists.<String> newArrayList()
: receivedReasons;

if (!adminEmails.isEmpty()) {
String receivedReason = msgs.get("jsf.email.admin.ReceivedReason");
receivedReasons.add(msgs.get("jsf.email.admin.ReceivedReason"));
String toName = msgs.get("jsf.ZanataAdministrator");
emailBuilder.sendMessage(strategy, receivedReason,
emailBuilder.sendMessage(strategy, receivedReasons,
getAddresses(adminEmails, toName));
return msgs.get("jsf.email.admin.SentNotification");
} else {
return sendToAdminUsers(strategy);
return sendToAdminUsers(strategy, receivedReasons);
}
}

/**
* Emails admin users with given template
*
*/
private String sendToAdminUsers(EmailStrategy strategy) {
String receivedReason = msgs.get(
"jsf.email.admin.user.ReceivedReason");
emailBuilder.sendMessage(strategy, receivedReason,
getAddresses(getAdmins()));
private String sendToAdminUsers(EmailStrategy strategy,
List<String> receivedReasons) {
receivedReasons.add(msgs.get("jsf.email.admin.user.ReceivedReason"));
emailBuilder.sendMessage(strategy, receivedReasons,
getAddresses(getAdmins()));
return msgs.get("jsf.email.admin.SentNotification");
}

Expand All @@ -170,12 +192,17 @@ public String sendToLanguageCoordinators(HLocale locale,
"jsf.email.coordinator.ReceivedReason",
locale.retrieveNativeName());

emailBuilder.sendMessage(strategy, receivedReason,
emailBuilder.sendMessage(strategy,
Lists.newArrayList(receivedReason),
getAddresses(coordinators));
return msgs.format("jsf.email.coordinator.SentNotification",
locale.retrieveNativeName());
} else {
return sendToAdmins(strategy);
String receivedReason =
msgs.format(
"jsf.email.admin.ReceivedReason.language.noCoordinator",
locale.getLocaleId(), locale.retrieveDisplayName());
return sendToAdmins(strategy, Lists.newArrayList(receivedReason));
}
}

Expand All @@ -186,12 +213,17 @@ public String sendToVersionGroupMaintainers(List<HPerson> maintainers,
String receivedReason = msgs.format(
"jsf.email.group.maintainer.ReceivedReason",
versionGroupJoinAction.getGroupName());
emailBuilder.sendMessage(strategy, receivedReason,
emailBuilder.sendMessage(strategy,
Lists.newArrayList(receivedReason),
getAddresses(maintainers));
return msgs.format("jsf.email.group.maintainer.SentNotification",
versionGroupJoinAction.getGroupName());
} else {
return sendToAdmins(strategy);
String receivedReason =
msgs.format(
"jsf.email.admin.ReceivedReason.versionGroup.noMaintainer",
versionGroupJoinAction.getGroupName());
return sendToAdmins(strategy, Lists.newArrayList(receivedReason));
}
}

Expand Down
2 changes: 2 additions & 0 deletions zanata-war/src/main/resources/messages.properties
Expand Up @@ -1168,6 +1168,8 @@ jsf.email.admin.UserMessageIntro=Zanata user "{0}" with id "{1}" has sent the fo
jsf.email.ReplyInstructions=You can reply to {0} at {1}
jsf.email.admin.ReceivedReason=You are an administrator in the system configuration
jsf.email.admin.user.ReceivedReason=You are an administrator
jsf.email.admin.ReceivedReason.language.noCoordinator=There is no coordinator for language "{0} ({1})"
jsf.email.admin.ReceivedReason.versionGroup.noMaintainer=There is no maintainer for version group "{0}"


#------ contact-language-team-coordinator email ------
Expand Down
Expand Up @@ -5,11 +5,13 @@
<body>
#parse($body)
<hr/>
#if ($receivedReason)
#if ($receivedReasons && !$receivedReasons.isEmpty())
<p>
<span>
$msgs.get("jsf.email.YouAreReceivingThisMailBecause") <br/>
$receivedReason <br/>
#foreach ($receivedReason in $receivedReasons)
$receivedReason <br/>
#end
</span>
</p>
#end
Expand Down

0 comments on commit b81c7f0

Please sign in to comment.