diff --git a/HACKING.rst b/HACKING.rst
index 2a3fa7121..b6aec7557 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -205,6 +205,79 @@ openSUSE
* Go to http://localhost:8080/libreplan-webapp/
+Microsoft Windows
+~~~~~~~~
+
+* Download and install latest Java Development Kit 7u80 (JDK7u80)::
+
+ # http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
+
+* Download and install latest PostgreSQL database::
+
+ # http://www.enterprisedb.com/products-services-training/pgdownload#windows
+
+* Download and install Git
+
+ # https://git-scm.com/download/win
+
+* Download Maven
+
+ # https://maven.apache.org/download.cgi
+
+.. WARNING::
+
+ Check if latest Maven version is compatible with your JDK
+
+* Connect to database::
+
+ # Go to PostgreSQL bin folder and command window from here
+ # psql -U postgres
+
+* Use SQL sentences::
+
+ CREATE DATABASE libreplandev;
+ CREATE DATABASE libreplandevtest;
+
+ CREATE USER libreplan WITH PASSWORD 'libreplan';
+
+ REVOKE ALL
+ ON ALL TABLES IN SCHEMA public
+ FROM PUBLIC;
+
+ GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
+
+ GRANT SELECT, INSERT, UPDATE, DELETE
+ ON ALL TABLES IN SCHEMA public
+ TO libreplan;
+
+* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup
+
+* Download source code::
+
+ # Open GitBash
+ # git clone https://github.com/LibrePlan/libreplan.git
+
+* Set JAVA_HOME environment variable::
+
+ # You need to set it to your JDK installed directory (e.g. C:\Program Files\Java\jdk1.7.0_80)
+
+* Add path of unpacked distributions bin directory of Maven to 'Path' environment variable
+
+ # (e.g. C:\Program Files\apache-maven-3.3.3\bin)
+
+* Compile project::
+
+ # cd libreplan
+ # mvn clean install
+
+* Launch application::
+
+ # cd libreplan-webapp
+ # mvn jetty:run
+
+* Go to http://localhost:8080/libreplan-webapp/
+
+
CutyCapt compilation
--------------------
@@ -466,4 +539,4 @@ For MySQL users here are specific instructions.
* Launch application::
$ cd libreplan-webapp/
- $ mvn -Pdev,mysql jetty:run
+ $ mvn -Pdev,mysql jetty:run
\ No newline at end of file
diff --git a/INSTALL.rst b/INSTALL.rst
index 93be682a6..ab8a3d74b 100644
--- a/INSTALL.rst
+++ b/INSTALL.rst
@@ -117,6 +117,11 @@ Instructions depending on the distribution:
If you have memory problems review the section `Fix memory errors`_.
+Microsoft Windows
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
RPM Packages
~~~~~~~~~~~~
@@ -316,6 +321,78 @@ openSUSE
* Go to http://localhost:8080/libreplan/
+Microsoft Windows
+~~~~~~~~~~~
+
+Instructions:
+
+* Download and install latest Java Runtime Environment 7u79 (JRE7u79)::
+
+ # http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
+
+* Download and install latest PostgreSQL database::
+
+ # http://www.enterprisedb.com/products-services-training/pgdownload#windows
+
+* Download and install Apache Tomcat 6::
+
+ # http://tomcat.apache.org/download-60.cgi
+
+.. NOTE::
+
+ In JDK folder there is JRE folder
+
+* Set up JDBC41 PostgreSQL Driver::
+
+ # Download latest driver: https://jdbc.postgresql.org/download.html
+ # Copy downloaded *.jar file to JRE location: (e.g. C:\Program Files\Java\jre7\lib\ext)
+
+* Download latest ``.war`` file from SourceForge.net (for PostgreSQL) and rename it to libreplan.war::
+
+ # http://sourceforge.net/projects/libreplan/files/LibrePlan/
+
+* Create database::
+
+ CREATE DATABASE libreplan;
+
+* Use SQL sentences::
+
+ CREATE USER libreplan WITH PASSWORD 'libreplan';
+ GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
+
+ REVOKE ALL
+ ON ALL TABLES IN SCHEMA public
+ FROM PUBLIC;
+ GRANT SELECT, INSERT, UPDATE, DELETE
+ ON ALL TABLES IN SCHEMA public
+ TO libreplan;
+
+* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup::
+
+* Create an Environment Variable JRE_HOME
+
+# You need to set it to your JRE installed directory
+
+* Configure Apache Tomcat Server
+
+ # Put libreplan.war file to Apache Tomcat webapps folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\)
+ # Go to localhost folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\) and create there libreplan.xml file with this lines of code:
+
+
+
+
+
+
+* Start Apache Tomcat server
+
+ # Example location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe
+
+* Go to http://localhost:8080/libreplan
Logs
----
diff --git a/doc/src/technical/howto-start-development-with-intellij-idea.rst b/doc/src/technical/howto-start-development-with-intellij-idea.rst
new file mode 100644
index 000000000..3bbb27083
--- /dev/null
+++ b/doc/src/technical/howto-start-development-with-intellij-idea.rst
@@ -0,0 +1,101 @@
+How To Start Development With JetBrains Intellij IDEA
+======================================================
+
+.. sectnum::
+
+:Author: Perebykivskiy Vova
+:Contact: vova@libreplan-enterprise.com
+:Date: 09/09/2015
+:Copyright:
+ Some rights reserved. This document is distributed under the Creative
+ Commons Attribution-ShareAlike 3.0 licence, available in
+ http://creativecommons.org/licenses/by-sa/3.0/.
+:Abstract:
+ Quick guide to start the development of LibrePlan_ using JetBrains Intellij IDEA_ IDE.
+ As this is the most common way of work among LibrePlan developers team.
+
+.. contents:: Table of Contents
+
+Download LibrePlan source code
+------------------------------
+
+* You need to download LibrePlan_ source code to start hacking on it. You have two
+options:
+
+a) Clone Git repository (recommended)::
+
+ git clone git://github.com/LibrePlan/libreplan.git
+
+b) Download last version source code::
+
+ http://sourceforge.net/projects/libreplan/files/LibrePlan/libreplan_*.tar.gz
+
+* Download latest libreplan_*.war file for your database (PostgreSQL or MySQL)
+
+ http://sourceforge.net/projects/libreplan/files/LibrePlan/
+
+You should review ``HACKING`` file to check that you have installed all the
+requirements.
+
+Import LibrePlan project
+------------------------
+* Run Intellij IDEA
+
+* Select Import Project
+
+* Select directory with source code of Libreplan
+
+ # e.g. C\Users\PC-User\IdeaProjects\libreplan
+
+* Select *Import project from external model* > *Maven* and click *Next*
+
+* Then leave all as default
+
+* Then select profiles: dev and for PostgreSQL users - postgresql / Mysql users - mysql
+
+* Then leave all by default
+
+* Then choose your JDK
+
+* Then define project name or leave default name
+
+
+Configure project to run
+------------------------
+
+* Go to *Run* > *Edit Configurations...*
+
+* Create a new *Maven Build* called *MavenConfig*
+
+* Change the following values:
+
+ * Working directory: Choose ``libreplan-webapp`` folder in your workspace
+ * Command line: ``jetty:stop jetty:run``
+ * Profiles (optional): ``-userguide -reports -i18n``
+ (to disable userguide,reports and i18n profiles to save compilation time
+ as they are not mandatory to run LibrePlan)
+ * Mark the following checkboxes (recommended):
+
+* Resolve Workspace artifacts
+
+* In "Before launch" section choose "+" and add Build Artifact (war file)
+
+* Click *Run* and application will be available at
+ http://localhost:8080/libreplan-webapp/
+
+Develop LibrePlan in Intellij IDEA using MySQL
+----------------------------------------
+
+* This tutorial works properly with PostgreSQL, but if you want to develop
+ LibrePlan using MySQL you have to do 2 small changes:
+
+ * In section `Configure project to run`_ you have to set the *Profiles* to:
+ ``-dev -mysql -userguide -reports -i18n``
+
+* Remember that the three last profiles that are being disabled is just to save
+ compilation time and not mandatory. However, to develop using MySQL you have
+ to set at least the first two: ``-dev`` and ``-mysql``.
+
+
+.. _LibrePlan: http://www.libreplan.com/
+.. _JetBrains Intellij IDEA: https://www.jetbrains.com/idea/
\ No newline at end of file
diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java b/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java
index ef0b84200..0f6e71af1 100644
--- a/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java
+++ b/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java
@@ -27,6 +27,7 @@ import static org.libreplan.business.i18n.I18nHelper._;
*
* @author Miciele Ghiorghis
* @author Manuel Rego Casasnovas
+ * @author Vova Perebykivskiy
*/
public class PredefinedConnectorProperties {
@@ -51,4 +52,9 @@ public class PredefinedConnectorProperties {
*/
public static final String JIRA_CODE_PREFIX = "JIRA-";
+ // Specific for E-mail
+ public static String HOST = _("Host");
+ public static String USER_EMAIL = _("E-mail");
+ public static String PORT = _("Port");
+
}
diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectors.java b/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectors.java
index b51adc8a1..1d6f01180 100644
--- a/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectors.java
+++ b/libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectors.java
@@ -28,6 +28,7 @@ import java.util.List;
*
* @author Miciele Ghiorghis
* @author Manuel Rego Casasnovas
+ * @author Vova Perebykivskiy
*/
public enum PredefinedConnectors {
@@ -50,7 +51,14 @@ public enum PredefinedConnectors {
ConnectorProperty
.create(PredefinedConnectorProperties.JIRA_LABELS, ""),
ConnectorProperty.create(
- PredefinedConnectorProperties.JIRA_HOURS_TYPE, "Default"));
+ PredefinedConnectorProperties.JIRA_HOURS_TYPE, "Default")),
+ EMAIL("E-mail",
+ ConnectorProperty.create(PredefinedConnectorProperties.ACTIVATED, "N"),
+ ConnectorProperty.create(PredefinedConnectorProperties.HOST, ""),
+ ConnectorProperty.create(PredefinedConnectorProperties.PORT, ""),
+ ConnectorProperty.create(PredefinedConnectorProperties.USER_EMAIL, ""),
+ ConnectorProperty.create(PredefinedConnectorProperties.PASSWORD, "")
+ );
private String name;
private List properties;
diff --git a/libreplan-webapp/pom.xml b/libreplan-webapp/pom.xml
index 078cb252d..029df0928 100644
--- a/libreplan-webapp/pom.xml
+++ b/libreplan-webapp/pom.xml
@@ -430,6 +430,14 @@
javax.servlet
servlet-api
+
+
+
+ javax.mail
+ mail
+ 1.5.0-b01
+
+
javax.ws.rs
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java
index a1ef7b11d..5d7e3542f 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java
@@ -23,16 +23,9 @@ package org.libreplan.web.common;
import static org.libreplan.web.I18nHelper._;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.ConcurrentModificationException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import javax.mail.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
@@ -97,6 +90,7 @@ import org.zkoss.zul.impl.InputElement;
* @author Susana Montes Pedreira
* @author Cristina Alavarino Perez
* @author Ignacio Diaz Teijido
+ * @author Vova Perebykivskiy
*/
public class ConfigurationController extends GenericForwardComposer {
@@ -251,6 +245,7 @@ public class ConfigurationController extends GenericForwardComposer {
public void cancel() throws InterruptedException {
configurationModel.cancel();
+ messages.clearMessages();
messages.showMessage(Level.INFO, _("Changes have been canceled"));
reloadWindow();
reloadEntitySequences();
@@ -305,12 +300,18 @@ public class ConfigurationController extends GenericForwardComposer {
String password = properties
.get(PredefinedConnectorProperties.PASSWORD);
- if (selectedConnector.getName().equals(
- PredefinedConnectors.TIM.getName())) {
+ if ( selectedConnector.getName().equals(
+ PredefinedConnectors.TIM.getName()) ) {
testTimConnection(url, username, password);
- } else if (selectedConnector.getName().equals(
- PredefinedConnectors.JIRA.getName())) {
+ } else if ( selectedConnector.getName().equals(
+ PredefinedConnectors.JIRA.getName()) ) {
testJiraConnection(url, username, password);
+ } else if( selectedConnector.getName().equals(
+ PredefinedConnectors.EMAIL.getName()) ){
+ String host = properties.get(PredefinedConnectorProperties.HOST);
+ String email = properties.get(PredefinedConnectorProperties.USER_EMAIL);
+ String port = properties.get(PredefinedConnectorProperties.PORT);
+ testEmailConnection(host, port, email, password);
} else {
throw new RuntimeException("Unknown connector");
}
@@ -373,6 +374,65 @@ public class ConfigurationController extends GenericForwardComposer {
}
}
+ /**
+ * Test E-mail connection
+ *
+ * @param host
+ * the host
+ * @param port
+ * the port
+ * @param email
+ * the email
+ * @param password
+ * the password
+ */
+ private void testEmailConnection(String host, String port, String email, String password){
+
+ String[] hostWords = host.split("\\.");
+
+ // + "s" means that protocol coming with SSL
+ String protocol = hostWords[0] + "s";
+
+ Properties props = System.getProperties();
+
+ if ( hostWords[0].equals("pop") ){
+ protocol = "pop3s";
+ props.setProperty("mail.pop3s.port", port);
+ }
+ else if ( hostWords[0].equals("smtp") ){ props.setProperty("mail.smtps.port", port); }
+ else if ( hostWords[0].equals("imap") ){ props.setProperty("mail.imaps.port", port); }
+
+ try {
+ Session session = Session.getInstance(props, null);
+ session.setDebug(true);
+
+ if ( hostWords[0].equals("pop") || hostWords[0].equals("imap") ){
+ Store store = session.getStore(protocol);
+ store.connect(host, email, password);
+ messages.clearMessages();
+ if ( store.isConnected() ) messages.showMessage(Level.INFO, _("Connection successful!"));
+ }
+ else if ( hostWords[0].equals("smtp") ){
+ Transport transport = session.getTransport(protocol);
+ transport.connect(host, email, password);
+ messages.clearMessages();
+ if ( transport.isConnected() ) messages.showMessage(Level.INFO, _("Connection successful!"));
+ }
+ }
+ catch (AuthenticationFailedException e){
+ LOG.error(e);
+ messages.showMessage(Level.ERROR, _("Invalid credentials"));
+ }
+ catch (MessagingException e){
+ LOG.error(e);
+ messages.showMessage(Level.ERROR, _("Cannot connect"));
+ }
+ catch (Exception e){
+ LOG.error(e);
+ messages.showMessage(Level.ERROR, _("Failed to connect"));
+ }
+ }
+
private boolean checkValidEntitySequenceRows() {
Rows rows = entitySequencesGrid.getRows();
for (Row row : (List) rows.getChildren()) {
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java
index c680966fb..6633074d9 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java
@@ -59,6 +59,7 @@ import org.zkoss.zul.Vbox;
* Controller for customMenu
* @author Lorenzo Tilve Álvaro
* @author Fernando Bellas Permuy
+ * @author Vova Perebykivskiy
*/
public class CustomMenuController extends Div implements IMenuItemsRegister {
@@ -420,6 +421,11 @@ public class CustomMenuController extends Div implements IMenuItemsRegister {
"/common/job_scheduling.zul",
"19-scheduler.html"));
}
+ if (SecurityUtils.isSuperuserOrUserInRoles(UserRole.ROLE_EDIT_EMAIL_TEMPLATES)) {
+ configurationItems.add(subItem(_("Edit E-mail Templates"),
+ "/templates/email_templates.zul",
+ "email-templates.html"));
+ }
if (!configurationItems.isEmpty()) {
topItem(_("Configuration"), "/common/configuration.zul", "",
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/settings/SettingsController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/settings/SettingsController.java
index abf2f1625..6cfa2cf61 100644
--- a/libreplan-webapp/src/main/java/org/libreplan/web/users/settings/SettingsController.java
+++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/settings/SettingsController.java
@@ -26,7 +26,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import java.util.logging.Filter;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.labels.entities.Label;
@@ -38,8 +37,6 @@ import org.libreplan.web.common.Level;
import org.libreplan.web.common.MessagesForUser;
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
import org.zkoss.zk.ui.Component;
-import org.zkoss.zk.ui.Session;
-import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
diff --git a/libreplan-webapp/src/main/resources/i18n/keys.pot b/libreplan-webapp/src/main/resources/i18n/keys.pot
index 5f9ef0927..54cbf38eb 100644
--- a/libreplan-webapp/src/main/resources/i18n/keys.pot
+++ b/libreplan-webapp/src/main/resources/i18n/keys.pot
@@ -889,6 +889,7 @@ msgstr ""
#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:122
#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:158
#: libreplan-webapp/src/main/webapp/users/_editUser.zul:84
+#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:56
msgid "E-mail"
msgstr ""
@@ -1363,6 +1364,7 @@ msgid "First expense"
msgstr ""
#: libreplan-webapp/src/main/webapp/common/configuration.zul:296
+#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:55
msgid "Host"
msgstr ""
@@ -9212,3 +9214,19 @@ msgstr ""
#: libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java:36
msgid "Use browser language configuration"
msgstr ""
+
+#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplateEnum.java:17
+msgid "Task assigned to resource"
+msgstr ""
+
+#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:425
+msgid "Edit E-mail Templates"
+msgstr ""
+
+#: libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateController.java:72
+msgid "E-mail template saved"
+msgstr ""
+
+#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:57
+msgid "Port"
+msgstr ""