Add project url to email template keywords, allow url keyword in timesheet template

This commit is contained in:
lmann99 2017-01-01 08:42:21 -05:00
parent 02800f97db
commit 1e58368f3e
4 changed files with 255 additions and 166 deletions

View file

@ -19,6 +19,8 @@
package org.libreplan.importers.notifications;
//import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.libreplan.business.common.entities.ConnectorProperty;
@ -33,9 +35,20 @@ import org.libreplan.web.email.IEmailTemplateModel;
import org.libreplan.web.planner.tabs.MultipleTabsPlannerController;
import org.libreplan.web.resources.worker.IWorkerModel;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
import org.zkoss.zul.Messagebox;
import javax.mail.Message;
@ -45,243 +58,304 @@ import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.Query;
import javax.management.ReflectionException;
import javax.naming.InitialContext;
import javax.naming.Context;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.lang.String;
import java.lang.management.ManagementFactory;
import java.io.File;
import java.net.InetAddress;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.io.UnsupportedEncodingException;
import org.springframework.core.env.MapPropertySource;
import static org.libreplan.web.I18nHelper._;
/**
* Sends E-mail to users with data that storing in notification_queue table
* and that are treat to incoming {@link EmailNotification}.
* Sends E-mail to users with data that storing in notification_queue table and
* that are treat to incoming {@link EmailNotification}.
*
* @author Vova Perebykivskyi <vova@libreplan-enterprise.com>
*/
@Configuration
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class ComposeMessage {
@Autowired
private IWorkerModel workerModel;
@Autowired
private IWorkerModel workerModel;
@Autowired
private IEmailTemplateModel emailTemplateModel;
@Autowired
private IEmailTemplateModel emailTemplateModel;
@Autowired
private EmailConnectionValidator emailConnectionValidator;
@Autowired
private EmailConnectionValidator emailConnectionValidator;
private String protocol;
// @Autowired
// private Environment environment;
private String host;
@Autowired
private WebApplicationContext webApplicationContext;
private String port;
// @Autowired
// private ServletContext servletContext;
private String sender;
private String protocol;
private String usrnme;
private String host;
private String psswrd;
private String port;
private Properties properties;
private String sender;
private static final Log LOG = LogFactory.getLog(ComposeMessage.class);
private String usrnme;
private String psswrd;
public boolean composeMessageForUser(EmailNotification notification) {
// Gather data about EmailTemplate needs to be used
Resource resource = notification.getResource();
EmailTemplateEnum type = notification.getType();
Locale locale;
Worker currentWorker = getCurrentWorker(resource.getId());
private Properties properties;
UserRole currentUserRole = getCurrentUserRole(notification.getType());
private static final Log LOG = LogFactory.getLog(ComposeMessage.class);
if (currentWorker != null && currentWorker.getUser().isInRole(currentUserRole)) {
if (currentWorker.getUser().getApplicationLanguage().equals(Language.BROWSER_LANGUAGE)) {
locale = new Locale(System.getProperty("user.language"));
} else {
locale = new Locale(currentWorker.getUser().getApplicationLanguage().getLocale().getLanguage());
}
public boolean composeMessageForUser(EmailNotification notification) {
// Gather data about EmailTemplate needs to be used
Resource resource = notification.getResource();
EmailTemplateEnum type = notification.getType();
Locale locale;
Worker currentWorker = getCurrentWorker(resource.getId());
EmailTemplate currentEmailTemplate = findCurrentEmailTemplate(type, locale);
UserRole currentUserRole = getCurrentUserRole(notification.getType());
if (currentEmailTemplate == null) {
LOG.error("Email template is null");
return false;
}
if (currentWorker != null && currentWorker.getUser().isInRole(currentUserRole)) {
if (currentWorker.getUser().getApplicationLanguage().equals(Language.BROWSER_LANGUAGE)) {
locale = new Locale(System.getProperty("user.language"));
} else {
locale = new Locale(currentWorker.getUser().getApplicationLanguage().getLocale().getLanguage());
}
// Modify text that will be composed
String text = currentEmailTemplate.getContent();
text = replaceKeywords(text, currentWorker, notification);
EmailTemplate currentEmailTemplate = findCurrentEmailTemplate(type, locale);
String receiver = currentWorker.getUser().getEmail();
if (currentEmailTemplate == null) {
LOG.error("Email template is null");
return false;
}
setupConnectionProperties();
// Modify text that will be composed
String text = currentEmailTemplate.getContent();
text = replaceKeywords(text, currentWorker, notification);
final String username = usrnme;
final String password = psswrd;
String receiver = currentWorker.getUser().getEmail();
// It is very important to use Session.getInstance() instead of Session.getDefaultInstance()
Session mailSession = Session.getInstance(properties, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
setupConnectionProperties();
// Send message
try {
MimeMessage message = new MimeMessage(mailSession);
final String username = usrnme;
final String password = psswrd;
message.setFrom(new InternetAddress(sender));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver));
// It is very important to use Session.getInstance() instead of
// Session.getDefaultInstance()
Session mailSession = Session.getInstance(properties, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
String subject = currentEmailTemplate.getSubject();
message.setSubject(subject);
// Send message
try {
MimeMessage message = new MimeMessage(mailSession);
message.setText(text);
message.setFrom(new InternetAddress(sender));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver));
Transport.send(message);
String subject = currentEmailTemplate.getSubject();
message.setSubject(subject);
return true;
message.setText(text);
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (NullPointerException e) {
if (receiver == null) {
Messagebox.show(
_(currentWorker.getUser().getLoginName() + " - this user have not filled E-mail"),
_("Error"), Messagebox.OK, Messagebox.ERROR);
}
}
}
return false;
}
Transport.send(message);
private Worker getCurrentWorker(Long resourceID){
List<Worker> workerList = workerModel.getWorkers();
return true;
for (Worker aWorkerList : workerList) {
if (aWorkerList.getId().equals(resourceID)) {
return aWorkerList;
}
}
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (NullPointerException e) {
if (receiver == null) {
Messagebox.show(_(currentWorker.getUser().getLoginName() + " - this user have not filled E-mail"),
_("Error"), Messagebox.OK, Messagebox.ERROR);
}
}
}
return false;
}
return null;
}
private Worker getCurrentWorker(Long resourceID) {
List<Worker> workerList = workerModel.getWorkers();
private EmailTemplate findCurrentEmailTemplate(EmailTemplateEnum templateEnum, Locale locale) {
List<EmailTemplate> emailTemplates;
emailTemplates = emailTemplateModel.getAll();
for (Worker aWorkerList : workerList) {
if (aWorkerList.getId().equals(resourceID)) {
return aWorkerList;
}
}
for (EmailTemplate item : emailTemplates) {
if ( item.getType().equals(templateEnum) && item.getLanguage().getLocale().equals(locale) ) {
return item;
}
return null;
}
}
private EmailTemplate findCurrentEmailTemplate(EmailTemplateEnum templateEnum, Locale locale) {
List<EmailTemplate> emailTemplates;
emailTemplates = emailTemplateModel.getAll();
return null;
}
for (EmailTemplate item : emailTemplates) {
if (item.getType().equals(templateEnum) && item.getLanguage().getLocale().equals(locale)) {
return item;
}
private String replaceKeywords(String text, Worker currentWorker, EmailNotification notification) {
String newText = text;
}
if ( notification.getType().equals(EmailTemplateEnum.TEMPLATE_ENTER_DATA_IN_TIMESHEET) ) {
// It is because there is no other data for
// EmailNotification of TEMPLATE_ENTER_DATA_IN_TIMESHEET notification type
newText = newText.replaceAll("\\{resource\\}", notification.getResource().getName());
}
else {
newText = newText.replaceAll("\\{username\\}", currentWorker.getUser().getLoginName());
newText = newText.replaceAll("\\{firstname\\}", currentWorker.getUser().getFirstName());
newText = newText.replaceAll("\\{lastname\\}", currentWorker.getUser().getLastName());
newText = newText.replaceAll("\\{project\\}", notification.getProject().getName());
newText = newText.replaceAll("\\{resource\\}", notification.getResource().getName());
newText = newText.replaceAll("\\{task\\}", notification.getTask().getName());
newText = newText.replaceAll("\\{url\\}", MultipleTabsPlannerController.WELCOME_URL);
}
return newText;
}
return null;
}
private void setupConnectionProperties() {
List<ConnectorProperty> emailConnectorProperties = emailConnectionValidator.getEmailConnectorProperties();
private String replaceKeywords(String text, Worker currentWorker, EmailNotification notification) {
String newText = text;
for (int i = 0; i < emailConnectorProperties.size(); i++) {
switch (i) {
// replace {url} in all messages even timesheet reminder emails
// as a link may be helpful
newText = newText.replaceAll("\\{url\\}", MultipleTabsPlannerController.WELCOME_URL);
if (notification.getType().equals(EmailTemplateEnum.TEMPLATE_ENTER_DATA_IN_TIMESHEET)) {
// It is because there is no other data for
// EmailNotification of TEMPLATE_ENTER_DATA_IN_TIMESHEET
// notification type
newText = newText.replaceAll("\\{resource\\}", notification.getResource().getName());
} else {
newText = newText.replaceAll("\\{username\\}", currentWorker.getUser().getLoginName());
newText = newText.replaceAll("\\{firstname\\}", currentWorker.getUser().getFirstName());
newText = newText.replaceAll("\\{lastname\\}", currentWorker.getUser().getLastName());
newText = newText.replaceAll("\\{project\\}", notification.getProject().getName());
newText = newText.replaceAll("\\{resource\\}", notification.getResource().getName());
newText = newText.replaceAll("\\{task\\}", notification.getTask().getName());
newText = newText.replaceAll("\\{projecturl\\}", MultipleTabsPlannerController.WELCOME_URL+ ";order=" + notification.getProject().getProjectCode());
}
return newText;
}
case 1:
protocol = emailConnectorProperties.get(1).getValue();
break;
List<String> getEndPoints() throws MalformedObjectNameException, NullPointerException, UnknownHostException,
AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objs = mbs.queryNames(new ObjectName("*:type=Connector,*"),
Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
String hostname = InetAddress.getLocalHost().getHostName();
InetAddress[] addresses = InetAddress.getAllByName(hostname);
ArrayList<String> endPoints = new ArrayList<String>();
for (Iterator<ObjectName> i = objs.iterator(); i.hasNext();) {
ObjectName obj = i.next();
String scheme = mbs.getAttribute(obj, "scheme").toString();
String port = obj.getKeyProperty("port");
for (InetAddress addr : addresses) {
String host = addr.getHostAddress();
String ep = scheme + "://" + host + ":" + port;
endPoints.add(ep);
}
}
return endPoints;
}
case 2:
host = emailConnectorProperties.get(2).getValue();
break;
private void setupConnectionProperties() {
List<ConnectorProperty> emailConnectorProperties = emailConnectionValidator.getEmailConnectorProperties();
case 3:
port = emailConnectorProperties.get(3).getValue();
break;
for (int i = 0; i < emailConnectorProperties.size(); i++) {
switch (i) {
case 4:
sender = emailConnectorProperties.get(4).getValue();
break;
case 1:
protocol = emailConnectorProperties.get(1).getValue();
break;
case 5:
usrnme = emailConnectorProperties.get(5).getValue();
break;
case 2:
host = emailConnectorProperties.get(2).getValue();
break;
case 6:
psswrd = emailConnectorProperties.get(6).getValue();
break;
case 3:
port = emailConnectorProperties.get(3).getValue();
break;
default:
break;
case 4:
sender = emailConnectorProperties.get(4).getValue();
break;
}
}
case 5:
usrnme = emailConnectorProperties.get(5).getValue();
break;
properties = new Properties();
case 6:
psswrd = emailConnectorProperties.get(6).getValue();
break;
if ( "STARTTLS".equals(protocol) ) {
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.socketFactory.port", port);
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", port);
}
else if ( "SMTP".equals(protocol) ) {
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.port", port);
}
}
default:
break;
private UserRole getCurrentUserRole(EmailTemplateEnum type) {
switch (type) {
}
}
case TEMPLATE_TASK_ASSIGNED_TO_RESOURCE:
return UserRole.ROLE_EMAIL_TASK_ASSIGNED_TO_RESOURCE;
properties = new Properties();
case TEMPLATE_RESOURCE_REMOVED_FROM_TASK:
return UserRole.ROLE_EMAIL_RESOURCE_REMOVED_FROM_TASK;
if ("STARTTLS".equals(protocol)) {
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.socketFactory.port", port);
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", port);
} else if ("SMTP".equals(protocol)) {
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.port", port);
}
}
case TEMPLATE_MILESTONE_REACHED:
return UserRole.ROLE_EMAIL_MILESTONE_REACHED;
private UserRole getCurrentUserRole(EmailTemplateEnum type) {
switch (type) {
case TEMPLATE_TODAY_TASK_SHOULD_START:
return UserRole.ROLE_EMAIL_TASK_SHOULD_START;
case TEMPLATE_TASK_ASSIGNED_TO_RESOURCE:
return UserRole.ROLE_EMAIL_TASK_ASSIGNED_TO_RESOURCE;
case TEMPLATE_TODAY_TASK_SHOULD_FINISH:
return UserRole.ROLE_EMAIL_TASK_SHOULD_FINISH;
case TEMPLATE_RESOURCE_REMOVED_FROM_TASK:
return UserRole.ROLE_EMAIL_RESOURCE_REMOVED_FROM_TASK;
case TEMPLATE_ENTER_DATA_IN_TIMESHEET:
return UserRole.ROLE_EMAIL_TIMESHEET_DATA_MISSING;
case TEMPLATE_MILESTONE_REACHED:
return UserRole.ROLE_EMAIL_MILESTONE_REACHED;
default:
/* There is no other template */
return null;
}
}
case TEMPLATE_TODAY_TASK_SHOULD_START:
return UserRole.ROLE_EMAIL_TASK_SHOULD_START;
case TEMPLATE_TODAY_TASK_SHOULD_FINISH:
return UserRole.ROLE_EMAIL_TASK_SHOULD_FINISH;
case TEMPLATE_ENTER_DATA_IN_TIMESHEET:
return UserRole.ROLE_EMAIL_TIMESHEET_DATA_MISSING;
default:
/* There is no other template */
return null;
}
}
}

View file

@ -9291,6 +9291,10 @@ msgstr ""
msgid "Welcome page"
msgstr ""
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:124
msgid "Project details page"
msgstr ""
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
msgid "ARCHIVED"
msgstr ""

View file

@ -118,6 +118,11 @@
<label value="{url}"/>
<label value="${i18n:_('Welcome page')}"/>
</row>
<row>
<label value="{projecturl}"/>
<label value="${i18n:_('Project details page')}"/>
</row>
</rows>
</grid>

View file

@ -866,6 +866,12 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>