Author: bleny
Date: 2011-02-08 14:48:56 +0000 (Tue, 08 Feb 2011)
New Revision: 995
Log:
evol #2605 : email for accidental captures
Modified:
trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java
trunk/wao-business/src/main/java/fr/ifremer/wao/WaoMigrationCallBack.java
trunk/wao-business/src/main/java/fr/ifremer/wao/WaoUtils.java
trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java
trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java
trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceUserImpl.java
trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties
trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties
trunk/wao-business/src/main/xmi/wao.zargo
trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java
trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Administration_fr.properties
trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties
trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties
trunk/wao-ui/src/main/webapp/Administration.tml
trunk/wao-ui/src/main/webapp/ContactForm.tml
trunk/wao-ui/src/main/webapp/css/contacts.css
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -755,4 +755,10 @@
queries.add("ALTER TABLE SampleRow ADD terrestrialLocationInfos TEXT;");
}
+
+ @Override
+ protected void addMammalsNotificationsColumns_2_1(List<String> queries) {
+ queries.add("ALTER TABLE WaoUser ADD mammalsNotifications BOOLEAN DEFAULT FALSE;");
+ queries.add("ALTER TABLE Contact ADD mammalsInfo TEXT");
+ }
}
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/WaoMigrationCallBack.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/WaoMigrationCallBack.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/WaoMigrationCallBack.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -123,6 +123,8 @@
protected abstract void addTerrestrialLocationOnSampleRowAndContact_2_0(List<String> queries);
+ protected abstract void addMammalsNotificationsColumns_2_1(List<String> queries);
+
protected static final Version[] VERSIONS = new Version[] {
VersionUtil.valueOf("1.0"),
VersionUtil.valueOf("1.1"),
@@ -131,7 +133,8 @@
VersionUtil.valueOf("1.4"),
VersionUtil.valueOf("1.5"),
VersionUtil.valueOf("1.6"),
- VersionUtil.valueOf("2.0")
+ VersionUtil.valueOf("2.0"),
+ VersionUtil.valueOf("2.1")
};
@Override
@@ -336,7 +339,7 @@
}
String[] strings = queries.toArray(new String[queries.size()]);
- executeSQL(tx, true, true, strings);
+ executeSQL(tx, showSql, showProgression, strings);
}
/** given "XXX_YYY et ZZZ_", will split with " et " and with "_" to extract
@@ -432,7 +435,20 @@
addTerrestrialLocationOnSampleRowAndContact_2_0(queries);
String[] strings = queries.toArray(new String[queries.size()]);
- executeSQL(tx, true, true, strings);
+ executeSQL(tx, showSql, showProgression, strings);
}
+ public void migrateTo_2_1(TopiaContextImplementor tx,
+ boolean showSql,
+ boolean showProgression) throws TopiaException {
+
+ List<String> queries = new LinkedList<String>();
+
+ addMammalsNotificationsColumns_2_1(queries);
+
+ String[] strings = queries.toArray(new String[queries.size()]);
+ executeSQL(tx, showSql, showProgression, strings);
+ }
+
+
}
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/WaoUtils.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/WaoUtils.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/WaoUtils.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -30,8 +30,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.Date;
-import java.util.Locale;
import static org.nuiton.i18n.I18n.l_;
@@ -120,4 +121,30 @@
public static String translate(String i18nKey, Object... args) {
return l_(context.getLocale(), i18nKey, args);
}
+
+ public static final String monthPattern = "MM/yyyy";
+ public static final String datePattern = "dd/MM/yyyy";
+ public static final String dateTimePattern = "dd/MM/yyyy HH:mm";
+ public static final String timePattern = "HH:mm";
+
+ public static String formatMonthTime(Date date) {
+ return formatDate(date, monthPattern);
+ }
+
+ public static String formatDate(Date date) {
+ return formatDate(date, datePattern);
+ }
+
+ public static String formatDateTime(Date date) {
+ return formatDate(date, dateTimePattern);
+ }
+
+ public static String formatTime(Date date) {
+ return formatDate(date, timePattern);
+ }
+
+ protected static String formatDate(Date date, String pattern) {
+ DateFormat dateFormat = new SimpleDateFormat(pattern, context.getLocale());
+ return dateFormat.format(date);
+ }
}
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -58,6 +58,7 @@
import fr.ifremer.wao.entity.SampleMonth;
import fr.ifremer.wao.entity.SampleRow;
import fr.ifremer.wao.entity.WaoUser;
+import fr.ifremer.wao.entity.WaoUserDAO;
import fr.ifremer.wao.io.ContactInput;
import fr.ifremer.wao.io.ImportRefusedException;
import fr.ifremer.wao.io.ImportResults;
@@ -71,6 +72,7 @@
import fr.ifremer.wao.io.csv.WaoCsvHeader.FISHING_ZONE;
import fr.ifremer.wao.io.csv.WaoCsvHeader.SAMPLING;
import org.apache.commons.lang.BooleanUtils;
+import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
@@ -91,6 +93,7 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -311,7 +314,7 @@
@Override
public void executeSaveContact(TopiaContext transaction,
Contact contact, boolean delete)
- throws TopiaException, NullSampleMonthException {
+ throws TopiaException, NullSampleMonthException, EmailException {
checkObserver(contact);
checkSampleRow(contact);
@@ -333,11 +336,87 @@
// Execute delete
dao.delete(contactFound);
} else {
+ notifyUsersForMammalsObservation(transaction, contactFound, contact);
createOrUpdateContact(dao, contact, contactFound, true);
}
transaction.commitTransaction();
}
+ protected void notifyUsersForMammalsObservation(TopiaContext transaction,
+ Contact contactFound, Contact contact) throws TopiaException {
+
+ boolean sendNotification = false;
+
+ // we send notifications if there is mammals Capture and
+ // we prevent re-send of multiple identical messages
+ if (contact.getMammalsCapture()) {
+ String oldMessage = null;
+ if (contactFound != null) {
+ oldMessage = contactFound.getMammalsInfo();
+ }
+ boolean messageChanged = ObjectUtils.notEqual(contact.getMammalsInfo(), oldMessage);
+ if (messageChanged) {
+ sendNotification = true;
+ }
+ }
+
+ if (sendNotification) {
+
+ String object = WaoUtils.translate(n_("wao.business.mammalsCapture.mail.subject"));
+
+ String boat = contact.getBoat().getName() + " (" +
+ contact.getBoat().getImmatriculation() + ")";
+ String time = "";
+ if (contact.getObservationBeginDate() != null) {
+ time = WaoUtils.formatDateTime(contact.getObservationBeginDate()) + " ";
+ }
+ if (contact.getObservationEndDate() != null) {
+ time += WaoUtils.formatDateTime(contact.getObservationEndDate());
+ }
+ SampleRow sampleRow = contact.getSampleRow();
+
+ List<String> facadesNames = new ArrayList<String>();
+ for (FishingZone fishingZone : sampleRow.getFishingZone()) {
+ facadesNames.add(fishingZone.getSectorName() + " (" + fishingZone.getFacadeName() + ")");
+ }
+ String profession = sampleRow.getCode() + " "
+ + " " + StringUtil.join(facadesNames, ", ", true)
+ + " " + sampleRow.getFishingZonesInfos()
+ + " " + sampleRow.getProfessionDescription()
+ + " " + sampleRow.getProfession().getLibelle()
+ + " " + sampleRow.getProfession().getSpecies();
+
+ String body = WaoUtils.translate(n_("wao.business.mammalsCapture.mail.message"),
+ boat, time, profession, contact.getMammalsInfo());
+
+ if (log.isDebugEnabled()) {
+ log.debug("will send email with object '" + object + "' and body \n" + body);
+ }
+
+
+ WaoUserDAO userDao = WaoDAOHelper.getWaoUserDAO(transaction);
+ // users contains all the user we need to notify for the capture
+ List<WaoUser> waoUsers = userDao.findAllByMammalsNotifications(true);
+
+ if (log.isDebugEnabled()) {
+ log.debug("notification will be sent to " + waoUsers.size() + " users");
+ }
+
+ for (WaoUser waoUser : waoUsers) {
+ String userLogin = waoUser.getLogin();
+ if (StringUtil.isEmail(userLogin)) {
+ try {
+ WaoUtils.sendEmail(userLogin, object, body);
+ } catch (EmailException e) {
+ if (log.isErrorEnabled()) {
+ log.error("unable to send email to " + userLogin, e);
+ }
+ }
+ }
+ }
+ }
+ }
+
protected void checkObserver(Contact contact) throws WaoException {
// Ano #2287 Temporary fix to avoid saving a null observer
if (contact.getMainObserver() == null) {
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -35,7 +35,13 @@
import fr.ifremer.wao.WaoProperty;
import fr.ifremer.wao.WaoQueryBuilder;
import fr.ifremer.wao.WaoQueryHelper;
-import fr.ifremer.wao.bean.*;
+import fr.ifremer.wao.bean.ConnectedUser;
+import fr.ifremer.wao.bean.FacadeRow;
+import fr.ifremer.wao.bean.FacadeRowImpl;
+import fr.ifremer.wao.bean.ObsProgram;
+import fr.ifremer.wao.bean.SamplingFilter;
+import fr.ifremer.wao.bean.SamplingStrategy;
+import fr.ifremer.wao.bean.UserRole;
import fr.ifremer.wao.entity.Boat;
import fr.ifremer.wao.entity.Company;
import fr.ifremer.wao.entity.CompanyDAO;
@@ -77,7 +83,6 @@
import org.nuiton.topia.framework.TopiaQuery;
import org.nuiton.topia.framework.TopiaQuery.Op;
import org.nuiton.util.DateUtil;
-import org.nuiton.util.ObjectUtil;
import org.nuiton.util.PeriodDates;
import org.nuiton.util.StringUtil;
import org.slf4j.Logger;
Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceUserImpl.java
===================================================================
--- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceUserImpl.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceUserImpl.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -39,7 +39,6 @@
import fr.ifremer.wao.bean.UserRole;
import fr.ifremer.wao.entity.Company;
import fr.ifremer.wao.entity.CompanyDAO;
-import fr.ifremer.wao.entity.Contact;
import fr.ifremer.wao.entity.ContactDAO;
import fr.ifremer.wao.entity.News;
import fr.ifremer.wao.entity.SampleRow;
@@ -51,11 +50,11 @@
import fr.ifremer.wao.entity.WaoUser;
import fr.ifremer.wao.entity.WaoUserDAO;
import fr.ifremer.wao.entity.WaoUserImpl;
-import org.apache.commons.lang.StringUtils;
import org.apache.commons.mail.EmailException;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.framework.TopiaQuery;
+import org.nuiton.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -254,8 +253,7 @@
transaction.commitTransaction();
try {
- // FIXME-JC20100122 Use REGEX instead of @ to test if the login is a valid email
- if (user.getLogin().contains("@") && user.isPasswordChanged()) {
+ if (StringUtil.isEmail(user.getLogin()) && user.isPasswordChanged()) {
String subject = "[WAO] ";
String msg = "Bonjour,\n\n";
if (isNewUser) {
Modified: trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties
===================================================================
--- trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-02-08 14:48:56 UTC (rev 995)
@@ -103,6 +103,8 @@
wao.business.contact.validation.commentAdminNecessaryForDataReliability=You must precise in admin comment why data reliability is '%s'
wao.business.contact.validation.dataReliabilityMissingForValidation=You must provide data reliability before validating
wao.business.entity.UserProfile.description=%s on %s%s
+wao.business.mammalsCapture.mail.message=Hello,\n\nAn observer of the ObsMer program provided to WAO the following information\:\n\nBoat\: %s\nTide\: %s\nProfession\: %s\n\nAccidental capture\:\n%s\n\nBest regards,\n\nObsmer program\nhttp\://www.ifremer.fr/wao
+wao.business.mammalsCapture.mail.subject=Obsmer WAO\: Information about an accidental capture
wao.business.other=Other
wao.business.readOnly=(read-only)
wao.error.boat.canCreateContact=
Modified: trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties
===================================================================
--- trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-02-08 14:48:56 UTC (rev 995)
@@ -115,6 +115,8 @@
wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut pr\u00E9ciser dans le commentaire administrateur pourquoi la donn\u00E9e est '%s'
wao.business.contact.validation.dataReliabilityMissingForValidation=Il faut pr\u00E9ciser la qualit\u00E9 de la donn\u00E9e avant de valider
wao.business.entity.UserProfile.description=%s sur %s%s
+wao.business.mammalsCapture.mail.message=Bonjour,\n\nUn observateur du programme Obsmer a renseign\u00E9 dans WAO l'information suivante \:\n\nNavire \: %s\nMar\u00E9e \: %s\nM\u00E9tier \: %s\n\nCapture accidentelle \:\n%s\n\nCordialement,\n\nLe programme Obsmer\nhttp\://www.ifremer.fr/wao
+wao.business.mammalsCapture.mail.subject=Obsmer WAO\: Information sur capture accidentelle
wao.business.other=Autre
wao.business.readOnly=(lecture seule)
wao.error.boat.canCreateContact=Impossible de cr\u00E9er un nouveau contact pour la soci\u00E9t\u00E9 %1$s et le navire %2$s (%3$d)
Modified: trunk/wao-business/src/main/xmi/wao.zargo
===================================================================
(Binary files differ)
Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java
===================================================================
--- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2011-02-08 14:48:56 UTC (rev 995)
@@ -500,6 +500,7 @@
"generatePassword",
WaoUser.PROPERTY_PASSWORD,
WaoUser.PROPERTY_PHONE_NUMBER,
+ WaoUser.PROPERTY_MAMMALS_NOTIFICATIONS,
WaoUser.PROPERTY_ACTIVE,
"userRole"
);
Modified: trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Administration_fr.properties
===================================================================
--- trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Administration_fr.properties 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Administration_fr.properties 2011-02-08 14:48:56 UTC (rev 995)
@@ -31,5 +31,4 @@
city-label: Ville
phoneNumber-label: T\u00e9l\u00e9phone
email-label: E-mail
-
active-label: Actif
Modified: trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties
===================================================================
--- trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties 2011-02-08 14:48:56 UTC (rev 995)
@@ -84,6 +84,7 @@
wao.ui.field.Contact.endDate=Observation end
wao.ui.field.Contact.mainObserver=Main observer
wao.ui.field.Contact.mammalsCapture=Accidental capture
+wao.ui.field.Contact.mammalsInfo=
wao.ui.field.Contact.mammalsObservation=Exceptional observation
wao.ui.field.Contact.nbObservants=Observers number
wao.ui.field.Contact.samplingStrategy=Sampling strategy followed
@@ -115,6 +116,7 @@
wao.ui.field.User.login=Login
wao.ui.field.UserProfile.userRole=Role
wao.ui.field.WaoUser.login=Identifier
+wao.ui.field.WaoUser.mammalsNotifications=Receive notifications about mammals captures
wao.ui.field.WaoUser.password=Password
wao.ui.filters.filters=Search filters
wao.ui.filters.refresh=Refresh filters
Modified: trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties
===================================================================
--- trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties 2011-02-08 14:48:56 UTC (rev 995)
@@ -84,6 +84,7 @@
wao.ui.field.Contact.endDate=Fin d'observation
wao.ui.field.Contact.mainObserver=Observateur r\u00E9f\u00E9rent
wao.ui.field.Contact.mammalsCapture=Capture accidentelle
+wao.ui.field.Contact.mammalsInfo=Noms scientifiques et nombres d'individus des esp\u00E8ces captur\u00E9es
wao.ui.field.Contact.mammalsObservation=Observation exceptionnelle
wao.ui.field.Contact.nbObservants=Nombre d'observateurs
wao.ui.field.Contact.samplingStrategy=Strat\u00E9gie d'\u00E9chantillonnage suivie
@@ -115,6 +116,7 @@
wao.ui.field.User.login=Identifiant
wao.ui.field.UserProfile.userRole=R\u00F4le
wao.ui.field.WaoUser.login=Identifiant
+wao.ui.field.WaoUser.mammalsNotifications=Recevoir les notifications de captures accidentelles
wao.ui.field.WaoUser.password=Mot de passe
wao.ui.filters.filters=Filtres de recherche
wao.ui.filters.refresh=Rafra\u00EEchir les champs du filtre
Modified: trunk/wao-ui/src/main/webapp/Administration.tml
===================================================================
--- trunk/wao-ui/src/main/webapp/Administration.tml 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/webapp/Administration.tml 2011-02-08 14:48:56 UTC (rev 995)
@@ -139,6 +139,14 @@
</ul>
</t:zone>
</p:userRole>
+ <p:mammalsNotifications>
+ <t:if t:test="currentUser.obsMer">
+ <t:if t:test="currentUser.admin">
+ <label t:for="mammalsNotifications">${message:wao.ui.field.WaoUser.mammalsNotifications}</label>
+ <input t:type="checkbox" t:id="mammalsNotifications" value="userEdited.mammalsNotifications" />
+ </t:if>
+ </t:if>
+ </p:mammalsNotifications>
</form>
</t:zone>
</fieldset>
Modified: trunk/wao-ui/src/main/webapp/ContactForm.tml
===================================================================
--- trunk/wao-ui/src/main/webapp/ContactForm.tml 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/webapp/ContactForm.tml 2011-02-08 14:48:56 UTC (rev 995)
@@ -235,6 +235,12 @@
</label>
<input t:type="checkbox" t:id="mammalsCapture" value="contact.mammalsCapture" />
</div>
+ <div>
+ <label for="mammalsInfo">
+ ${message:wao.ui.field.Contact.mammalsInfo}
+ </label>
+ <input t:type="textarea" t:id="mammalsInfo" value="contact.mammalsInfo" />
+ </div>
</t:if>
<t:if test="connectedUser.obsVente">
<div>
Modified: trunk/wao-ui/src/main/webapp/css/contacts.css
===================================================================
--- trunk/wao-ui/src/main/webapp/css/contacts.css 2011-02-08 14:47:37 UTC (rev 994)
+++ trunk/wao-ui/src/main/webapp/css/contacts.css 2011-02-08 14:48:56 UTC (rev 995)
@@ -114,9 +114,10 @@
div#so-contacts td.observationBeginDate,
div#so-contacts td.observationEndDate,
div#so-contacts td.nbObservants,
+div#so-contacts td.mammals,
div#so-contacts td.actualSamplingStrategy,
div#so-contacts td.completeSampling,
div#so-contacts td.dataInputDate,
-div#so-contacts td.validations {
+div#so-contacts td.validation {
text-align: center;
}