This is an automated email from the git hooks/post-receive script. New commit to branch feature/58-limitation-des-votants in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 9f14275916fe0dc5ae9a4ab7948d376a06bb66f9 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Thu Sep 28 16:26:07 2017 +0200 envoyer un mail quand le nombre de votants dépasse la valeur max (ref #58) --- .../pollen/persistence/entity/PollTopiaDao.java | 12 ++++ .../db/migration/h2/V3_1_0_1__add_premium.sql | 3 + .../migration/postgresql/V3_1_0_1__add_premium.sql | 3 + pollen-persistence/src/main/xmi/pollen.zargo | Bin 28471 -> 28560 bytes .../chorem/pollen/services/PollenUIContext.java | 10 +++ .../services/service/NotificationService.java | 9 +++ .../pollen/services/service/VoteService.java | 9 +++ .../pollen/services/service/mail/EmailService.java | 8 +++ .../service/mail/ExceedingMaxVotersEmail.java | 73 +++++++++++++++++++++ .../email/ExceedingMaxVotersEmail.mustache | 5 ++ .../email/ExceedingMaxVotersEmail_fr.mustache | 6 ++ .../i18n/pollen-services_en_GB.properties | 1 + .../i18n/pollen-services_fr_FR.properties | 1 + pollen-ui-riot-js/src/main/web/i18n/en.json | 4 +- pollen-ui-riot-js/src/main/web/i18n/fr.json | 4 +- pollen-ui-riot-js/src/main/web/js/Session.js | 3 +- 16 files changed, 146 insertions(+), 5 deletions(-) diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java index 88e8ea39..900d140d 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java @@ -31,6 +31,7 @@ import org.nuiton.util.pagination.PaginationResult; import java.util.Calendar; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -208,4 +209,15 @@ public class PollTopiaDao extends AbstractPollTopiaDao<Poll> { .collect(Collectors.toList()); } + public boolean setFlagNotificationMaxVoterSend(Poll poll) { + + int nbModif = topiaJpaSupport.execute("UPDATE " + Poll.class.getCanonicalName() + + " SET " + Poll.PROPERTY_NOTIFICATION_MAX_VOTER_SEND + " = true" + + " WHERE " + Poll.PROPERTY_TOPIA_ID + " = :" + Poll.PROPERTY_TOPIA_ID + + " AND " + Poll.PROPERTY_NOTIFICATION_MAX_VOTER_SEND + " = false", + Collections.singletonMap(Poll.PROPERTY_TOPIA_ID, poll.getTopiaId())); + + return nbModif > 0; + } + } diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_1__add_premium.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_1__add_premium.sql index dc4a1849..e43b96d3 100644 --- a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_1__add_premium.sql +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_1__add_premium.sql @@ -2,4 +2,7 @@ alter table poll add premium boolean; update poll set premium = false; +alter table poll add notificationMaxVoterSend boolean; +update poll set notificationMaxVoterSend = false; + alter table pollenUser add premiumTo TIMESTAMP; diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_1__add_premium.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_1__add_premium.sql index dc4a1849..e43b96d3 100644 --- a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_1__add_premium.sql +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_1__add_premium.sql @@ -2,4 +2,7 @@ alter table poll add premium boolean; update poll set premium = false; +alter table poll add notificationMaxVoterSend boolean; +update poll set notificationMaxVoterSend = false; + alter table pollenUser add premiumTo TIMESTAMP; diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 004634d3..99dbdb63 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/PollenUIContext.java b/pollen-services/src/main/java/org/chorem/pollen/services/PollenUIContext.java index a707476e..b9bc6aeb 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/PollenUIContext.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/PollenUIContext.java @@ -44,6 +44,8 @@ public class PollenUIContext implements Serializable { private String profileUrl; + private String offersUrl; + public String getUiEndPoint() { return uiEndPoint; } @@ -107,4 +109,12 @@ public class PollenUIContext implements Serializable { public void setProfileUrl(String profileUrl) { this.profileUrl = profileUrl; } + + public String getOffersUrl() { + return offersUrl; + } + + public void setOffersUrl(String offersUrl) { + this.offersUrl = offersUrl; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java index 074c6198..ba7c6dbf 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java @@ -42,6 +42,7 @@ import org.chorem.pollen.services.service.mail.CommentEditedEmail; import org.chorem.pollen.services.service.mail.CommentReportEmail; import org.chorem.pollen.services.service.mail.CommentReportForAdminEmail; import org.chorem.pollen.services.service.mail.EmailService; +import org.chorem.pollen.services.service.mail.ExceedingMaxVotersEmail; import org.chorem.pollen.services.service.mail.LostPasswordEmail; import org.chorem.pollen.services.service.mail.PollClosedEmail; import org.chorem.pollen.services.service.mail.PollCreatedEmail; @@ -405,4 +406,12 @@ public class NotificationService extends PollenServiceSupport { }); } + + public void onExceedingMaxVoters(Poll poll, int maxVoters) { + EmailService emailService = getEmailService(); + + ExceedingMaxVotersEmail email = emailService.newExceedingMaxVotersEmail(poll, maxVoters); + email.addTo(poll.getCreator().getEmail()); + emailService.send(email); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java index 724178f8..12c244a3 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java @@ -204,6 +204,15 @@ public class VoteService extends PollenServiceSupport { getNotificationService().onVoteAdded(poll, result); getFeedService().onVoteAdded(poll, result); + int maxVoters = getPollService().getMaxVoters(poll); + if (maxVoters > 0 && getVoteCount(poll) > maxVoters) { + boolean notificationSend = getPollDao().setFlagNotificationMaxVoterSend(poll); + if (notificationSend) { + commit(); + getNotificationService().onExceedingMaxVoters(poll, maxVoters); + } + } + return PollenEntityRef.of(result); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java index eed9fe95..f2d15d13 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java @@ -610,4 +610,12 @@ public class EmailService extends PollenServiceSupport { email.setApplicationVersion(getPollenServiceConfig().getVersion()); return email; } + + public ExceedingMaxVotersEmail newExceedingMaxVotersEmail(Poll poll, int maxVoters) { + ExceedingMaxVotersEmail email = new ExceedingMaxVotersEmail(getLocale()); + email.setPoll(poll); + email.setMaxVoters(maxVoters); + email.setOffersUrl(getUIContext().getOffersUrl()); + return email; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java new file mode 100644 index 00000000..eb862893 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ExceedingMaxVotersEmail.java @@ -0,0 +1,73 @@ +package org.chorem.pollen.services.service.mail; + +/* + * #%L + * Pollen :: Service + * %% + * Copyright (C) 2009 - 2017 Code Lutin, Tony Chemit + * %% + * 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 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/>. + * #L% + */ + +import org.chorem.pollen.persistence.entity.Poll; +import org.nuiton.i18n.I18n; + +import java.util.Locale; + +/** + * Created on 4/30/14. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 2.0 + */ +public class ExceedingMaxVotersEmail extends PollenMail { + + protected Poll poll; + private int maxVoters; + private String offersUrl; + + protected ExceedingMaxVotersEmail(Locale locale) { + super(locale); + } + + @Override + public String getSubject() { + return I18n.l(locale, "pollen.service.mail.ExceedingMaxVotersEmail.subject", poll.getTitle()); + } + + public Poll getPoll() { + return poll; + } + + public void setPoll(Poll poll) { + this.poll = poll; + } + + public void setMaxVoters(int maxVoters) { + this.maxVoters = maxVoters; + } + + public int getMaxVoters() { + return maxVoters; + } + + public void setOffersUrl(String offersUrl) { + this.offersUrl = offersUrl; + } + + public String getOffersUrl() { + return offersUrl; + } +} \ No newline at end of file diff --git a/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail.mustache b/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail.mustache new file mode 100644 index 00000000..8a1757ec --- /dev/null +++ b/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail.mustache @@ -0,0 +1,5 @@ +Hello {{poll.creator.name}}, + +Your poll "{{poll.title}}" has just exceeded the maximum number of voters for the standard offer ({{maxVoters}} voters). +Users can continue to vote but only the first {{maxVoters}} votes are taken into account in the calculation of the result. +Read the offers page ({{offersUrl}}) to unlock this limit. \ No newline at end of file diff --git a/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail_fr.mustache b/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail_fr.mustache new file mode 100644 index 00000000..26ac89f3 --- /dev/null +++ b/pollen-services/src/main/resources/email/ExceedingMaxVotersEmail_fr.mustache @@ -0,0 +1,6 @@ +Bonjour {{poll.creator.name}}, + +Votre sondage "{{poll.title}}" vient de dépasser le nombre de votants maximum pour l'offre standard ({{maxVoters}} votants). +Les utilisateurs peuvent continuer à voter mais seul les {{maxVoters}} premiers votes sont pris en compte dans le calcul du résultat. + +Consulter la page des nos offres ({{offersUrl}}) pour déverrouiller cette limite. diff --git a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties index ad5f2ecd..5680fe60 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties @@ -148,6 +148,7 @@ pollen.service.mail.CommentDeletedEmail.subject=[Pollen] A comment was deleted i pollen.service.mail.CommentEditedEmail.subject=[Pollen] A comment was edited in poll %s pollen.service.mail.CommentReportEmail.subject=[Pollen] A comment was reported in your poll %s pollen.service.mail.CommentReportForAdminEmail.subject=[Pollen] A comment was reported in poll %s +pollen.service.mail.ExceedingMaxVotersEmail.subject=[Pollen] Poll exceeded number of voter pollen.service.mail.LostPasswordEmail.subject=[Pollen] Lost password for %s pollen.service.mail.PollChoicePeriodEndedEmail.subject=[Pollen] Add Choice period ended for poll %s pollen.service.mail.PollChoicePeriodStartedEmail.subject=[Pollen] Add Choice period started for poll %s diff --git a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties index dce0f1f5..615a21a6 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties @@ -147,6 +147,7 @@ pollen.service.mail.CommentDeletedEmail.subject=[Pollen] Un commentaire a été pollen.service.mail.CommentEditedEmail.subject=[Pollen] Un commentaire a été modifié sur le sondage %s pollen.service.mail.CommentReportEmail.subject=[Pollen] Un commentaire a été signalé comme inapproprié sur votre sondage %s pollen.service.mail.CommentReportForAdminEmail.subject=[Pollen] Un commentaire a été signalé comme inapproprié sur le sondage %s +pollen.service.mail.ExceedingMaxVotersEmail.subject=[Pollen] Vote sondage dépasse le nombre maximal de votants pollen.service.mail.LostPasswordEmail.subject=[Pollen] Mot de passe perdu du compte %s pollen.service.mail.PollChoicePeriodEndedEmail.subject=[Pollen] Période d'ajout de choix terminée pour le sondage %s pollen.service.mail.PollChoicePeriodStartedEmail.subject=[Pollen] Période d'ajout de choix commencée pour le sondage %s diff --git a/pollen-ui-riot-js/src/main/web/i18n/en.json b/pollen-ui-riot-js/src/main/web/i18n/en.json index 121d34fa..b3325075 100644 --- a/pollen-ui-riot-js/src/main/web/i18n/en.json +++ b/pollen-ui-riot-js/src/main/web/i18n/en.json @@ -67,7 +67,7 @@ "poll_participation": "of participation", "poll_maxVoters": "Limited to {0}", "poll_maxVotersAlert_title": "Number of voters limitation", - "poll_maxVotersAlert": "Strandard offers has limited to {0} voters. Users can continue to vote but only the first {0} votes are taken into account in the calculation of the resultles.", + "poll_maxVotersAlert": "Strandard offers has limited to {0} voters. Users can continue to vote but only the first {0} votes are taken into account in the calculation of the result.", "poll_maxVotersAlert_offers": "Read <a href=\"#home\">the offers page</a> to unlock this limit.", "poll_closedFrom": "Closing from", "poll_urlForAdmin" : "Administrate poll with this address", @@ -532,7 +532,7 @@ "voterList_member_resendInvitation": "Resent a invitation", "voterList_member_resendInvitation_success": "invitation send", "voterList_maxVotersAlert_title": "Number of voters limitation", - "voterList_maxVotersAlert": "The number of voters exceeds the limit of the standard offer ({0} voters). Users can continue to vote but only the first {0} votes are taken into account in the calculation of the resultles. Read <a href=\"#home\">the offers page</a> to unlock this limit.", + "voterList_maxVotersAlert": "The number of voters exceeds the limit of the standard offer ({0} voters). Users can continue to vote but only the first {0} votes are taken into account in the calculation of the result. Read <a href=\"#home\">the offers page</a> to unlock this limit.", "modal_cancel": "Cancel", "modal_ok": "Ok", "confirm_cancel": "Cancel", diff --git a/pollen-ui-riot-js/src/main/web/i18n/fr.json b/pollen-ui-riot-js/src/main/web/i18n/fr.json index 4d51a117..3559b6b1 100644 --- a/pollen-ui-riot-js/src/main/web/i18n/fr.json +++ b/pollen-ui-riot-js/src/main/web/i18n/fr.json @@ -68,7 +68,7 @@ "poll_maxVoters": "Limité à {0}", "poll_maxVotersAlert_title": "Limitation du Nombre de votants", "poll_maxVotersAlert": "L'offre standard est limitée à {0} votants. Les utilisateurs peuvent continuer à voter mais seul les {0} premiers votes sont pris en compte dans le calcul du résultat.", - "poll_maxVotersAlert_offers": "Cousulter <a href=\"#home\">la page des nos offres</a> pour déverrouiller cette limite.", + "poll_maxVotersAlert_offers": "Consulter <a href=\"#home\">la page des nos offres</a> pour déverrouiller cette limite.", "poll_closedFrom": "Fermé depuis le", "poll_urlForAdmin" : "Administrer ce sondage avec cette adresse", "poll_urlForVote" : "Inviter de nouveaux participants en leur envoyant cette adresse", @@ -532,7 +532,7 @@ "voterList_member_resendInvitation": "Renvoyer une invitation", "voterList_member_resendInvitation_success": "L'invitation est envoyée", "voterList_maxVotersAlert_title": "Limitation du Nombre de votants", - "voterList_maxVotersAlert": "Le nombre de participants dépasse la limite de l'offre standard ({0} votants). Tout les participants pourront voter mais seul les {0} premiers votes seront pris en compte dans le calcul du résultat. Cousulter <a href=\"#home\">la page des nos offres</a> pour déverrouiller cette limite.", + "voterList_maxVotersAlert": "Le nombre de participants dépasse la limite de l'offre standard ({0} votants). Tout les participants pourront voter mais seul les {0} premiers votes seront pris en compte dans le calcul du résultat. Consulter <a href=\"#home\">la page des nos offres</a> pour déverrouiller cette limite.", "modal_cancel": "Annuler", "modal_ok": "Ok", "confirm_cancel": "Annuler", diff --git a/pollen-ui-riot-js/src/main/web/js/Session.js b/pollen-ui-riot-js/src/main/web/js/Session.js index 251dcd1c..f5072b6e 100644 --- a/pollen-ui-riot-js/src/main/web/js/Session.js +++ b/pollen-ui-riot-js/src/main/web/js/Session.js @@ -48,7 +48,8 @@ class Session { pollEditUrl: window.location.origin + "/#poll/{pollId}/summary/{token}", resourceUrl: this.configuration.endPoint + "/v1/resources/{resourceId}", resourceDownloadUrl: this.configuration.endPoint + "/v1/resources/{resourceId}/download", - profileUrl: window.location.origin + "/#user/profile" + profileUrl: window.location.origin + "/#user/profile", + offersUrl: window.location.origin + "/#home" }; // pour contenir les traductions this.i18n = { -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.