Vova added the following new functionality:
------------------------------------------ Email notification functionality added. Email connector to smtp server added. Email template editor added. Email notification "resource assigned to task" added. Global dashboard page added. Project pipeline page added.
This commit is contained in:
commit
fd1ae5534b
68 changed files with 2826 additions and 293 deletions
64
HACKING.rst
64
HACKING.rst
|
|
@ -208,10 +208,6 @@ openSUSE
|
|||
Microsoft Windows
|
||||
~~~~~~~~
|
||||
|
||||
* 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 Java Development Kit 7u80 (JDK7u80)::
|
||||
|
||||
# http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
|
||||
|
|
@ -244,13 +240,31 @@ Microsoft Windows
|
|||
|
||||
CREATE USER libreplan WITH PASSWORD 'libreplan';
|
||||
GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
|
||||
* Download and install Git
|
||||
|
||||
REVOKE ALL
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
FROM PUBLIC;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE
|
||||
ON ALL TABLES IN SCHEMA public
|
||||
TO libreplan;
|
||||
# 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';
|
||||
|
||||
GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan;
|
||||
|
||||
* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup::
|
||||
|
||||
|
|
@ -279,6 +293,33 @@ Microsoft Windows
|
|||
# Possible location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe
|
||||
|
||||
* Go to http://localhost:8080/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
|
||||
|
|
@ -509,6 +550,9 @@ example:
|
|||
|
||||
mvn -Ddefault.passwordsControl=false -Ddefault.exampleUsersDisabled=false clean install
|
||||
|
||||
* Set *default.emailSendingEnabled* to false::
|
||||
|
||||
mvn -Ddefault.emailSendingEnabled=false clean install
|
||||
|
||||
Tests
|
||||
-----
|
||||
|
|
|
|||
77
INSTALL.rst
77
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:
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Context antiJARLocking="true" path="">
|
||||
<Resource name="jdbc/libreplan-ds" auth="Container"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="100" maxIdle="30" maxWait="10000"
|
||||
username="libreplan" password="libreplan"
|
||||
driverClassName="org.postgresql.Driver"
|
||||
url="jdbc:postgresql://localhost/libreplan" />
|
||||
</Context>
|
||||
|
||||
* 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
|
||||
----
|
||||
|
|
|
|||
|
|
@ -1,103 +1,103 @@
|
|||
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(SDK), 1.7 strongly prefered
|
||||
|
||||
* 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)
|
||||
|
||||
By the next compilation you may remove this Build Artifact from configuration
|
||||
|
||||
* 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/
|
||||
======================================================
|
||||
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(SDK), 1.7 strongly prefered
|
||||
|
||||
* 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)
|
||||
|
||||
By the next compilation you may remove this Build Artifact from configuration
|
||||
|
||||
* 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/
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Connectors
|
|||
.. contents::
|
||||
|
||||
Connectors are Libreplan client applications that could be used to communicate with (web) servers to get
|
||||
data, process and store them. At this moment there are two connectors, JIRA connector and Tim Enterprise Connector.
|
||||
data, process and store them. At this moment there are three connectors, JIRA connector, Tim Enterprise Connector and E-mail Connector.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
|
@ -171,9 +171,9 @@ in Tim Enterprise server.
|
|||
|
||||
Scheduling export
|
||||
------------------
|
||||
Export process can also take place through the scheduler. Go to ``Job scheduling`` screen.
|
||||
Export process can also take place through the scheduler. Go to ``Job Scheduling`` screen.
|
||||
In that screen you can configure a Tim Export ``job``. The ``job`` searches for last exported
|
||||
time sheets in the database and re-export them accordingly. see also the Scheduler manual.
|
||||
time sheets in the database and re-export them accordingly. See also the Scheduler manual.
|
||||
|
||||
Import
|
||||
------
|
||||
|
|
@ -211,5 +211,66 @@ assumed to be a valid ``Exception type`` but the total duration is the sum of al
|
|||
|
||||
Contrary to the Libreplan, in Tim Enterprise, the ``total duration`` in case that the worker is on holiday means the worker is
|
||||
not available for that ``total duration``. But in Libreplan if the worker is on holiday the total duration should be ``Zero``.
|
||||
The Tim connector also takes care of this translation.
|
||||
The Tim connector also takes care of this translation.
|
||||
|
||||
E-mail connector
|
||||
==============
|
||||
|
||||
E-mail is a method of exchanging digital messages from an author to one or more recipients.
|
||||
|
||||
E-mail connector can be used to set Simple Main Transfer Protocol (SMTP) server connection properties.
|
||||
|
||||
The *E-mail connector* should be configured properly before being used.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
From the configuration's ``Main Settings`` screen choose the tab ``Connectors``.
|
||||
In the connectors screen select the E-mail connector from the ``pull-down`` list. A ``property editor screen``
|
||||
is displayed now.
|
||||
|
||||
In this screen you can configure the following property values:
|
||||
|
||||
* ``Activated``: Y/N, whether you want to use the E-mail connector or not. Default is ``N``.
|
||||
* ``Protocol``: type of SMTP protocol.
|
||||
* ``Host``: the absolute path to SMTP server.
|
||||
* ``Port``: port of SMTP server.
|
||||
* ``From address``: e-mail address of messages sender.
|
||||
* ``Username``: username for SMTP server.
|
||||
* ``Password``: password for SMTP server.
|
||||
|
||||
Finally click the ``Test connection`` button to test if you are able to connect to
|
||||
SMTP server and that your configurations are right.
|
||||
|
||||
Edit E-mail template
|
||||
--------------------
|
||||
|
||||
From the project window ``Configuration`` and then ``Edit E-mail Templates`` you are able to modify E-mail templates of
|
||||
messages.
|
||||
|
||||
You are able to choose:
|
||||
|
||||
* Template language
|
||||
* Template type
|
||||
* E-mail subject
|
||||
* Template contents
|
||||
|
||||
You need to specify language because web application will send e-mail to user in language that user have chosen in
|
||||
preferences.
|
||||
You need to choose template type, type is user role, it means that this e-mail will be send only to users who are in\
|
||||
selected role (type).
|
||||
You need to set e-mail subject. Subject - a brief summary of the topic of the message.
|
||||
You need to set e-mail contents. Any information that you want to send to user. Also there are some keywords that you
|
||||
may use in message; web application will parse it and set a new value instead of keyword.
|
||||
|
||||
Scheduling e-mails
|
||||
------------------
|
||||
|
||||
Sending e-mails process can take place only through the scheduler. Go to ``Configuration`` then ``Job Scheduling``
|
||||
screen.
|
||||
In that screen you can configure a e-mail sending ``job``. The ``job`` is taking a list of e-mail notifications,
|
||||
gathering data and sending it to user`s e-mail. See also the Scheduler manual.
|
||||
|
||||
|
||||
.. NOTE::
|
||||
The success or failure information would be displayed in pop-up window.
|
||||
|
|
@ -26,16 +26,19 @@ import org.apache.commons.lang.BooleanUtils;
|
|||
/**
|
||||
* This is a singleton that contains the compilation options passed from Maven.
|
||||
*
|
||||
* Currently we have two options:
|
||||
* Currently we have three options:
|
||||
* <ul>
|
||||
* <li>Enable/Disable the warning changing default password</li>
|
||||
* <li>Enable/Disable default users (such as wsreader, wswriter,
|
||||
* wssubcontracting, manager, hresources, outsourcing and reports)</li>
|
||||
* <li>Enable/Disable E-mail sending functionality</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
|
||||
public class Configuration {
|
||||
|
||||
private static final Configuration singleton = new Configuration();
|
||||
|
|
@ -44,6 +47,8 @@ public class Configuration {
|
|||
|
||||
private Boolean exampleUsersDisabled;
|
||||
|
||||
private Boolean emailSendingEnabled;
|
||||
|
||||
private Configuration() {
|
||||
}
|
||||
|
||||
|
|
@ -59,22 +64,13 @@ public class Configuration {
|
|||
return singleton.getDefaultPasswordsControl() != null ? singleton
|
||||
.getDefaultPasswordsControl() : true;
|
||||
}
|
||||
|
||||
public Boolean getDefaultPasswordsControl() {
|
||||
return defaultPasswordsControl;
|
||||
}
|
||||
public void setDefaultPasswordsControl(Boolean defaultPasswordsControl) {
|
||||
this.defaultPasswordsControl = defaultPasswordsControl;
|
||||
}
|
||||
|
||||
public Boolean getDefaultPasswordsControl() {
|
||||
return defaultPasswordsControl;
|
||||
}
|
||||
|
||||
public void setExampleUsersDisabled(Boolean exampleUsersDisabled) {
|
||||
this.exampleUsersDisabled = exampleUsersDisabled;
|
||||
}
|
||||
|
||||
public Boolean getExampleUsersDisabled() {
|
||||
return exampleUsersDisabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of example users disabled compilation option
|
||||
|
|
@ -82,5 +78,25 @@ public class Configuration {
|
|||
public static boolean isExampleUsersDisabled() {
|
||||
return BooleanUtils.isNotFalse(singleton.getExampleUsersDisabled());
|
||||
}
|
||||
public Boolean getExampleUsersDisabled() {
|
||||
return exampleUsersDisabled;
|
||||
}
|
||||
public void setExampleUsersDisabled(Boolean exampleUsersDisabled) {
|
||||
this.exampleUsersDisabled = exampleUsersDisabled;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the value of E-mail sending disabled compilation option
|
||||
*/
|
||||
public static boolean isEmailSendingEnabled(){
|
||||
return BooleanUtils.isNotFalse(singleton.getEmailSendingEnabled());
|
||||
}
|
||||
public Boolean getEmailSendingEnabled(){
|
||||
return emailSendingEnabled;
|
||||
}
|
||||
public void setEmailSendingEnabled(Boolean emailSendingEnabled){
|
||||
this.emailSendingEnabled = emailSendingEnabled;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import org.hibernate.criterion.Order;
|
|||
import org.hibernate.criterion.Restrictions;
|
||||
import org.libreplan.business.common.IntegrationEntity;
|
||||
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
|
|
|
|||
|
|
@ -29,8 +29,9 @@ package org.libreplan.business.common.entities;
|
|||
public enum JobClassNameEnum {
|
||||
|
||||
IMPORT_ROSTER_FROM_TIM_JOB("org.libreplan.importers", "ImportRosterFromTimJob"),
|
||||
EXPORT_TIMESHEET_TO_TIM_JOB("org.libreplan.importers","ExportTimesheetToTimJob"),
|
||||
SYNC_ORDERELEMENTS_WITH_JIRA_ISSUES_JOB("org.libreplan.importers","JiraOrderElementSynchronizerJob");
|
||||
EXPORT_TIMESHEET_TO_TIM_JOB("org.libreplan.importers", "ExportTimesheetToTimJob"),
|
||||
SYNC_ORDERELEMENTS_WITH_JIRA_ISSUES_JOB("org.libreplan.importers", "JiraOrderElementSynchronizerJob"),
|
||||
SEND_EMAIL_JOB("org.libreplan.importers", "SendEmailJob");
|
||||
|
||||
private String packageName;
|
||||
private String name;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ import static org.libreplan.business.i18n.I18nHelper._;
|
|||
*
|
||||
* @author Miciele Ghiorghis <m.ghiorghis@antoniusziekenhuis.nl>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public class PredefinedConnectorProperties {
|
||||
|
||||
|
|
@ -51,4 +52,12 @@ public class PredefinedConnectorProperties {
|
|||
*/
|
||||
public static final String JIRA_CODE_PREFIX = "JIRA-";
|
||||
|
||||
// Specific for E-mail
|
||||
public static String PROTOCOL = _("Protocol");
|
||||
public static String HOST = _("Host");
|
||||
public static String PORT = _("Port");
|
||||
public static String EMAIL_SENDER = _("From address (no reply)");
|
||||
public static String EMAIL_USERNAME = _("Username (optional)");
|
||||
public static String EMAIL_PASSWORD = _("Password (optional)");
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import java.util.List;
|
|||
*
|
||||
* @author Miciele Ghiorghis <m.ghiorghis@antoniusziekenhuis.nl>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public enum PredefinedConnectors {
|
||||
|
||||
|
|
@ -50,7 +51,16 @@ 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.PROTOCOL, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.HOST, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.PORT, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.EMAIL_USERNAME, ""),
|
||||
ConnectorProperty.create(PredefinedConnectorProperties.EMAIL_PASSWORD, "")
|
||||
|
||||
);
|
||||
|
||||
private String name;
|
||||
private List<ConnectorProperty> properties;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.daos;
|
||||
|
||||
import org.libreplan.business.common.daos.GenericDAOHibernate;
|
||||
import org.libreplan.business.email.entities.EmailNotification;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Dao for {@link EmailNotification}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 19.10.15.
|
||||
*/
|
||||
@Repository
|
||||
public class EmailNotificationDAO extends GenericDAOHibernate<EmailNotification, Long> implements IEmailNotificationDAO {
|
||||
|
||||
@Override
|
||||
public List<EmailNotification> getAll() {
|
||||
return list(EmailNotification.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteAll() {
|
||||
List<EmailNotification> notifications = list(EmailNotification.class);
|
||||
for (Object item : notifications){
|
||||
getSession().delete(item);
|
||||
}
|
||||
|
||||
if ( list(EmailNotification.class).size() == 0 ) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.daos;
|
||||
|
||||
import org.libreplan.business.common.daos.GenericDAOHibernate;
|
||||
import org.libreplan.business.email.entities.EmailTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* DAO for {@link EmailTemplate}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 24.09.15.
|
||||
*/
|
||||
@Repository
|
||||
public class EmailTemplateDAO extends GenericDAOHibernate<EmailTemplate, Long> implements IEmailTemplateDAO{
|
||||
|
||||
@Override
|
||||
public List<EmailTemplate> getAll() {
|
||||
return list(EmailTemplate.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String initializeContent() {
|
||||
try{
|
||||
List<EmailTemplate> emailTemplates = list(EmailTemplate.class);
|
||||
for ( int i = 0; i < emailTemplates.size(); i++)
|
||||
// language.ordinal.equals(3) - English
|
||||
if ( emailTemplates.get(i).getType().ordinal() == 0 && emailTemplates.get(i).getLanguage().ordinal() == 3)
|
||||
return emailTemplates.get(i).getContent();
|
||||
}catch (Exception e){}
|
||||
|
||||
return " ";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String initializeSubject() {
|
||||
try{
|
||||
List<EmailTemplate> emailTemplates = list(EmailTemplate.class);
|
||||
for ( int i = 0; i < emailTemplates.size(); i++)
|
||||
// language.ordinal.equals(3) - English
|
||||
if ( emailTemplates.get(i).getType().ordinal() == 0 && emailTemplates.get(i).getLanguage().ordinal() == 3)
|
||||
return emailTemplates.get(i).getSubject();
|
||||
}catch (Exception e){}
|
||||
|
||||
return " ";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal) {
|
||||
for (int i = 0; i < list(EmailTemplate.class).size(); i++)
|
||||
if (list(EmailTemplate.class).get(i).getLanguage().ordinal() == languageOrdinal &&
|
||||
// emailTemplateTypeOrdinal + 1, because first value is 0
|
||||
list(EmailTemplate.class).get(i).getType().ordinal() == emailTemplateTypeOrdinal + 1)
|
||||
return list(EmailTemplate.class).get(i).getContent();
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal) {
|
||||
for (int i = 0; i < list(EmailTemplate.class).size(); i++)
|
||||
// emailTemplateTypeOrdinal + 1, because first value is 0
|
||||
if ( list(EmailTemplate.class).get(i).getType().ordinal() == emailTemplateTypeOrdinal + 1 &&
|
||||
list(EmailTemplate.class).get(i).getLanguage().ordinal() == languageOrdinal )
|
||||
return list(EmailTemplate.class).get(i).getContent();
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.daos;
|
||||
|
||||
import org.libreplan.business.common.daos.IGenericDAO;
|
||||
import org.libreplan.business.email.entities.EmailNotification;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Contract for {@link EmailNotificationDAO}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 19.10.15.
|
||||
*/
|
||||
public interface IEmailNotificationDAO extends IGenericDAO<EmailNotification, Long> {
|
||||
List<EmailNotification> getAll();
|
||||
boolean deleteAll();
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.daos;
|
||||
|
||||
import org.libreplan.business.common.daos.IGenericDAO;
|
||||
import org.libreplan.business.email.entities.EmailTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* DAO interface for the <code>EmailTemplate</code> entity.
|
||||
* Contract for {@link EmailTemplateDAO}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 29.09.15.
|
||||
*/
|
||||
public interface IEmailTemplateDAO extends IGenericDAO<EmailTemplate, Long>{
|
||||
|
||||
List<EmailTemplate> getAll();
|
||||
|
||||
String initializeContent();
|
||||
String initializeSubject();
|
||||
|
||||
String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal);
|
||||
String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal);
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.entities;
|
||||
|
||||
import org.libreplan.business.common.BaseEntity;
|
||||
|
||||
import org.libreplan.business.planner.entities.TaskElement;
|
||||
import org.libreplan.business.resources.entities.Resource;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* EmailNotification entity representing table: notification_queue.
|
||||
* This class is intended to work as a Hibernate component.
|
||||
* It represents the Email notification to be send to user.
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 19.10.15.
|
||||
*/
|
||||
public class EmailNotification extends BaseEntity {
|
||||
|
||||
private EmailTemplateEnum type;
|
||||
|
||||
private Date updated;
|
||||
|
||||
private Resource resource;
|
||||
|
||||
private TaskElement task;
|
||||
|
||||
private TaskElement project;
|
||||
|
||||
|
||||
public EmailTemplateEnum getType() {
|
||||
return type;
|
||||
}
|
||||
public void setType(EmailTemplateEnum type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public Date getUpdated() {
|
||||
return updated;
|
||||
}
|
||||
public void setUpdated(Date updated) {
|
||||
this.updated = updated;
|
||||
}
|
||||
|
||||
public Resource getResource() {
|
||||
return resource;
|
||||
}
|
||||
public void setResource(Resource resource) {
|
||||
this.resource = resource;
|
||||
}
|
||||
|
||||
public TaskElement getTask() {
|
||||
return task;
|
||||
}
|
||||
public void setTask(TaskElement task) {
|
||||
this.task = task;
|
||||
}
|
||||
|
||||
public TaskElement getProject() {
|
||||
return project;
|
||||
}
|
||||
public void setProject(TaskElement project) {
|
||||
this.project = project;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.entities;
|
||||
|
||||
import org.libreplan.business.common.BaseEntity;
|
||||
import org.libreplan.business.settings.entities.Language;
|
||||
|
||||
/**
|
||||
* EmailTemplate entity, represents a template that LibrePlan user may use.
|
||||
* This class is intended to work as a Hibernate component.
|
||||
* It represents the E-mail template to be modified by admin and send to user.
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 29.09.15.
|
||||
*/
|
||||
public class EmailTemplate extends BaseEntity {
|
||||
|
||||
private EmailTemplateEnum type = EmailTemplateEnum.TEMPLATE_TASK_ASSIGNED_TO_RESOURCE;
|
||||
|
||||
private Language language = Language.ENGLISH_LANGUAGE;
|
||||
|
||||
private String content;
|
||||
|
||||
private String subject;
|
||||
|
||||
public EmailTemplateEnum getType() {
|
||||
return type;
|
||||
}
|
||||
public void setType(EmailTemplateEnum type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public Language getLanguage() {
|
||||
return language;
|
||||
}
|
||||
public void setLanguage(Language language) {
|
||||
this.language = language;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String getSubject() {
|
||||
return subject;
|
||||
}
|
||||
public void setSubject(String subject) {
|
||||
this.subject = subject;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.business.email.entities;
|
||||
|
||||
import static org.libreplan.business.i18n.I18nHelper._;
|
||||
|
||||
/**
|
||||
* Available E-mail templates.
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 28.09.15.
|
||||
*
|
||||
* TEMPLATE_N(_("Template N")) - for i18n
|
||||
* TEMPLATE_A("Template A") - for general use (no internationalizing)
|
||||
*/
|
||||
public enum EmailTemplateEnum {
|
||||
|
||||
TEMPLATE_TASK_ASSIGNED_TO_RESOURCE(_("Task assigned to resource"));
|
||||
|
||||
private final String templateType;
|
||||
|
||||
EmailTemplateEnum(String templateType) {
|
||||
this.templateType = templateType;
|
||||
}
|
||||
|
||||
public String getTemplateType() {
|
||||
return templateType;
|
||||
}
|
||||
}
|
||||
|
|
@ -40,7 +40,7 @@ public enum OrderStatusEnum {
|
|||
ON_HOLD(_("ON HOLD")),
|
||||
FINISHED(_("FINISHED")),
|
||||
CANCELLED(_("CANCELLED")),
|
||||
STORED(_("STORED"));
|
||||
STORED(_("ARCHIVED"));
|
||||
|
||||
private String description;
|
||||
|
||||
|
|
|
|||
|
|
@ -18,47 +18,6 @@
|
|||
*/
|
||||
package org.libreplan.business.users.bootstrap;
|
||||
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_CALENDARS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_CALENDAR_EXCEPTION_DAYS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_COMPANIES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_COST_CATEGORIES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_CREATE_PROJECTS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_CRITERIA;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_EDIT_ALL_PROJECTS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_ESTIMATED_PLANNED_HOURS_PER_TASK_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_EXPENSES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_HOURS_TYPES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_HOURS_WORKED_PER_RESOURCE_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_JOB_SCHEDULING;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_LABELS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_MACHINES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_MAIN_SETTINGS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIALS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIALS_NEED_AT_DATE_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIAL_UNITS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_PLANNING;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_PROFILES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_PROGRESS_TYPES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_PROJECT_COSTS_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_PROJECT_STATUS_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_QUALITY_FORMS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_READ_ALL_PROJECTS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_RECEIVED_FROM_CUSTOMERS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_RECEIVED_FROM_SUBCONTRACTORS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_SEND_TO_CUSTOMERS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_SEND_TO_SUBCONTRACTORS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TEMPLATES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEETS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEETS_TEMPLATES;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEET_LINES_LIST;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_TOTAL_WORKED_HOURS_BY_RESOURCE_IN_A_MONTH_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_USER_ACCOUNTS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_VIRTUAL_WORKERS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_WORKERS;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_WORK_AND_PROGRESS_PER_PROJECT_REPORT;
|
||||
import static org.libreplan.business.users.entities.UserRole.ROLE_WORK_AND_PROGRESS_PER_TASK_REPORT;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
|
@ -66,16 +25,18 @@ import java.util.Set;
|
|||
import org.libreplan.business.users.entities.Profile;
|
||||
import org.libreplan.business.users.entities.UserRole;
|
||||
|
||||
import static org.libreplan.business.users.entities.UserRole.*;
|
||||
/**
|
||||
* Defines the default {@link org.libreplan.business.users.entities.Profile
|
||||
* Profiles}
|
||||
*
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public enum PredefinedProfiles {
|
||||
|
||||
SYSTEMS_ADMINISTRATOR("Systems Administrator", ROLE_MAIN_SETTINGS,
|
||||
ROLE_USER_ACCOUNTS, ROLE_PROFILES, ROLE_JOB_SCHEDULING),
|
||||
ROLE_USER_ACCOUNTS, ROLE_PROFILES, ROLE_JOB_SCHEDULING, ROLE_EDIT_EMAIL_TEMPLATES),
|
||||
|
||||
PROJECT_MANAGER("Project Manager", ROLE_READ_ALL_PROJECTS,
|
||||
ROLE_EDIT_ALL_PROJECTS, ROLE_CREATE_PROJECTS, ROLE_PLANNING,
|
||||
|
|
|
|||
|
|
@ -28,21 +28,26 @@ import static org.libreplan.business.i18n.I18nHelper._;
|
|||
*
|
||||
* @author Fernando Bellas Permuy <fbellas@udc.es>
|
||||
* @author Manuel Rego Casasnovas <rego@igalia.com>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public enum UserRole {
|
||||
|
||||
// Access to all pages
|
||||
ROLE_SUPERUSER(_("Superuser")),
|
||||
|
||||
// Web services roles
|
||||
ROLE_WS_READER(_("Web service reader")),
|
||||
ROLE_WS_WRITER(_("Web service writer")),
|
||||
ROLE_WS_SUBCONTRACTING(_("Web service subcontractor operations")),
|
||||
|
||||
// Project operations roles
|
||||
ROLE_READ_ALL_PROJECTS(_("Read all projects")),
|
||||
ROLE_EDIT_ALL_PROJECTS(_("Edit all projects")),
|
||||
ROLE_CREATE_PROJECTS(_("Create projects")),
|
||||
|
||||
// Special role for bound users
|
||||
ROLE_BOUND_USER(_("Bound user")),
|
||||
|
||||
// Page roles
|
||||
ROLE_PLANNING(_("Planning")),
|
||||
ROLE_TEMPLATES(_("Templates")),
|
||||
|
|
@ -81,7 +86,11 @@ public enum UserRole {
|
|||
ROLE_PROJECT_COSTS_REPORT(_("Project Costs Report")),
|
||||
ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT(_("Task Scheduling Status In Project Report")),
|
||||
ROLE_MATERIALS_NEED_AT_DATE_REPORT(_("Materials Needed At Date Report")),
|
||||
ROLE_PROJECT_STATUS_REPORT(_("Project Status Report"));
|
||||
ROLE_PROJECT_STATUS_REPORT(_("Project Status Report")),
|
||||
|
||||
ROLE_EDIT_EMAIL_TEMPLATES(_("Edit E-mail Templates")),
|
||||
|
||||
ROLE_EMAIL_TASK_ASSIGNED_TO_RESOURCE(_("Email task assigned to resource"));
|
||||
|
||||
private final String displayName;
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,9 @@
|
|||
<value>
|
||||
org/libreplan/business/common/entities/JobSchedulerConfiguration.hbm.xml
|
||||
</value>
|
||||
<value>
|
||||
org/libreplan/business/email/entities/Email.hbm.xml
|
||||
</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
|
|
@ -143,6 +146,9 @@
|
|||
<property name="exampleUsersDisabled">
|
||||
<value>${default.exampleUsersDisabled}</value>
|
||||
</property>
|
||||
<property name="emailSendingEnabled">
|
||||
<value>${default.emailSendingEnabled}</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="scenarioManager"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||
<hibernate-mapping package="org.libreplan.business.email.entities" default-access="field">
|
||||
|
||||
<class name="org.libreplan.business.email.entities.EmailTemplate" abstract="true" table="email_template">
|
||||
|
||||
<id name="id" access="property" type="long">
|
||||
<generator class="hilo" >
|
||||
<param name="max_lo">100</param>
|
||||
</generator>
|
||||
</id>
|
||||
|
||||
<property name="type" column="type">
|
||||
<type name="org.hibernate.type.EnumType">
|
||||
<param name="enumClass">org.libreplan.business.email.entities.EmailTemplateEnum</param>
|
||||
</type>
|
||||
</property>
|
||||
|
||||
<property name="language" column="language">
|
||||
<type name="org.hibernate.type.EnumType">
|
||||
<param name="enumClass">org.libreplan.business.settings.entities.Language</param>
|
||||
</type>
|
||||
</property>
|
||||
|
||||
<property name="content" column="content" />
|
||||
<property name="subject" column="subject" />
|
||||
|
||||
</class>
|
||||
|
||||
<class name="EmailNotification" abstract="true" table="notification_queue">
|
||||
|
||||
<id name="id" access="property" type="long">
|
||||
<generator class="hilo">
|
||||
<param name="max_lo">100</param>
|
||||
</generator>
|
||||
</id>
|
||||
|
||||
<property name="type" column="type">
|
||||
<type name="org.hibernate.type.EnumType">
|
||||
<param name="enumClass">org.libreplan.business.email.entities.EmailTemplateEnum</param>
|
||||
</type>
|
||||
</property>
|
||||
|
||||
<property name="updated" column="updated"/>
|
||||
|
||||
<many-to-one name="resource"
|
||||
class="org.libreplan.business.resources.entities.Resource" column="resource" lazy="false"/>
|
||||
|
||||
<many-to-one name="task"
|
||||
class="org.libreplan.business.planner.entities.TaskElement" column="task" lazy="false"/>
|
||||
|
||||
<many-to-one name="project"
|
||||
class="org.libreplan.business.planner.entities.TaskElement" column="project" lazy="false"/>
|
||||
|
||||
</class>
|
||||
|
||||
</hibernate-mapping>
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
<property name="surname"/>
|
||||
<property name="nif"/>
|
||||
|
||||
<many-to-one name="user" cascade="save-update"
|
||||
<many-to-one name="user" cascade="save-update" access="property" lazy="false"
|
||||
class="org.libreplan.business.users.entities.User"
|
||||
column="user_id" unique="true" />
|
||||
|
||||
|
|
|
|||
|
|
@ -90,5 +90,4 @@
|
|||
<property name="budget" scale="2" access="field" />
|
||||
</joined-subclass>
|
||||
</class>
|
||||
|
||||
</hibernate-mapping>
|
||||
|
|
|
|||
|
|
@ -40,9 +40,6 @@
|
|||
<value>
|
||||
org/libreplan/business/orders/entities/Orders.hbm.xml
|
||||
</value>
|
||||
<value>
|
||||
org/libreplan/business/templates/entities/Templates.hbm.xml
|
||||
</value>
|
||||
<value>
|
||||
org/libreplan/business/planner/entities/Tasks.hbm.xml
|
||||
</value>
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
<name>LibrePlan Web Client Module</name>
|
||||
|
||||
<profiles>
|
||||
|
||||
<profile>
|
||||
<id>reports</id>
|
||||
<activation>
|
||||
|
|
@ -71,6 +72,7 @@
|
|||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>userguide</id>
|
||||
<activation>
|
||||
|
|
@ -195,6 +197,7 @@
|
|||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>i18n</id>
|
||||
<activation>
|
||||
|
|
@ -430,6 +433,14 @@
|
|||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--Java mail-->
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>1.5.0-b01</version>
|
||||
</dependency>
|
||||
|
||||
<!-- JAX-RS API -->
|
||||
<dependency>
|
||||
<groupId>javax.ws.rs</groupId>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.importers;
|
||||
|
||||
|
||||
/**
|
||||
* Sends E-mail to users with data that storing in notification_queue table
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 13.10.15.
|
||||
*/
|
||||
|
||||
public interface ISendEmail {
|
||||
void sendEmail();
|
||||
}
|
||||
|
|
@ -0,0 +1,302 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.importers;
|
||||
|
||||
import org.libreplan.business.common.Configuration;
|
||||
import org.libreplan.business.common.daos.IConnectorDAO;
|
||||
import org.libreplan.business.common.entities.Connector;
|
||||
import org.libreplan.business.common.entities.ConnectorProperty;
|
||||
import org.libreplan.business.email.entities.EmailNotification;
|
||||
import org.libreplan.business.email.entities.EmailTemplate;
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.business.resources.entities.Resource;
|
||||
import org.libreplan.business.resources.entities.Worker;
|
||||
import org.libreplan.business.settings.entities.Language;
|
||||
import org.libreplan.web.email.IEmailNotificationModel;
|
||||
|
||||
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.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.mail.Message;
|
||||
import javax.mail.MessagingException;
|
||||
import javax.mail.Transport;
|
||||
import javax.mail.Session;
|
||||
import javax.mail.PasswordAuthentication;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import javax.mail.NoSuchProviderException;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Sends E-mail to users with data that storing in notification_queue table
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 13.10.15.
|
||||
*/
|
||||
@Component
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
public class SendEmail implements ISendEmail {
|
||||
|
||||
@Autowired
|
||||
private IEmailNotificationModel emailNotificationModel;
|
||||
|
||||
@Autowired
|
||||
private IConnectorDAO connectorDAO;
|
||||
|
||||
@Autowired
|
||||
private IWorkerModel workerModel;
|
||||
|
||||
@Autowired
|
||||
private IEmailTemplateModel emailTemplateModel;
|
||||
|
||||
private List<EmailNotification> notifications;
|
||||
private List<EmailTemplate> emailTemplates;
|
||||
|
||||
@Override
|
||||
public void sendEmail() {
|
||||
if ( Configuration.isEmailSendingEnabled() == true ){
|
||||
if (validConnection() == true){
|
||||
notifications = emailNotificationModel.getAll();
|
||||
for (int i = 0; i < notifications.size(); i++) composeMessageForUser(notifications.get(i));
|
||||
deleteAllNotificationsAfterSending();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void 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());
|
||||
|
||||
if ( currentWorker.getUser().getApplicationLanguage().equals(Language.BROWSER_LANGUAGE) ) {
|
||||
locale = new Locale(System.getProperty("user.language"));
|
||||
} else {
|
||||
locale = new Locale(currentWorker.getUser().getApplicationLanguage().getLocale().getLanguage());
|
||||
}
|
||||
|
||||
EmailTemplate currentEmailTemplate = findCurrentEmailTemplate(type, locale);
|
||||
|
||||
|
||||
// Modify text that will be composed
|
||||
String text = currentEmailTemplate.getContent();
|
||||
|
||||
if ( type.equals(EmailTemplateEnum.TEMPLATE_TASK_ASSIGNED_TO_RESOURCE) ){
|
||||
text = text.replaceAll("\\{username\\}", currentWorker.getUser().getLoginName());
|
||||
text = text.replaceAll("\\{firstname\\}", currentWorker.getUser().getFirstName());
|
||||
text = text.replaceAll("\\{lastname\\}", currentWorker.getUser().getLastName());
|
||||
text = text.replaceAll("\\{project\\}", notification.getProject().getName());
|
||||
text = text.replaceAll("\\{resource\\}", notification.getResource().getName());
|
||||
text = text.replaceAll("\\{task\\}", notification.getTask().getName());
|
||||
text = text.replaceAll("\\{url\\}", MultipleTabsPlannerController.WELCOME_URL);
|
||||
}
|
||||
|
||||
// Get/Set connection properties
|
||||
List<ConnectorProperty> emailConnectorProperties = getEmailConnectorProperties();
|
||||
|
||||
String receiver = currentWorker.getUser().getEmail();
|
||||
String protocol = null;
|
||||
String host = null;
|
||||
String port = null;
|
||||
String sender = null;
|
||||
String usrnme = null;
|
||||
String psswrd = null;
|
||||
|
||||
for (int i = 0; i < emailConnectorProperties.size(); i++){
|
||||
switch (i){
|
||||
case 1: {
|
||||
protocol = emailConnectorProperties.get(1).getValue();
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
host = emailConnectorProperties.get(2).getValue();
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
port = emailConnectorProperties.get(3).getValue();
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
sender = emailConnectorProperties.get(4).getValue();
|
||||
break;
|
||||
}
|
||||
case 5: {
|
||||
usrnme = emailConnectorProperties.get(5).getValue();
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
psswrd = emailConnectorProperties.get(6).getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set properties of connection
|
||||
Properties properties = new Properties();
|
||||
|
||||
if ( protocol.equals("STARTTLS") ) {
|
||||
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 ( protocol.equals("SMTP") ) {
|
||||
properties.put("mail.smtp.host", host);
|
||||
properties.put("mail.smtp.port", port);
|
||||
}
|
||||
|
||||
final String username = usrnme;
|
||||
final String password = psswrd;
|
||||
|
||||
/* It is very important to use Session.getInstance instead of Session.getDefaultInstance */
|
||||
Session mailSession = Session.getInstance(properties,
|
||||
new javax.mail.Authenticator() {
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
});
|
||||
|
||||
// Send message
|
||||
try{
|
||||
MimeMessage message = new MimeMessage(mailSession);
|
||||
|
||||
message.setFrom(new InternetAddress(sender));
|
||||
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receiver));
|
||||
|
||||
String subject = currentEmailTemplate.getSubject();
|
||||
message.setSubject(subject);
|
||||
|
||||
message.setText(text);
|
||||
|
||||
Transport.send(message);
|
||||
|
||||
|
||||
|
||||
} catch (MessagingException e){throw new RuntimeException(e);}
|
||||
|
||||
}
|
||||
|
||||
private void deleteAllNotificationsAfterSending(){
|
||||
emailNotificationModel.deleteAll();
|
||||
}
|
||||
|
||||
private List<ConnectorProperty> getEmailConnectorProperties() {
|
||||
|
||||
Connector connector = connectorDAO.findUniqueByName("E-mail");
|
||||
|
||||
List<ConnectorProperty> properties = connector.getProperties();
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
private EmailTemplate findCurrentEmailTemplate(EmailTemplateEnum templateEnum, Locale locale){
|
||||
emailTemplates = emailTemplateModel.getAll();
|
||||
for (EmailTemplate item : emailTemplates)
|
||||
if ( item.getType().equals(templateEnum) && item.getLanguage().getLocale().equals(locale) )
|
||||
return item;
|
||||
return null;
|
||||
}
|
||||
|
||||
private Worker getCurrentWorker(Long resourceID){
|
||||
List<Worker> workerList = workerModel.getWorkers();
|
||||
for(int i = 0; i < workerList.size(); i++)
|
||||
if ( workerList.get(i).getId().equals(resourceID) )
|
||||
return workerList.get(i);
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean validConnection(){
|
||||
List<ConnectorProperty> emailConnectorProperties = getEmailConnectorProperties();
|
||||
|
||||
String protocol = null;
|
||||
String host = null;
|
||||
String port = null;
|
||||
String usrnme = null;
|
||||
String psswrd = null;
|
||||
|
||||
for (int i = 0; i < emailConnectorProperties.size(); i++){
|
||||
switch (i){
|
||||
case 1: {
|
||||
protocol = emailConnectorProperties.get(1).getValue();
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
host = emailConnectorProperties.get(2).getValue();
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
port = emailConnectorProperties.get(3).getValue();
|
||||
break;
|
||||
}
|
||||
case 5: {
|
||||
usrnme = emailConnectorProperties.get(5).getValue();
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
psswrd = emailConnectorProperties.get(6).getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set properties of connection
|
||||
Properties properties = new Properties();
|
||||
|
||||
Transport transport = null;
|
||||
|
||||
try {
|
||||
if (protocol.equals("SMTP")) {
|
||||
properties.setProperty("mail.smtp.port", port);
|
||||
properties.setProperty("mail.smtp.host", host);
|
||||
Session session = Session.getInstance(properties, null);
|
||||
|
||||
transport = session.getTransport("smtp");
|
||||
if (usrnme.equals("") && psswrd.equals("")) transport.connect();
|
||||
} else if (protocol.equals("STARTTLS")) {
|
||||
properties.setProperty("mail.smtps.port", port);
|
||||
properties.setProperty("mail.smtps.host", host);
|
||||
Session session = Session.getInstance(properties, null);
|
||||
|
||||
transport = session.getTransport("smtps");
|
||||
if (!usrnme.equals("") && psswrd != null) transport.connect(host, usrnme, psswrd);
|
||||
}
|
||||
if (transport.isConnected()) return true;
|
||||
|
||||
} catch (NoSuchProviderException e) {}
|
||||
catch (MessagingException e) {}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.importers;
|
||||
|
||||
import org.quartz.JobExecutionContext;
|
||||
import org.quartz.JobExecutionException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
|
||||
/**
|
||||
* Sends E-mail to users with data that storing in notification_queue table
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 13.10.15.
|
||||
*
|
||||
*/
|
||||
|
||||
public class SendEmailJob extends QuartzJobBean {
|
||||
|
||||
@Override
|
||||
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
|
||||
ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().
|
||||
getJobDataMap().get("applicationContext");
|
||||
|
||||
ISendEmail sendEmail = (ISendEmail) applicationContext.getBean("sendEmail");
|
||||
sendEmail.sendEmail();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -835,8 +835,8 @@ public abstract class BaseCalendarEditionController extends
|
|||
comboItem.setLabel(parent.getName());
|
||||
comboItem.setParent(comboParents);
|
||||
|
||||
if ((version.getParent()) != null
|
||||
&& (parent.getId().equals(version.getParent().getId()))) {
|
||||
if ( (version.getParent() ) != null &&
|
||||
(parent.getId().equals(version.getParent().getId())) ) {
|
||||
comboParents.setSelectedItem(comboItem);
|
||||
}
|
||||
}
|
||||
|
|
@ -845,7 +845,7 @@ public abstract class BaseCalendarEditionController extends
|
|||
new EventListener() {
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (comboParents.getSelectedItem() != null) {
|
||||
if ( comboParents.getSelectedItem() != null ) {
|
||||
BaseCalendar parent = (BaseCalendar) comboParents
|
||||
.getSelectedItem().getValue();
|
||||
version.setParent(parent);
|
||||
|
|
@ -861,7 +861,7 @@ public abstract class BaseCalendarEditionController extends
|
|||
}, new Util.Setter<Comboitem>() {
|
||||
@Override
|
||||
public void set(Comboitem comboItem) {
|
||||
if (((comboItem != null)) && (comboItem.getValue() != null)
|
||||
if ( ((comboItem != null)) && (comboItem.getValue() != null )
|
||||
&& (comboItem.getValue() instanceof BaseCalendar)) {
|
||||
BaseCalendar parent = (BaseCalendar) comboItem
|
||||
.getValue();
|
||||
|
|
|
|||
|
|
@ -227,9 +227,8 @@ public abstract class BaseCRUDController<T extends IHumanIdentifiable> extends
|
|||
*/
|
||||
private void saveCommonActions() throws ValidationException {
|
||||
beforeSaving();
|
||||
|
||||
messagesForUser.clearMessages();
|
||||
save();
|
||||
|
||||
messagesForUser.showMessage(
|
||||
Level.INFO,
|
||||
_("{0} \"{1}\" saved", getEntityType(), getEntityBeingEdited()
|
||||
|
|
|
|||
|
|
@ -23,15 +23,22 @@ 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.ConcurrentModificationException;
|
||||
import java.util.Comparator;
|
||||
import java.util.Properties;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.Map;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.mail.Session;
|
||||
import javax.mail.Transport;
|
||||
import javax.mail.AuthenticationFailedException;
|
||||
import javax.mail.MessagingException;
|
||||
|
||||
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
|
@ -70,23 +77,27 @@ import org.zkoss.zk.ui.event.EventListener;
|
|||
import org.zkoss.zk.ui.event.Events;
|
||||
import org.zkoss.zk.ui.event.SelectEvent;
|
||||
import org.zkoss.zk.ui.util.GenericForwardComposer;
|
||||
import org.zkoss.zul.Button;
|
||||
import org.zkoss.zul.Combobox;
|
||||
import org.zkoss.zul.Constraint;
|
||||
import org.zkoss.zul.Grid;
|
||||
import org.zkoss.zul.Intbox;
|
||||
import org.zkoss.zul.Label;
|
||||
import org.zkoss.zul.Listbox;
|
||||
import org.zkoss.zul.Listitem;
|
||||
|
||||
|
||||
import org.zkoss.zul.ListitemRenderer;
|
||||
import org.zkoss.zul.Messagebox;
|
||||
import org.zkoss.zul.Radio;
|
||||
import org.zkoss.zul.Listbox;
|
||||
import org.zkoss.zul.Grid;
|
||||
import org.zkoss.zul.Combobox;
|
||||
import org.zkoss.zul.Intbox;
|
||||
import org.zkoss.zul.Textbox;
|
||||
import org.zkoss.zul.Radiogroup;
|
||||
import org.zkoss.zul.Listitem;
|
||||
import org.zkoss.zul.Row;
|
||||
import org.zkoss.zul.Constraint;
|
||||
import org.zkoss.zul.RowRenderer;
|
||||
import org.zkoss.zul.Comboitem;
|
||||
import org.zkoss.zul.Radio;
|
||||
import org.zkoss.zul.Button;
|
||||
import org.zkoss.zul.Label;
|
||||
import org.zkoss.zul.Rows;
|
||||
import org.zkoss.zul.SimpleListModel;
|
||||
import org.zkoss.zul.Textbox;
|
||||
import org.zkoss.zul.Messagebox;
|
||||
|
||||
import org.zkoss.zul.api.Window;
|
||||
import org.zkoss.zul.impl.InputElement;
|
||||
|
||||
|
|
@ -97,6 +108,7 @@ import org.zkoss.zul.impl.InputElement;
|
|||
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
|
||||
* @author Cristina Alavarino Perez <cristina.alvarino@comtecsf.es>
|
||||
* @author Ignacio Diaz Teijido <ignacio.diaz@comtecsf.es>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
public class ConfigurationController extends GenericForwardComposer {
|
||||
|
||||
|
|
@ -137,6 +149,14 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
|
||||
private Connector selectedConnector;
|
||||
|
||||
private Combobox protocolsCombobox;
|
||||
|
||||
private Textbox emailUsernameTextbox;
|
||||
|
||||
private Textbox emailPasswordTextbox;
|
||||
|
||||
private Textbox emailSenderTextbox;
|
||||
|
||||
@Override
|
||||
public void doAfterCompose(Component comp) throws Exception {
|
||||
super.doAfterCompose(comp);
|
||||
|
|
@ -221,36 +241,43 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
}
|
||||
|
||||
public void save() throws InterruptedException {
|
||||
ConstraintChecker.isValid(configurationWindow);
|
||||
if (checkValidEntitySequenceRows()) {
|
||||
try {
|
||||
configurationModel.confirm();
|
||||
configurationModel.init();
|
||||
messages.showMessage(Level.INFO, _("Changes saved"));
|
||||
if (getSelectedConnector() != null
|
||||
&& !configurationModel
|
||||
.scheduleOrUnscheduleJobs(getSelectedConnector())) {
|
||||
messages.showMessage(
|
||||
Level.ERROR,
|
||||
_("Scheduling or unscheduling of jobs for this connector is not completed"));
|
||||
|
||||
if ( getSelectedConnector().getName().equals("E-mail") && isEmailFieldsValid() == false) {
|
||||
messages.showMessage(Level.ERROR, _("Check username/password/sender fields"));
|
||||
} else {
|
||||
ConstraintChecker.isValid(configurationWindow);
|
||||
if (checkValidEntitySequenceRows()) {
|
||||
try {
|
||||
configurationModel.confirm();
|
||||
configurationModel.init();
|
||||
messages.showMessage(Level.INFO, _("Changes saved"));
|
||||
if (getSelectedConnector() != null
|
||||
&& !configurationModel
|
||||
.scheduleOrUnscheduleJobs(getSelectedConnector())) {
|
||||
messages.showMessage(
|
||||
Level.ERROR,
|
||||
_("Scheduling or unscheduling of jobs for this connector is not completed"));
|
||||
}
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
reloadConnectors();
|
||||
} catch (ValidationException e) {
|
||||
messages.showInvalidValues(e);
|
||||
} catch (ConcurrentModificationException e) {
|
||||
messages.showMessage(Level.ERROR, e.getMessage());
|
||||
configurationModel.init();
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
reloadConnectors();
|
||||
}
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
reloadConnectors();
|
||||
} catch (ValidationException e) {
|
||||
messages.showInvalidValues(e);
|
||||
} catch (ConcurrentModificationException e) {
|
||||
messages.showMessage(Level.ERROR, e.getMessage());
|
||||
configurationModel.init();
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
reloadConnectors();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void cancel() throws InterruptedException {
|
||||
configurationModel.cancel();
|
||||
messages.clearMessages();
|
||||
messages.showMessage(Level.INFO, _("Changes have been canceled"));
|
||||
reloadWindow();
|
||||
reloadEntitySequences();
|
||||
|
|
@ -305,12 +332,19 @@ 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);
|
||||
username = properties.get(PredefinedConnectorProperties.EMAIL_USERNAME);
|
||||
password = properties.get(PredefinedConnectorProperties.EMAIL_PASSWORD);
|
||||
String port = properties.get(PredefinedConnectorProperties.PORT);
|
||||
testEmailConnection(host, port, username, password);
|
||||
} else {
|
||||
throw new RuntimeException("Unknown connector");
|
||||
}
|
||||
|
|
@ -373,6 +407,58 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test E-mail connection
|
||||
*
|
||||
* @param host
|
||||
* the host
|
||||
* @param port
|
||||
* the port
|
||||
* @param username
|
||||
* the username
|
||||
* @param password
|
||||
* the password
|
||||
*/
|
||||
private void testEmailConnection(String host, String port, String username, String password){
|
||||
Properties props = System.getProperties();
|
||||
Transport transport = null;
|
||||
|
||||
try {
|
||||
if ( protocolsCombobox.getSelectedItem().getLabel().equals("SMTP") ){
|
||||
props.setProperty("mail.smtp.port", port);
|
||||
props.setProperty("mail.smtp.host", host);
|
||||
Session session = Session.getInstance(props, null);
|
||||
|
||||
transport = session.getTransport("smtp");
|
||||
if ( username.equals("") && password.equals("")) transport.connect();
|
||||
}
|
||||
else if ( protocolsCombobox.getSelectedItem().getLabel().equals("STARTTLS") ) {
|
||||
props.setProperty("mail.smtps.port", port);
|
||||
props.setProperty("mail.smtps.host", host);
|
||||
Session session = Session.getInstance(props, null);
|
||||
|
||||
transport = session.getTransport("smtps");
|
||||
if ( !username.equals("") && password != null ) transport.connect(host, username, password);
|
||||
}
|
||||
|
||||
messages.clearMessages();
|
||||
if ( transport.isConnected() ) messages.showMessage(Level.INFO, _("Connection successful!"));
|
||||
else if ( transport.isConnected() == false ) messages.showMessage(Level.WARNING, _("Connection unsuccessful"));
|
||||
}
|
||||
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<Row>) rows.getChildren()) {
|
||||
|
|
@ -1090,11 +1176,15 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
row.setValue(property);
|
||||
|
||||
Util.appendLabel(row, _(property.getKey()));
|
||||
appendValueTextbox(row, property);
|
||||
|
||||
// FIXME this is not perfect solution
|
||||
if ( property.getKey().equals("Protocol") ) appendValueCombobox(row, property);
|
||||
else appendValueTextbox(row, property);
|
||||
}
|
||||
|
||||
private void appendValueTextbox(Row row,
|
||||
final ConnectorProperty property) {
|
||||
|
||||
final Textbox textbox = new Textbox();
|
||||
textbox.setWidth("400px");
|
||||
textbox.setConstraint(checkPropertyValue(property));
|
||||
|
|
@ -1112,37 +1202,108 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
property.setValue(value);
|
||||
}
|
||||
});
|
||||
if (property.getKey().equals(
|
||||
PredefinedConnectorProperties.PASSWORD)) {
|
||||
|
||||
if ( property.getKey().equals(
|
||||
PredefinedConnectorProperties.PASSWORD) ||
|
||||
property.getKey().equals(
|
||||
PredefinedConnectorProperties.EMAIL_PASSWORD) ) {
|
||||
textbox.setType("password");
|
||||
}
|
||||
|
||||
// Need for method validateEmailFields()
|
||||
if ( property.getKey().equals(
|
||||
PredefinedConnectorProperties.EMAIL_USERNAME) ) emailUsernameTextbox = textbox;
|
||||
|
||||
if ( property.getKey().equals(
|
||||
PredefinedConnectorProperties.EMAIL_PASSWORD) ) emailPasswordTextbox = textbox;
|
||||
|
||||
if ( property.getKey().equals(
|
||||
PredefinedConnectorProperties.EMAIL_SENDER) ) emailSenderTextbox = textbox;
|
||||
|
||||
row.appendChild(textbox);
|
||||
}
|
||||
|
||||
private void appendValueCombobox(Row row,
|
||||
final ConnectorProperty property){
|
||||
|
||||
final Combobox combobox = new Combobox();
|
||||
combobox.setWidth("400px");
|
||||
final List<String> protocols = new ArrayList<String>();
|
||||
protocols.add("SMTP");
|
||||
protocols.add("STARTTLS");
|
||||
|
||||
for (String item : protocols){
|
||||
Comboitem comboitem = new Comboitem();
|
||||
comboitem.setValue(item);
|
||||
comboitem.setLabel(item);
|
||||
comboitem.setParent(combobox);
|
||||
|
||||
if ( (!property.getValue().equals("")) &&
|
||||
(item.equals(property.getValue())) ){
|
||||
combobox.setSelectedItem(comboitem);
|
||||
}
|
||||
}
|
||||
|
||||
combobox.addEventListener(Events.ON_SELECT,
|
||||
new EventListener() {
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (combobox.getSelectedItem() != null){
|
||||
property.setValue(combobox.getSelectedItem().getValue().toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Util.bind(combobox, new Util.Getter<Comboitem>() {
|
||||
@Override
|
||||
public Comboitem get() {
|
||||
return combobox.getSelectedItem();
|
||||
}
|
||||
}, new Util.Setter<Comboitem>(){
|
||||
|
||||
@Override
|
||||
public void set(Comboitem item) {
|
||||
if ( (item != null) && (item.getValue() != null) &&
|
||||
(item.getValue() instanceof String) ){
|
||||
property.setValue(combobox.getSelectedItem().getValue().toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
row.appendChild(combobox);
|
||||
|
||||
// Need for testing E-mail connection
|
||||
protocolsCombobox = combobox;
|
||||
}
|
||||
|
||||
public Constraint checkPropertyValue(
|
||||
final ConnectorProperty property) {
|
||||
final String key = property.getKey();
|
||||
return new Constraint() {
|
||||
@Override
|
||||
public void validate(Component comp, Object value) {
|
||||
if (key.equals(PredefinedConnectorProperties.ACTIVATED)) {
|
||||
if (!((String) value).equalsIgnoreCase("Y")
|
||||
&& !((String) value).equalsIgnoreCase("N")) {
|
||||
if ( key.equals(PredefinedConnectorProperties.ACTIVATED) ) {
|
||||
if ( !((String) value).equalsIgnoreCase("Y")
|
||||
&& !((String) value).equalsIgnoreCase("N") ) {
|
||||
throw new WrongValueException(comp, _(
|
||||
"Only {0} allowed", "Y/N"));
|
||||
}
|
||||
} else if (key
|
||||
.equals(PredefinedConnectorProperties.SERVER_URL)
|
||||
|| key.equals(PredefinedConnectorProperties.USERNAME)
|
||||
|| key.equals(PredefinedConnectorProperties.PASSWORD)
|
||||
|| key.equals(PredefinedConnectorProperties.JIRA_HOURS_TYPE)) {
|
||||
} else if ( key
|
||||
.equals(PredefinedConnectorProperties.SERVER_URL) ||
|
||||
key.equals(PredefinedConnectorProperties.USERNAME) ||
|
||||
key.equals(PredefinedConnectorProperties.PASSWORD) ||
|
||||
key.equals(PredefinedConnectorProperties.JIRA_HOURS_TYPE) ||
|
||||
key.equals(PredefinedConnectorProperties.HOST) ||
|
||||
key.equals(PredefinedConnectorProperties.PORT) ||
|
||||
key.equals(PredefinedConnectorProperties.EMAIL_SENDER) ) {
|
||||
((InputElement) comp).setConstraint("no empty:"
|
||||
+ _("cannot be empty"));
|
||||
} else if (key
|
||||
.equals(PredefinedConnectorProperties.TIM_NR_DAYS_TIMESHEET)
|
||||
|| key.equals(PredefinedConnectorProperties.TIM_NR_DAYS_ROSTER)) {
|
||||
if (!isNumeric((String) value)) {
|
||||
} else if ( key
|
||||
.equals(PredefinedConnectorProperties.TIM_NR_DAYS_TIMESHEET) ||
|
||||
key.equals(PredefinedConnectorProperties.TIM_NR_DAYS_ROSTER) ||
|
||||
key.equals(PredefinedConnectorProperties.PORT) ) {
|
||||
if ( !isNumeric((String) value) ) {
|
||||
throw new WrongValueException(comp,
|
||||
_("Only digits allowed"));
|
||||
}
|
||||
|
|
@ -1163,4 +1324,17 @@ public class ConfigurationController extends GenericForwardComposer {
|
|||
};
|
||||
}
|
||||
|
||||
private boolean isEmailFieldsValid(){
|
||||
|
||||
if ( protocolsCombobox.getSelectedItem().getLabel().equals("STARTTLS") &&
|
||||
emailUsernameTextbox.getValue() != null &&
|
||||
emailPasswordTextbox.getValue() != null &&
|
||||
emailUsernameTextbox.getValue().length() != 0 &&
|
||||
emailPasswordTextbox.getValue().length() != 0 &&
|
||||
emailSenderTextbox.getValue().matches("^\\S+@\\S+\\.\\S+$") )
|
||||
return true;
|
||||
|
||||
else return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ import org.zkoss.zul.Vbox;
|
|||
* Controller for customMenu <br />
|
||||
* @author Lorenzo Tilve Álvaro <ltilve@igalia.com>
|
||||
* @author Fernando Bellas Permuy <fbellas@udc.es>
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
*/
|
||||
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"),
|
||||
"/email/email_templates.zul",
|
||||
"email-templates.html"));
|
||||
}
|
||||
|
||||
if (!configurationItems.isEmpty()) {
|
||||
topItem(_("Configuration"), "/common/configuration.zul", "",
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
package org.libreplan.web.common;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.libreplan.business.common.daos.IConnectorDAO;
|
||||
|
|
@ -34,6 +35,7 @@ import org.libreplan.importers.IImportRosterFromTim;
|
|||
import org.libreplan.importers.IJiraOrderElementSynchronizer;
|
||||
import org.libreplan.importers.ISchedulerManager;
|
||||
import org.libreplan.importers.SynchronizationInfo;
|
||||
import org.libreplan.importers.ISendEmail;
|
||||
import org.libreplan.web.common.concurrentdetection.OnConcurrentModification;
|
||||
import org.quartz.SchedulerException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
@ -42,6 +44,8 @@ import org.springframework.context.annotation.Scope;
|
|||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import static org.libreplan.web.I18nHelper._;
|
||||
|
||||
/**
|
||||
* Model for UI operations related to {@link JobSchedulerConfiguration}.
|
||||
*
|
||||
|
|
@ -75,6 +79,9 @@ public class JobSchedulerModel implements IJobSchedulerModel {
|
|||
|
||||
private List<SynchronizationInfo> synchronizationInfos;
|
||||
|
||||
@Autowired
|
||||
private ISendEmail email;
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public List<JobSchedulerConfiguration> getJobSchedulerConfigurations() {
|
||||
|
|
@ -105,6 +112,13 @@ public class JobSchedulerModel implements IJobSchedulerModel {
|
|||
.syncOrderElementsWithJiraIssues();
|
||||
return;
|
||||
}
|
||||
if ( name.equals(JobClassNameEnum.SEND_EMAIL_JOB.getName()) ) {
|
||||
synchronizationInfos = new ArrayList<SynchronizationInfo>();
|
||||
synchronizationInfos.add(new SynchronizationInfo(_("Send E-mail")));
|
||||
email.sendEmail();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new RuntimeException("Unknown action");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,299 @@
|
|||
package org.libreplan.web.dashboard;
|
||||
|
||||
import org.libreplan.business.orders.entities.Order;
|
||||
|
||||
import org.libreplan.web.orders.IOrderModel;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.util.GenericForwardComposer;
|
||||
import org.zkoss.zul.Checkbox;
|
||||
import org.zkoss.zul.Grid;
|
||||
import org.zkoss.zul.Label;
|
||||
import org.zkoss.zul.Rows;
|
||||
import org.zkoss.zul.Row;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 20.11.15.
|
||||
*/
|
||||
|
||||
@org.springframework.stereotype.Component
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
public class DashboardControllerGlobal extends GenericForwardComposer {
|
||||
|
||||
@Autowired
|
||||
private IOrderModel orderModel;
|
||||
|
||||
private Grid pipelineGrid;
|
||||
private Checkbox storedColumnVisible;
|
||||
|
||||
private List<Order> preSalesOrders = new ArrayList<Order>();
|
||||
private List<Order> offeredOrders = new ArrayList<Order>();
|
||||
private List<Order> outsourcedOrders = new ArrayList<Order>();
|
||||
private List<Order> acceptedOrders = new ArrayList<Order>();
|
||||
private List<Order> startedOrders = new ArrayList<Order>();
|
||||
private List<Order> onHoldOrders = new ArrayList<Order>();
|
||||
private List<Order> finishedOrders = new ArrayList<Order>();
|
||||
private List<Order> cancelledOrders = new ArrayList<Order>();
|
||||
private List<Order> storedOrders = new ArrayList<Order>();
|
||||
|
||||
@Override
|
||||
public void doAfterCompose(Component component) throws Exception {
|
||||
super.doAfterCompose(component);
|
||||
component.setVariable("dashboardControllerGlobal", this, true);
|
||||
fillOrderLists();
|
||||
setupPipelineGrid();
|
||||
showStoredColumn();
|
||||
}
|
||||
|
||||
public List<Order> getOrders(){
|
||||
return orderModel.getOrders();
|
||||
}
|
||||
|
||||
private void fillOrderLists() {
|
||||
for (Order orderItem : getOrders()){
|
||||
switch (orderItem.getState()){
|
||||
case PRE_SALES: {
|
||||
preSalesOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case OFFERED: {
|
||||
offeredOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case OUTSOURCED: {
|
||||
outsourcedOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case ACCEPTED: {
|
||||
acceptedOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case STARTED: {
|
||||
startedOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case ON_HOLD: {
|
||||
onHoldOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case FINISHED: {
|
||||
finishedOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case CANCELLED: {
|
||||
cancelledOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
case STORED: {
|
||||
storedOrders.add(orderItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setupPipelineGrid() throws ParseException {
|
||||
int rowsCount = findMaxList(preSalesOrders.size(), offeredOrders.size(), outsourcedOrders.size(), acceptedOrders.size(),
|
||||
startedOrders.size(), onHoldOrders.size(), finishedOrders.size(), cancelledOrders.size(), storedOrders.size());
|
||||
|
||||
Rows rows = new Rows();
|
||||
for (int i = 0; i < rowsCount; i++){
|
||||
Row row = new Row();
|
||||
for (int columns = 0; columns < 9; columns++) row.appendChild(new Label());
|
||||
rows.appendChild(row);
|
||||
}
|
||||
|
||||
pipelineGrid.appendChild(rows);
|
||||
|
||||
// Fill data into first column and so on with other columns divided by Enter in code
|
||||
|
||||
if ( preSalesOrders.size() > 0 )
|
||||
for (int i = 0; i < preSalesOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(preSalesOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(preSalesOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 0) ).setValue(preSalesOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + preSalesOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 0) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 0) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( offeredOrders.size() > 0 )
|
||||
for (int i = 0; i < offeredOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(offeredOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(offeredOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 1) ).setValue(offeredOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + offeredOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 1) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 1) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( outsourcedOrders.size() > 0 )
|
||||
for (int i = 0; i < outsourcedOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(outsourcedOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(outsourcedOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 2) ).setValue(outsourcedOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + outsourcedOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 2) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 2) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( acceptedOrders.size() > 0 )
|
||||
for (int i = 0; i < acceptedOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(acceptedOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(acceptedOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 3) ).setValue(acceptedOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + acceptedOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 3) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 3) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( startedOrders.size() > 0 )
|
||||
for (int i = 0; i < startedOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(startedOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(startedOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 4) ).setValue(startedOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + startedOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 4) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 4) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( onHoldOrders.size() > 0 )
|
||||
for (int i = 0; i < onHoldOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(onHoldOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(onHoldOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 5) ).setValue(onHoldOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + onHoldOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 5) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 5) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( finishedOrders.size() > 0 )
|
||||
for (int i = 0; i < finishedOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(finishedOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(finishedOrders.get(i));
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 6) ).setValue(finishedOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + finishedOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 6) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 6) ).setClass("label-highlight");
|
||||
}
|
||||
|
||||
|
||||
if ( cancelledOrders.size() > 0 )
|
||||
for (int i = 0; i < cancelledOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(cancelledOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(cancelledOrders.get(i));
|
||||
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 7) ).setValue(cancelledOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + cancelledOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 7) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 7) ).setClass("label-highlight");
|
||||
}
|
||||
}
|
||||
|
||||
private String getOrderInitDate(Order order) throws ParseException {
|
||||
// Remove time, timezone from full-date string
|
||||
DateFormat inputFormatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
|
||||
DateFormat outputFormatter = new SimpleDateFormat("EEE MMM dd yyyy");
|
||||
String input = "";
|
||||
String outputInit = "";
|
||||
String outputDeadline = "";
|
||||
Date date = null;
|
||||
|
||||
input = order.getInitDate().toString();
|
||||
date = inputFormatter.parse(input);
|
||||
|
||||
return outputInit = outputFormatter.format(date);
|
||||
}
|
||||
|
||||
private String getOrderDeadline(Order order) throws ParseException {
|
||||
// Remove time, timezone from full-date string
|
||||
DateFormat inputFormatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
|
||||
DateFormat outputFormatter = new SimpleDateFormat("EEE MMM dd yyyy");
|
||||
String input = "";
|
||||
String outputInit = "";
|
||||
String outputDeadline = "";
|
||||
Date date = null;
|
||||
|
||||
input = order.getDeadline().toString();
|
||||
date = inputFormatter.parse(input);
|
||||
|
||||
return outputDeadline = outputFormatter.format(date);
|
||||
}
|
||||
|
||||
public void showStoredColumn() throws ParseException {
|
||||
if ( storedColumnVisible.isChecked() ){
|
||||
if ( storedOrders.size() > 0 ){
|
||||
for (int i = 0; i < storedOrders.size(); i++){
|
||||
String outputInit = getOrderInitDate(storedOrders.get(i));
|
||||
String outputDeadline = getOrderDeadline(storedOrders.get(i));
|
||||
|
||||
pipelineGrid.getCell(i, 8).setVisible(true);
|
||||
|
||||
( (Label) pipelineGrid.getCell(i, 8) ).setValue(storedOrders.get(i).getName());
|
||||
String tooltipText = "Start date: " + outputInit +
|
||||
"\n" + "End date: " + outputDeadline +
|
||||
"\n" + "Progress: " + storedOrders.get(i).getAdvancePercentage() + " %";
|
||||
( (Label) pipelineGrid.getCell(i, 8) ).setTooltiptext(tooltipText);
|
||||
( (Label) pipelineGrid.getCell(i, 8) ).setClass("label-highlight");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( !storedColumnVisible.isChecked() ){
|
||||
for (int i = 0; i < storedOrders.size(); i++)
|
||||
pipelineGrid.getCell(i, 8).setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
private int findMaxList(int preSales, int offered, int outsourced, int accepted, int started, int onHold, int finished,
|
||||
int cancelled, int stored){
|
||||
|
||||
int[] sizes = {preSales, offered, outsourced, accepted, started, onHold, finished, cancelled, stored};
|
||||
int max = sizes[0];
|
||||
|
||||
for (int i = 1; i < sizes.length; i++)
|
||||
if ( sizes[i] > max ) max = sizes[i];
|
||||
|
||||
return max;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.web.email;
|
||||
|
||||
import org.libreplan.business.common.exceptions.ValidationException;
|
||||
|
||||
import org.libreplan.business.email.daos.IEmailNotificationDAO;
|
||||
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.business.email.entities.EmailNotification;
|
||||
|
||||
import org.libreplan.business.planner.entities.TaskElement;
|
||||
import org.libreplan.business.resources.entities.Resource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Model for operations related to {@link EmailNotification}.
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 21.10.15.
|
||||
*/
|
||||
|
||||
@Service
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
public class EmailNotificationModel implements IEmailNotificationModel {
|
||||
|
||||
@Autowired
|
||||
private IEmailNotificationDAO emailNotificationDAO;
|
||||
|
||||
private EmailTemplateEnum type;
|
||||
|
||||
private Date updated;
|
||||
|
||||
private Resource resource;
|
||||
|
||||
private TaskElement task;
|
||||
|
||||
private TaskElement project;
|
||||
|
||||
private EmailNotification emailNotification = new EmailNotification();
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void confirmSave() throws ValidationException {
|
||||
emailNotificationDAO.save(emailNotification);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<EmailNotification> getAll() {
|
||||
return emailNotificationDAO.getAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public boolean deleteAll() {
|
||||
return emailNotificationDAO.deleteAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setType(EmailTemplateEnum type) {
|
||||
this.emailNotification.setType(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUpdated(Date updated) {
|
||||
this.emailNotification.setUpdated(updated);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setResource(Resource resource) {
|
||||
this.emailNotification.setResource(resource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTask(TaskElement task) {
|
||||
this.emailNotification.setTask(task);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProject(TaskElement project) {
|
||||
this.emailNotification.setProject(project);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.web.email;
|
||||
|
||||
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
|
||||
import org.libreplan.business.common.exceptions.ValidationException;
|
||||
import org.libreplan.business.settings.entities.Language;
|
||||
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.web.common.IMessagesForUser;
|
||||
import org.libreplan.web.common.Level;
|
||||
import org.libreplan.web.common.MessagesForUser;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
|
||||
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
import org.zkoss.zk.ui.util.GenericForwardComposer;
|
||||
|
||||
import org.zkoss.zul.Listitem;
|
||||
import org.zkoss.zul.ListitemRenderer;
|
||||
import org.zkoss.zul.Textbox;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import static org.libreplan.web.I18nHelper._;
|
||||
|
||||
/**
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 25.09.15.
|
||||
*/
|
||||
public class EmailTemplateController extends GenericForwardComposer{
|
||||
|
||||
private IEmailTemplateModel emailTemplateModel;
|
||||
|
||||
|
||||
private IMessagesForUser messages;
|
||||
|
||||
private Component messagesContainer;
|
||||
|
||||
private Textbox contentsTextbox;
|
||||
|
||||
private Textbox subjectTextbox;
|
||||
|
||||
|
||||
public static ListitemRenderer languagesRenderer = new ListitemRenderer() {
|
||||
@Override
|
||||
public void render(org.zkoss.zul.Listitem item, Object data)
|
||||
throws Exception {
|
||||
Language language = (Language) data;
|
||||
String displayName = language.getDisplayName();
|
||||
item.setLabel(displayName);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void doAfterCompose(Component comp) throws Exception {
|
||||
super.doAfterCompose(comp);
|
||||
comp.setVariable("emailTemplateController", this, true);
|
||||
messages = new MessagesForUser(messagesContainer);
|
||||
contentsTextbox.setValue(getInitialContentData());
|
||||
subjectTextbox.setValue(getInitialSubjectData());
|
||||
}
|
||||
|
||||
public boolean save(){
|
||||
try {
|
||||
setSelectedContent();
|
||||
setSelectedSubject();
|
||||
emailTemplateModel.confirmSave();
|
||||
messages.clearMessages();
|
||||
messages.showMessage(Level.INFO, _("E-mail template saved"));
|
||||
return true;
|
||||
} catch (ValidationException e) {
|
||||
messages.showInvalidValues(e);
|
||||
} catch (InstanceNotFoundException e) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void cancel() throws InterruptedException {
|
||||
Executions.getCurrent().sendRedirect("../planner/index.zul");
|
||||
}
|
||||
|
||||
public Language getSelectedLanguage() {
|
||||
return emailTemplateModel.getLanguage();
|
||||
}
|
||||
|
||||
public void setSelectedLanguage(Language language){
|
||||
emailTemplateModel.setLanguage(language);
|
||||
|
||||
getContentDataBySelectedLanguage();
|
||||
}
|
||||
|
||||
public static ListitemRenderer getLanguagesRenderer() {
|
||||
return languagesRenderer;
|
||||
}
|
||||
public List<Language> getLanguages() {
|
||||
List<Language> languages = new LinkedList<Language>(Arrays.asList(Language.values()));
|
||||
Collections.sort(languages, new Comparator<Language>() {
|
||||
@Override
|
||||
public int compare(Language o1, Language o2) {
|
||||
if (o1.equals(Language.BROWSER_LANGUAGE)) {
|
||||
return -1;
|
||||
}
|
||||
if (o2.equals(Language.BROWSER_LANGUAGE)) {
|
||||
return 1;
|
||||
}
|
||||
return o1.getDisplayName().compareTo(o2.getDisplayName());
|
||||
}
|
||||
});
|
||||
languages.remove(0);
|
||||
return languages;
|
||||
}
|
||||
|
||||
|
||||
public EmailTemplateEnum getSelectedEmailTemplateEnum() {
|
||||
return emailTemplateModel.getEmailTemplateEnum();
|
||||
}
|
||||
public void setSelectedEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum){
|
||||
emailTemplateModel.setEmailTemplateEnum(emailTemplateEnum);
|
||||
|
||||
getContentDataBySelectedTemplate();
|
||||
}
|
||||
|
||||
public ListitemRenderer getEmailTemplateEnumRenderer() {
|
||||
return new ListitemRenderer() {
|
||||
@Override
|
||||
public void render(Listitem item, Object data) throws Exception {
|
||||
EmailTemplateEnum template = (EmailTemplateEnum) data;
|
||||
item.setLabel(_(template.getTemplateType()));
|
||||
item.setValue(template);
|
||||
}
|
||||
};
|
||||
}
|
||||
public List<EmailTemplateEnum> getEmailTemplateEnum() {
|
||||
return Arrays.asList(EmailTemplateEnum.values());
|
||||
}
|
||||
|
||||
|
||||
public void setSelectedContent(){
|
||||
emailTemplateModel.setContent(contentsTextbox.getValue());
|
||||
}
|
||||
public String getInitialContentData(){
|
||||
return emailTemplateModel.initializeContent();
|
||||
}
|
||||
|
||||
public void setSelectedSubject(){
|
||||
emailTemplateModel.setSubject(subjectTextbox.getValue());
|
||||
}
|
||||
public String getInitialSubjectData(){
|
||||
return emailTemplateModel.initializeSubject();
|
||||
}
|
||||
|
||||
private void getContentDataBySelectedLanguage(){
|
||||
contentsTextbox.setValue(emailTemplateModel.getContentBySelectedLanguage(getSelectedLanguage().ordinal(), getSelectedEmailTemplateEnum().ordinal()));
|
||||
}
|
||||
private void getContentDataBySelectedTemplate(){
|
||||
contentsTextbox.setValue( emailTemplateModel.getContentBySelectedTemplate( getSelectedEmailTemplateEnum().ordinal(), getSelectedLanguage().ordinal() ) );
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.web.email;
|
||||
|
||||
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
|
||||
import org.libreplan.business.settings.entities.Language;
|
||||
import org.libreplan.business.email.daos.IEmailTemplateDAO;
|
||||
import org.libreplan.business.email.entities.EmailTemplate;
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.web.common.concurrentdetection.OnConcurrentModification;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Model for operations related to {@link EmailTemplate}.
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 25.09.15.
|
||||
*/
|
||||
@Service
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
@OnConcurrentModification(goToPage = "/email/email_templates.zul")
|
||||
public class EmailTemplateModel implements IEmailTemplateModel {
|
||||
|
||||
@Autowired
|
||||
private IEmailTemplateDAO emailTemplateDAO;
|
||||
|
||||
private Language language = Language.ENGLISH_LANGUAGE;
|
||||
|
||||
private EmailTemplateEnum emailTemplateEnum = EmailTemplateEnum.TEMPLATE_TASK_ASSIGNED_TO_RESOURCE;
|
||||
|
||||
private String content;
|
||||
|
||||
private String subject;
|
||||
|
||||
private EmailTemplate emailTemplate = new EmailTemplate();
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void confirmSave() throws InstanceNotFoundException {
|
||||
|
||||
/* If current EmailTemplate entity (id) is existing in DB than it needs to update.
|
||||
* Else current EmailTemplate entity (id) is creating and getting new values from form.
|
||||
*/
|
||||
List<EmailTemplate> emailTemplates = emailTemplateDAO.getAll();
|
||||
EmailTemplate emailTemplateFromDatabase = null;
|
||||
|
||||
for (int i = 0; i < emailTemplates.size(); i++) {
|
||||
if ( emailTemplate.getLanguage() == emailTemplates.get(i).getLanguage() &&
|
||||
emailTemplate.getType() == emailTemplates.get(i).getType() ) {
|
||||
emailTemplateFromDatabase = emailTemplateDAO.find(emailTemplates.get(i).getId());
|
||||
}
|
||||
}
|
||||
|
||||
if ( emailTemplateFromDatabase != null ){
|
||||
EmailTemplate temporaryEntity = emailTemplate;
|
||||
emailTemplate = emailTemplateFromDatabase;
|
||||
|
||||
emailTemplate.setType(temporaryEntity.getType());
|
||||
emailTemplate.setLanguage(temporaryEntity.getLanguage());
|
||||
emailTemplate.setContent(temporaryEntity.getContent());
|
||||
emailTemplate.setSubject(temporaryEntity.getSubject());
|
||||
} else {
|
||||
EmailTemplate temporaryEntity = emailTemplate;
|
||||
emailTemplate = new EmailTemplate();
|
||||
|
||||
emailTemplate.setType(temporaryEntity.getType());
|
||||
emailTemplate.setLanguage(temporaryEntity.getLanguage());
|
||||
emailTemplate.setContent(temporaryEntity.getContent());
|
||||
emailTemplate.setSubject(temporaryEntity.getSubject());
|
||||
}
|
||||
|
||||
emailTemplateDAO.save(emailTemplate);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<EmailTemplate> getAll() {
|
||||
return emailTemplateDAO.getAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Language getLanguage() {
|
||||
return this.emailTemplate.getLanguage();
|
||||
}
|
||||
@Override
|
||||
public void setLanguage(Language language){ this.emailTemplate.setLanguage(language);}
|
||||
|
||||
@Override
|
||||
public EmailTemplateEnum getEmailTemplateEnum() {
|
||||
return this.emailTemplate.getType();
|
||||
}
|
||||
@Override
|
||||
public void setEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum) {
|
||||
this.emailTemplate.setType(emailTemplateEnum);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContent() {
|
||||
return this.emailTemplate.getContent();
|
||||
}
|
||||
@Override
|
||||
public void setContent(String content) {
|
||||
this.emailTemplate.setContent(content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSubject() {
|
||||
return this.emailTemplate.getSubject();
|
||||
}
|
||||
@Override
|
||||
public void setSubject(String subject) {
|
||||
this.emailTemplate.setSubject(subject);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String initializeContent() {
|
||||
return emailTemplateDAO.initializeContent();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String initializeSubject() { return emailTemplateDAO.initializeSubject(); }
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal) {
|
||||
return emailTemplateDAO.getContentBySelectedLanguage(languageOrdinal, emailTemplateTypeOrdinal);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal) {
|
||||
return emailTemplateDAO.getContentBySelectedTemplate(emailTemplateTypeOrdinal, languageOrdinal);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.web.email;
|
||||
|
||||
import org.libreplan.business.common.exceptions.ValidationException;
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.business.email.entities.EmailNotification;
|
||||
import org.libreplan.business.planner.entities.TaskElement;
|
||||
import org.libreplan.business.resources.entities.Resource;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Contract for {@link EmailNotification}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 21.10.15.
|
||||
*/
|
||||
public interface IEmailNotificationModel {
|
||||
|
||||
void confirmSave() throws ValidationException;
|
||||
|
||||
List<EmailNotification> getAll();
|
||||
|
||||
boolean deleteAll();
|
||||
|
||||
void setType(EmailTemplateEnum type);
|
||||
void setUpdated(Date date);
|
||||
void setResource(Resource resource);
|
||||
void setTask(TaskElement task);
|
||||
void setProject(TaskElement project);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* This file is part of LibrePlan
|
||||
*
|
||||
* Copyright (C) 2015 LibrePlan
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.libreplan.web.email;
|
||||
|
||||
import org.libreplan.business.common.exceptions.InstanceNotFoundException;
|
||||
import org.libreplan.business.common.exceptions.ValidationException;
|
||||
import org.libreplan.business.email.entities.EmailTemplate;
|
||||
import org.libreplan.business.settings.entities.Language;
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Contract for {@link EmailTemplate}
|
||||
*
|
||||
* Created by
|
||||
* @author Vova Perebykivskiy <vova@libreplan-enterprise.com>
|
||||
* on 28.09.15.
|
||||
*/
|
||||
public interface IEmailTemplateModel {
|
||||
|
||||
void confirmSave() throws ValidationException, InstanceNotFoundException;
|
||||
|
||||
List<EmailTemplate> getAll();
|
||||
|
||||
String initializeContent();
|
||||
String initializeSubject();
|
||||
|
||||
String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal);
|
||||
String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal);
|
||||
|
||||
String getContent();
|
||||
void setContent(String content);
|
||||
|
||||
Language getLanguage();
|
||||
void setLanguage(Language language);
|
||||
|
||||
EmailTemplateEnum getEmailTemplateEnum();
|
||||
void setEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum);
|
||||
|
||||
String getSubject();
|
||||
void setSubject(String subject);
|
||||
}
|
||||
|
|
@ -523,6 +523,8 @@ public class FormBinder {
|
|||
}
|
||||
});
|
||||
allocationProduced(allocationResult);
|
||||
|
||||
TaskPropertiesController.allocationResult = allocationResult;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import org.libreplan.business.orders.entities.Order;
|
|||
import org.libreplan.business.planner.entities.TaskElement;
|
||||
import org.libreplan.business.resources.daos.IResourcesSearcher;
|
||||
import org.libreplan.web.dashboard.DashboardController;
|
||||
import org.libreplan.web.dashboard.DashboardControllerGlobal;
|
||||
import org.libreplan.web.planner.order.OrderPlanningController;
|
||||
import org.libreplan.web.planner.order.PlanningStateCreator;
|
||||
import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState;
|
||||
|
|
@ -55,17 +56,19 @@ public class DashboardTabCreator {
|
|||
public static ITab create(Mode mode,
|
||||
PlanningStateCreator planningStateCreator,
|
||||
DashboardController dashboardController,
|
||||
DashboardControllerGlobal dashboardControllerGlobal,
|
||||
OrderPlanningController orderPlanningController,
|
||||
Component breadcrumbs,
|
||||
IResourcesSearcher resourcesSearcher) {
|
||||
return new DashboardTabCreator(mode, planningStateCreator,
|
||||
dashboardController, orderPlanningController, breadcrumbs,
|
||||
resourcesSearcher).build();
|
||||
dashboardController, dashboardControllerGlobal, orderPlanningController,
|
||||
breadcrumbs, resourcesSearcher).build();
|
||||
}
|
||||
|
||||
private final PlanningStateCreator planningStateCreator;
|
||||
private final Mode mode;
|
||||
private final DashboardController dashboardController;
|
||||
private final DashboardControllerGlobal dashboardControllerGlobal;
|
||||
private final OrderPlanningController orderPlanningController;
|
||||
private final Component breadcrumbs;
|
||||
private final IResourcesSearcher resourcesSearcher;
|
||||
|
|
@ -73,12 +76,14 @@ public class DashboardTabCreator {
|
|||
private DashboardTabCreator(Mode mode,
|
||||
PlanningStateCreator planningStateCreator,
|
||||
DashboardController dashboardController,
|
||||
DashboardControllerGlobal dashboardControllerGlobal,
|
||||
OrderPlanningController orderPlanningController,
|
||||
Component breadcrumbs,
|
||||
IResourcesSearcher resourcesSearcher) {
|
||||
this.mode = mode;
|
||||
this.planningStateCreator = planningStateCreator;
|
||||
this.dashboardController = dashboardController;
|
||||
this.dashboardControllerGlobal = dashboardControllerGlobal;
|
||||
this.orderPlanningController = orderPlanningController;
|
||||
this.breadcrumbs = breadcrumbs;
|
||||
this.resourcesSearcher = resourcesSearcher;
|
||||
|
|
@ -86,7 +91,7 @@ public class DashboardTabCreator {
|
|||
|
||||
private ITab build() {
|
||||
return TabOnModeType.forMode(mode)
|
||||
.forType(ModeType.GLOBAL, createDashboardTab())
|
||||
.forType(ModeType.GLOBAL, createDashboardGlobalTab())
|
||||
.forType(ModeType.ORDER, createDashboardTab())
|
||||
.create();
|
||||
}
|
||||
|
|
@ -129,6 +134,34 @@ public class DashboardTabCreator {
|
|||
}
|
||||
};
|
||||
}
|
||||
private ITab createDashboardGlobalTab(){
|
||||
IComponentCreator componentCreator = new IComponentCreator() {
|
||||
|
||||
@Override
|
||||
public org.zkoss.zk.ui.Component create(
|
||||
org.zkoss.zk.ui.Component parent) {
|
||||
Map<String, Object> arguments = new HashMap<String, Object>();
|
||||
arguments.put("dashboardControllerGlobal", dashboardControllerGlobal);
|
||||
return Executions.createComponents(
|
||||
"/dashboard/_dashboardforglobal.zul", parent,
|
||||
arguments);
|
||||
}
|
||||
|
||||
};
|
||||
return new CreatedOnDemandTab(_("Dashboard"), "global-dashboard",
|
||||
componentCreator) {
|
||||
|
||||
@Override
|
||||
protected void afterShowAction() {
|
||||
breadcrumbs.getChildren().clear();
|
||||
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
|
||||
breadcrumbs.appendChild(new Label(getSchedulingLabel()));
|
||||
breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR));
|
||||
breadcrumbs.appendChild(new Label(_("Dashboard")));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private List<TaskElement> getCriticalPath(final Order order, final Desktop desktop) {
|
||||
CriticalPathBuilder builder = CriticalPathBuilder.create(
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ import org.libreplan.web.common.ConfirmCloseUtil;
|
|||
import org.libreplan.web.common.entrypoints.EntryPointsHandler;
|
||||
import org.libreplan.web.common.entrypoints.URLHandlerRegistry;
|
||||
import org.libreplan.web.dashboard.DashboardController;
|
||||
import org.libreplan.web.dashboard.DashboardControllerGlobal;
|
||||
import org.libreplan.web.limitingresources.LimitingResourcesController;
|
||||
import org.libreplan.web.montecarlo.MonteCarloController;
|
||||
import org.libreplan.web.orders.OrderCRUDController;
|
||||
|
|
@ -67,6 +68,7 @@ import org.zkoss.ganttz.extensions.TabProxy;
|
|||
import org.zkoss.ganttz.util.LongOperationFeedback;
|
||||
import org.zkoss.ganttz.util.LongOperationFeedback.ILongOperation;
|
||||
import org.zkoss.zk.ui.Desktop;
|
||||
import org.zkoss.zk.ui.Execution;
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
|
|
@ -84,6 +86,8 @@ import org.zkoss.zk.ui.util.Composer;
|
|||
public class MultipleTabsPlannerController implements Composer,
|
||||
IGlobalViewEntryPoints {
|
||||
|
||||
public static String WELCOME_URL = "-- no URL provided --";
|
||||
|
||||
private final class TabWithLoadingFeedback extends TabProxy {
|
||||
private boolean feedback = true;
|
||||
|
||||
|
|
@ -183,6 +187,9 @@ public class MultipleTabsPlannerController implements Composer,
|
|||
@Autowired
|
||||
private DashboardController dashboardController;
|
||||
|
||||
@Autowired
|
||||
private DashboardControllerGlobal dashboardControllerGlobal;
|
||||
|
||||
private org.zkoss.zk.ui.Component breadcrumbs;
|
||||
|
||||
@Autowired
|
||||
|
|
@ -293,7 +300,7 @@ public class MultipleTabsPlannerController implements Composer,
|
|||
}, parameters);
|
||||
|
||||
dashboardTab = DashboardTabCreator.create(mode, planningStateCreator,
|
||||
dashboardController, orderPlanningController, breadcrumbs,
|
||||
dashboardController, dashboardControllerGlobal, orderPlanningController, breadcrumbs,
|
||||
resourcesSearcher);
|
||||
|
||||
final boolean isMontecarloVisible = isMonteCarloVisible();
|
||||
|
|
@ -321,7 +328,7 @@ public class MultipleTabsPlannerController implements Composer,
|
|||
resourceLoadTab, typeChanged));
|
||||
}
|
||||
tabsConfiguration.add(visibleOnlyAtOrderMode(advancedAllocationTab))
|
||||
.add(visibleOnlyAtOrderMode(dashboardTab));
|
||||
.add(tabWithNameReloading(dashboardTab, typeChanged));
|
||||
|
||||
if (isMontecarloVisible) {
|
||||
tabsConfiguration.add(visibleOnlyAtOrderMode(monteCarloTab));
|
||||
|
|
@ -419,6 +426,10 @@ public class MultipleTabsPlannerController implements Composer,
|
|||
@Override
|
||||
@Transactional(readOnly=true)
|
||||
public void doAfterCompose(org.zkoss.zk.ui.Component comp) {
|
||||
|
||||
Execution execution = Executions.getCurrent();
|
||||
WELCOME_URL = "http://" + execution.getServerName() + ":" + execution.getServerPort() + Executions.encodeURL("/planner/index.zul");
|
||||
|
||||
tabsSwitcher = (TabSwitcher) comp;
|
||||
breadcrumbs = comp.getPage().getFellow("breadcrumbs");
|
||||
tabsSwitcher
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import org.libreplan.business.advance.bootstrap.PredefinedAdvancedTypes;
|
|||
import org.libreplan.business.advance.entities.AdvanceType;
|
||||
import org.libreplan.business.advance.entities.DirectAdvanceAssignment;
|
||||
import org.libreplan.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
|
||||
import org.libreplan.business.email.entities.EmailTemplateEnum;
|
||||
import org.libreplan.business.orders.entities.Order;
|
||||
import org.libreplan.business.orders.entities.OrderElement;
|
||||
import org.libreplan.business.planner.entities.ITaskPositionConstrained;
|
||||
|
|
@ -40,10 +41,18 @@ import org.libreplan.business.planner.entities.PositionConstraintType;
|
|||
import org.libreplan.business.planner.entities.Task;
|
||||
import org.libreplan.business.planner.entities.TaskElement;
|
||||
import org.libreplan.business.planner.entities.TaskPositionConstraint;
|
||||
import org.libreplan.business.resources.entities.Resource;
|
||||
import org.libreplan.business.resources.entities.Worker;
|
||||
import org.libreplan.business.scenarios.IScenarioManager;
|
||||
import org.libreplan.business.users.entities.User;
|
||||
import org.libreplan.business.users.entities.UserRole;
|
||||
import org.libreplan.business.workingday.IntraDayDate;
|
||||
import org.libreplan.web.I18nHelper;
|
||||
import org.libreplan.web.common.Util;
|
||||
import org.libreplan.web.email.IEmailNotificationModel;
|
||||
import org.libreplan.web.orders.IOrderModel;
|
||||
import org.libreplan.web.planner.allocation.AllocationResult;
|
||||
import org.libreplan.web.resources.worker.IWorkerModel;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
|
|
@ -117,6 +126,16 @@ public class TaskPropertiesController extends GenericForwardComposer {
|
|||
|
||||
private boolean disabledConstraintsAndAllocations = false;
|
||||
|
||||
public static AllocationResult allocationResult;
|
||||
|
||||
private IEmailNotificationModel emailNotificationModel;
|
||||
|
||||
private IOrderModel orderModel;
|
||||
|
||||
private IWorkerModel workerModel;
|
||||
|
||||
|
||||
|
||||
public void init(final EditTaskController editTaskController,
|
||||
IContextWithPlannerTask<TaskElement> context,
|
||||
TaskElement taskElement) {
|
||||
|
|
@ -414,6 +433,8 @@ public class TaskPropertiesController extends GenericForwardComposer {
|
|||
}
|
||||
|
||||
public void accept() {
|
||||
EmailNotificationAddNewWithTaskAssignedToResource();
|
||||
|
||||
boolean ok = true;
|
||||
if (currentTaskElement instanceof ITaskPositionConstrained) {
|
||||
ok = saveConstraintChanges();
|
||||
|
|
@ -709,4 +730,49 @@ public class TaskPropertiesController extends GenericForwardComposer {
|
|||
return Util.getMoneyFormat();
|
||||
}
|
||||
|
||||
private void EmailNotificationAddNewWithTaskAssignedToResource(){
|
||||
|
||||
if ( allocationResult != null ) {
|
||||
|
||||
/* Check if resources in allocation are bound by user and are in role ROLE_EMAIL_TASK_ASSIGNED_TO_RESOURCE
|
||||
* setUser method calling manually because, after initialization user will be null
|
||||
* Then send valid data to notification_queue table */
|
||||
|
||||
List<Worker> workersList = workerModel.getWorkers();
|
||||
Worker currentWorker;
|
||||
Resource currentResource;
|
||||
User currentUser;
|
||||
|
||||
for (int i = 0; i < workersList.size(); i++)
|
||||
|
||||
for (int j = 0; j < allocationResult.getSpecificAllocations().size(); j++){
|
||||
|
||||
currentWorker = workersList.get(i);
|
||||
currentResource = allocationResult.getSpecificAllocations().get(j).getResource();
|
||||
|
||||
if ( currentWorker.getId().equals(currentResource.getId()) ){
|
||||
|
||||
workersList.get(i).setUser(workerModel.getBoundUserFromDB(currentWorker));
|
||||
currentUser = currentWorker.getUser();
|
||||
|
||||
if ( currentUser != null &&
|
||||
currentUser.isInRole(UserRole.ROLE_EMAIL_TASK_ASSIGNED_TO_RESOURCE) ) {
|
||||
|
||||
emailNotificationModel.setType(EmailTemplateEnum.TEMPLATE_TASK_ASSIGNED_TO_RESOURCE);
|
||||
|
||||
emailNotificationModel.setUpdated(new Date());
|
||||
|
||||
emailNotificationModel.setResource(allocationResult.getSpecificAllocations().get(j).getResource());
|
||||
|
||||
emailNotificationModel.setTask(currentTaskElement.getTaskSource().getTask());
|
||||
|
||||
emailNotificationModel.setProject(currentTaskElement.getParent().getTaskSource().getTask());
|
||||
|
||||
emailNotificationModel.confirmSave();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -8474,8 +8474,8 @@ msgid "CANCELLED"
|
|||
msgstr "CANCEL·LAT"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:41
|
||||
msgid "STORED"
|
||||
msgstr "EMMAGATZEMAT"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
msgid "Fully scheduled"
|
||||
|
|
|
|||
|
|
@ -8361,8 +8361,8 @@ msgid "SUBCONTRACTED PENDING PROJECT"
|
|||
msgstr "SUBKONTRAKTOVANÝ NEVYŘÍZENÝ PROJEKT"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:35
|
||||
msgid "STORED"
|
||||
msgstr "ULOŽENO"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
msgid "Fully scheduled"
|
||||
|
|
|
|||
|
|
@ -8362,7 +8362,7 @@ msgid "SUBCONTRACTED PENDING PROJECT"
|
|||
msgstr "UNTERVERGEBENES, AUSTEHENDES PROJEKT "
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:35
|
||||
msgid "STORED"
|
||||
msgid "ARCHIVED"
|
||||
msgstr "GESPEICHERT"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
|
|
|
|||
|
|
@ -9191,8 +9191,8 @@ msgid "CANCELLED"
|
|||
msgstr "CANCELADO"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgstr "ARCHIVADO"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
msgid "The criterion already exists into another task"
|
||||
|
|
|
|||
|
|
@ -9191,8 +9191,8 @@ msgid "CANCELLED"
|
|||
msgstr "ANNULE"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgstr "ENREGISTRE"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
msgid "The criterion already exists into another task"
|
||||
|
|
|
|||
|
|
@ -9190,8 +9190,8 @@ msgid "CANCELLED"
|
|||
msgstr "CANCELADO"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgstr "ARCHIVADO"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
msgid "The criterion already exists into another task"
|
||||
|
|
|
|||
|
|
@ -9188,7 +9188,7 @@ msgid "CANCELLED"
|
|||
msgstr "CANCELLATO"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgid "ARCHIVED"
|
||||
msgstr "IMMAGAZZINATO"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
@ -7762,6 +7764,7 @@ msgstr ""
|
|||
#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:59
|
||||
#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37
|
||||
#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:83
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -9185,7 +9188,7 @@ msgid "CANCELLED"
|
|||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
|
|
@ -9212,3 +9215,75 @@ 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 ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/common/entities/PredefinedConnectorProperties.java:56
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:79
|
||||
msgid "Possible content keywords"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController:90
|
||||
msgid "-- no URL provided --"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:1307
|
||||
msgid "Not correct E-mail address"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:82
|
||||
msgid "Keyword"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:89
|
||||
msgid "Username of user"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:94
|
||||
msgid "First name of user"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:99
|
||||
msgid "Last name of user"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:104
|
||||
msgid "Name of project"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:109
|
||||
msgid "Name of resource"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:114
|
||||
msgid "Name of task"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/email/email_templates.zul:119
|
||||
msgid "Welcome page"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-webapp/src/main/webapp/dashboard/_pipeline.zul:2
|
||||
msgid "Show archived column data"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -9006,8 +9006,8 @@ msgid "CANCELLED"
|
|||
msgstr "AVLYST"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgstr "LAGRET"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
msgid "Fully scheduled"
|
||||
|
|
|
|||
|
|
@ -9188,8 +9188,8 @@ msgid "CANCELLED"
|
|||
msgstr "AFGEBROKEN"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "STORED"
|
||||
msgstr "OPGESLAGEN"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539
|
||||
msgid "The criterion already exists into another task"
|
||||
|
|
|
|||
|
|
@ -7109,8 +7109,8 @@ msgid "SUBCONTRACTED PENDING PROJECT"
|
|||
msgstr "Nierozstrzygnięty pracowany"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:35
|
||||
msgid "STORED"
|
||||
msgstr "Przechowywane"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:215
|
||||
msgid "it's already somewhat scheduled"
|
||||
|
|
|
|||
|
|
@ -8476,8 +8476,8 @@ msgid "CANCELLED"
|
|||
msgstr "CANCELADO"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:41
|
||||
msgid "STORED"
|
||||
msgstr "Arquivado"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
msgid "Fully scheduled"
|
||||
|
|
|
|||
|
|
@ -6711,3 +6711,7 @@ msgstr "Итоговая стоимость"
|
|||
#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:54
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:43
|
||||
msgid "ARCHIVED"
|
||||
msgstr "Заархивированный"
|
||||
|
|
|
|||
|
|
@ -8474,8 +8474,8 @@ msgid "CANCELLED"
|
|||
msgstr "已取消"
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:41
|
||||
msgid "STORED"
|
||||
msgstr "STORED"
|
||||
msgid "ARCHIVED"
|
||||
msgstr ""
|
||||
|
||||
#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:366
|
||||
msgid "Fully scheduled"
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@
|
|||
<!-- Pages -->
|
||||
<intercept-url pattern="/templates/*"
|
||||
access="ROLE_SUPERUSER,ROLE_TEMPLATES" />
|
||||
<intercept-url pattern="/email/*"
|
||||
access="ROLE_SUPERUSER"/>
|
||||
<intercept-url pattern="/resources/worker/worker.zul"
|
||||
access="ROLE_SUPERUSER,ROLE_WORKERS" />
|
||||
<intercept-url pattern="/resources/machine/*"
|
||||
|
|
|
|||
|
|
@ -97,39 +97,51 @@
|
|||
<columns>
|
||||
<column label="${i18n:_('Field')}" width="150px"/>
|
||||
<column label="${i18n:_('Allowed values')}" />
|
||||
<column label="${i18n:_('Allowed Special Characters')}" />
|
||||
</columns>
|
||||
<rows>
|
||||
<row>
|
||||
<label value="${i18n:_('Seconds')}"/>
|
||||
<label value="0-59"/>
|
||||
<label value=", - * /"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Minutes')}"/>
|
||||
<label value="0-59"/>
|
||||
<label value=", - * /"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Hours')}"/>
|
||||
<label value="0-23"/>
|
||||
<label value=", - * /"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Day of month')}"/>
|
||||
<label value="1-31"/>
|
||||
<label value=", - * ? / L W"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Month')}"/>
|
||||
<span>1-12 (<label value="${i18n:_('or names')}"/> [JAN-DEC])</span>
|
||||
<label value=", - *"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Day of week')}"/>
|
||||
<span>0-7 (<label value="${i18n:_('0 or 7 is Sunday, or use names')}"/> [SUN-SAT])</span>
|
||||
<span>1-7 (<label value="${i18n:_('1 or 7 is Sunday, or use names')}"/> [SUN-SAT])</span>
|
||||
<label value=", - * ? / L #"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Year (optional)')}"/>
|
||||
<label value="1970-2099"/>
|
||||
<label value=", - *"/>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
<div>
|
||||
<div>
|
||||
${i18n:_("The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify “no specific value”. ")}
|
||||
</div>
|
||||
|
||||
${i18n:_("For more details on cron expression click")}
|
||||
<a href="http://www.manpagez.com/man/5/crontab/">${i18n:_('here')}.</a>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -999,7 +999,7 @@ span.z-dottree-line {
|
|||
}
|
||||
|
||||
span.perspective, span.perspective-active {
|
||||
margin: 0 2px;
|
||||
margin: 4px 2px;
|
||||
}
|
||||
|
||||
.perspectives-label {
|
||||
|
|
@ -1060,11 +1060,23 @@ span.perspective, span.perspective-active {
|
|||
.perspective-active.montecarlo-simulation .z-button-cm {
|
||||
background-image: url(../img/ico_montecarlo-simulation.png);
|
||||
}
|
||||
.perspective.global-dashboard .z-button-cm,
|
||||
.perspective-active.global-dashboard .z-button-cm {
|
||||
background-image: url(../img/ico_global-dashboard.png);
|
||||
}
|
||||
.perspective.order-dashboard .z-button-cm,
|
||||
.perspective-active.order-dashboard .z-button-cm {
|
||||
.perspective-active.order-dashboard .z-button-cm{
|
||||
background-image: url(../img/ico_order-dashboard.png);
|
||||
}
|
||||
|
||||
.label-highlight:hover{
|
||||
background-color: #aacbff;
|
||||
}
|
||||
|
||||
.global-dashboard-grid{
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
.perspectives-column {
|
||||
display:none;
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,43 @@
|
|||
<!--
|
||||
This file is part of LibrePlan
|
||||
|
||||
Copyright (C) 2015 LibrePlan
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<?taglib uri="/WEB-INF/tld/i18n.tld" prefix="i18n"?>
|
||||
<?component name="pipeline" inline="true" macroURI="_pipeline.zul"?>
|
||||
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="./wnd" ?>
|
||||
|
||||
|
||||
<zk>
|
||||
<div height="100%" style="overflow:visible">
|
||||
<div height="30px" sclass="toolbar-box" />
|
||||
|
||||
<window id="wnd" self="@{define(content)}" vflex="1">
|
||||
<tabbox width="100%">
|
||||
<tabs>
|
||||
<tab label="${i18n:_('Pipeline')}"/>
|
||||
</tabs>
|
||||
<tabpanels>
|
||||
<tabpanel>
|
||||
<pipeline/>
|
||||
</tabpanel>
|
||||
</tabpanels>
|
||||
</tabbox>
|
||||
</window>
|
||||
|
||||
</div>
|
||||
</zk>
|
||||
19
libreplan-webapp/src/main/webapp/dashboard/_pipeline.zul
Normal file
19
libreplan-webapp/src/main/webapp/dashboard/_pipeline.zul
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<window apply="org.libreplan.web.dashboard.DashboardControllerGlobal" contentStyle="overflow:auto;">
|
||||
<checkbox id="storedColumnVisible" label="${i18n:_('Show archived column data')}" checked="true" onCheck="dashboardControllerGlobal.showStoredColumn()"/>
|
||||
|
||||
<grid id="pipelineGrid" sclass="global-dashboard-grid">
|
||||
<columns>
|
||||
<column label="${i18n:_('PRE-SALES')}"/>
|
||||
<column label="${i18n:_('OFFERED')}"/>
|
||||
<column label="${i18n:_('OUTSOURCED')}"/>
|
||||
<column label="${i18n:_('ACCEPTED')}"/>
|
||||
<column label="${i18n:_('STARTED')}"/>
|
||||
<column label="${i18n:_('ON HOLD')}"/>
|
||||
<column label="${i18n:_('FINISHED')}"/>
|
||||
<column label="${i18n:_('CANCELLED')}"/>
|
||||
<column label="${i18n:_('ARCHIVED')}"/>
|
||||
</columns>
|
||||
</grid>
|
||||
</window>
|
||||
|
||||
|
||||
135
libreplan-webapp/src/main/webapp/email/email_templates.zul
Normal file
135
libreplan-webapp/src/main/webapp/email/email_templates.zul
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
<!--
|
||||
This file is part of LibrePlan
|
||||
|
||||
Copyright (C) 2015 LibrePlan
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
|
||||
<?page id="editEmailTemplate" title="${i18n:_('LibrePlan: Email Templates')}" ?>
|
||||
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
|
||||
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
|
||||
<?init class="org.zkoss.zk.ui.util.Composition" arg0="/common/layout/template.zul"?>
|
||||
|
||||
<?link rel="shortcut icon" href="/common/img/favicon.ico" type="image/x-icon"?>
|
||||
<?link rel="stylesheet" type="text/css" href="/common/css/libreplan.css"?>
|
||||
<?link rel="stylesheet" type="text/css" href="/common/css/libreplan_zk.css"?>
|
||||
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
||||
|
||||
<zk>
|
||||
<window self="@{define(content)}" apply="org.libreplan.web.email.EmailTemplateController"
|
||||
title="${i18n:_('Edit E-mail template')}">
|
||||
<vbox id="messagesContainer" />
|
||||
<tabbox>
|
||||
<tabs>
|
||||
<tab label="${i18n:_('Template data')}"/>
|
||||
</tabs>
|
||||
<tabpanels>
|
||||
<tabpanel>
|
||||
<groupbox>
|
||||
<caption label="General user data" />
|
||||
<grid>
|
||||
<columns>
|
||||
<column width="220px"></column>
|
||||
<column width="420px"></column>
|
||||
</columns>
|
||||
<rows>
|
||||
<row>
|
||||
<label value="Select template language"/>
|
||||
<listbox mold="select"
|
||||
id="templateLanguageListbox"
|
||||
model="@{emailTemplateController.languages}"
|
||||
itemRenderer="@{emailTemplateController.languagesRenderer}"
|
||||
selectedItem="@{emailTemplateController.selectedLanguage}">
|
||||
</listbox>
|
||||
</row>
|
||||
<row>
|
||||
<label value="Select template type"/>
|
||||
<listbox id="emailTemplateTypeListbox"
|
||||
mold="select"
|
||||
model="@{emailTemplateController.emailTemplateEnum}"
|
||||
itemRenderer="@{emailTemplateController.emailTemplateEnumRenderer}"
|
||||
selectedItem="@{emailTemplateController.selectedEmailTemplateEnum}"/>
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('E-mail subject')}"/>
|
||||
<textbox id="subjectTextbox"
|
||||
width="400px;" />
|
||||
</row>
|
||||
<row>
|
||||
<label value="${i18n:_('Template contents')}"/>
|
||||
|
||||
<textbox id="contentsTextbox"
|
||||
rows="15" width="400px;"
|
||||
tabindex="11"/>
|
||||
<groupbox closable="false" width="270px">
|
||||
<caption label="${i18n:_('Possible content keywords')}"/>
|
||||
<grid width="250px">
|
||||
<columns>
|
||||
<column label="${i18n:_('Keyword')}"/>
|
||||
<column label="${i18n:_('Description')}"/>
|
||||
</columns>
|
||||
|
||||
<rows>
|
||||
<row>
|
||||
<label value="{username}"/>
|
||||
<label value="${i18n:_('Username of user')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{firstname}"/>
|
||||
<label value="${i18n:_('First name of user')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{lastname}"/>
|
||||
<label value="${i18n:_('Last name of user')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{project}"/>
|
||||
<label value="${i18n:_('Name of project')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{resource}"/>
|
||||
<label value="${i18n:_('Name of resource')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{task}"/>
|
||||
<label value="${i18n:_('Name of task')}"/>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<label value="{url}"/>
|
||||
<label value="${i18n:_('Welcome page')}"/>
|
||||
</row>
|
||||
</rows>
|
||||
|
||||
</grid>
|
||||
</groupbox>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
</groupbox>
|
||||
</tabpanel>
|
||||
</tabpanels>
|
||||
</tabbox>
|
||||
<button onClick="emailTemplateController.save()" autodisable="self" label="${i18n:_('Save')}" sclass="save-button global-action"/>
|
||||
<button onClick="emailTemplateController.cancel()" label="${i18n:_('Cancel')}" sclass="cancel-button global-action"/>
|
||||
|
||||
</window>
|
||||
</zk>
|
||||
|
|
@ -34,7 +34,6 @@ import org.joda.time.LocalDate;
|
|||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.libreplan.importers.TimSoapClient;
|
||||
import org.libreplan.importers.tim.DataDTO;
|
||||
import org.libreplan.importers.tim.DepartmentDTO;
|
||||
import org.libreplan.importers.tim.DurationDTO;
|
||||
|
|
@ -95,7 +94,7 @@ public class TimSoapClientTest {
|
|||
return timeRegistrationDTO;
|
||||
}
|
||||
|
||||
private RosterRequestDTO createtRosterRequest() {
|
||||
private RosterRequestDTO createRosterRequest() {
|
||||
RosterDTO rosterDTO = new RosterDTO();
|
||||
rosterDTO.setStartDate(new LocalDate());
|
||||
rosterDTO.setEndDate(new LocalDate().plusDays(7));
|
||||
|
|
@ -186,7 +185,7 @@ public class TimSoapClientTest {
|
|||
.sendRequestReceiveResponse(properties.getProperty("url"),
|
||||
properties.getProperty("username"),
|
||||
properties.getProperty("password"),
|
||||
createtRosterRequest(), RosterResponseDTO.class);
|
||||
createRosterRequest(), RosterResponseDTO.class);
|
||||
if (rosterResponseDTO == null) {
|
||||
fail("Roster Response is null");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,9 +41,6 @@
|
|||
<value>
|
||||
org/libreplan/business/orders/entities/Orders.hbm.xml
|
||||
</value>
|
||||
<value>
|
||||
org/libreplan/business/templates/entities/Templates.hbm.xml
|
||||
</value>
|
||||
<value>
|
||||
org/libreplan/business/planner/entities/Tasks.hbm.xml
|
||||
</value>
|
||||
|
|
|
|||
11
pom.xml
11
pom.xml
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
<default.passwordsControl>true</default.passwordsControl>
|
||||
<default.exampleUsersDisabled>true</default.exampleUsersDisabled>
|
||||
<default.emailSendingEnabled>true</default.emailSendingEnabled>
|
||||
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
|
@ -233,18 +234,18 @@
|
|||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>4.3.4.Final</version>
|
||||
<version>4.3.11.Final</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-ehcache</artifactId>
|
||||
<version>4.3.4.Final</version>
|
||||
<version>4.3.11.Final</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
<version>4.2.0.Final</version>
|
||||
<version>4.3.2.Final</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
|
@ -328,7 +329,7 @@
|
|||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- datasource for testing -->
|
||||
|
|
@ -600,7 +601,7 @@
|
|||
<dependency>
|
||||
<groupId>org.quartz-scheduler</groupId>
|
||||
<artifactId>quartz</artifactId>
|
||||
<version>1.8.0</version>
|
||||
<version>1.8.6</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.slf4j</groupId>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue