This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit cc3fd2d1a117fd5f8fbcb4f210c6918aa633923d Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Wed May 17 15:55:04 2017 +0200 vote pour de sondage restreint --- .../persistence/entity/VoterListTopiaDao.java | 13 ++++ pollen-persistence/src/main/xmi/pollen.zargo | Bin 24937 -> 24949 bytes .../pollen/services/bean/PollenEntityId.java | 2 +- .../org/chorem/pollen/services/bean/VoteBean.java | 36 +++++----- .../services/service/NotificationService.java | 19 ++++++ .../pollen/services/service/VoteService.java | 37 +++++------ .../pollen/services/service/VoterListService.java | 73 ++++++++++++++------- .../services/service/security/SecurityService.java | 36 ++++------ pollen-ui-riot-js/src/main/web/js/Poll.js | 20 ++++-- pollen-ui-riot-js/src/main/web/js/VoteService.js | 8 +++ .../src/main/web/js/VoterListService.js | 2 + .../src/main/web/tag/poll/Votes.tag.html | 4 +- 12 files changed, 152 insertions(+), 98 deletions(-) diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java index 24f9bc3..5143b6a 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/VoterListTopiaDao.java @@ -41,4 +41,17 @@ public class VoterListTopiaDao extends AbstractVoterListTopiaDao<VoterList> { super.delete(entity); } + + public List<VoterListMember> getAllMembers(VoterList entity) { + + VoterListMemberTopiaDao dao = topiaDaoSupplier + .getDao(VoterListMember.class, VoterListMemberTopiaDao.class); + List<VoterListMember> members = dao.forVoterListEquals(entity).findAll(); + + for (VoterList subVoterList : forParentEquals(entity).findAll()) { + members.addAll(getAllMembers(subVoterList)); + } + + return members; + } } diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 6f6fdb3..5ced133 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/bean/PollenEntityId.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenEntityId.java index 7cad78e..cec4f31 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenEntityId.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenEntityId.java @@ -110,7 +110,7 @@ public class PollenEntityId<E extends TopiaEntity> { public void decode(TopiaIdFactory topiaIdFactory) { - if (reducedId != null) { + if (reducedId != null && !isTemporaryId()) { String decodedId = new String(Base64.decodeBase64(reducedId)); String id = topiaIdFactory.newTopiaId(entityType, decodedId); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java index a331bd5..0f13866 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/VoteBean.java @@ -21,6 +21,7 @@ package org.chorem.pollen.services.bean; * #L% */ +import com.google.common.collect.Sets; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenPrincipalImpl; import org.chorem.pollen.persistence.entity.Vote; @@ -28,12 +29,13 @@ import org.chorem.pollen.persistence.entity.VoteImpl; import org.chorem.pollen.persistence.entity.VoteToChoice; import org.chorem.pollen.persistence.entity.VoteToChoices; import org.chorem.pollen.persistence.entity.VoterListMember; -import org.chorem.pollen.persistence.entity.VoterListMemberImpl; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * Created on 5/15/14. @@ -45,7 +47,7 @@ public class VoteBean extends PollenBean<Vote> { protected PollenEntityId<PollenPrincipal> voterId; - protected PollenEntityId<VoterListMember> voterListMemberId; + protected Set<PollenEntityId<VoterListMember>> voterListMemberIds; protected String voterName; @@ -94,7 +96,7 @@ public class VoteBean extends PollenBean<Vote> { if (vote.getVoterListMember() != null) { - setVoterListMemberId(vote.getVoterListMember().getTopiaId()); + setVoterListMembers(vote.getVoterListMember()); } @@ -121,14 +123,6 @@ public class VoteBean extends PollenBean<Vote> { } - if (getVoterListMemberId().getEntityId() != null) { - - // FIXME - VoterListMember member = new VoterListMemberImpl(); - member.setTopiaId(getVoterListMemberId().getEntityId()); - - } - return entity; } @@ -184,19 +178,19 @@ public class VoteBean extends PollenBean<Vote> { return anonymous != null && anonymous; } - public PollenEntityId<VoterListMember> getVoterListMemberId() { - if (voterListMemberId == null) { - voterListMemberId = PollenEntityId.newId(VoterListMember.class); + public Set<PollenEntityId<VoterListMember>> getVoterListMemberId() { + if (voterListMemberIds == null) { + voterListMemberIds = Sets.newHashSet(); } - return voterListMemberId; - } - - public void setVoterListMemberId(PollenEntityId<VoterListMember> voterListMemberId) { - this.voterListMemberId = voterListMemberId; + return voterListMemberIds; } - public void setVoterListMemberId(String voterListMemberId) { - getVoterListMemberId().setEntityId(voterListMemberId); + public void setVoterListMembers(Collection<VoterListMember> voterListMembers) { + this.voterListMemberIds = voterListMembers.stream().map(member -> { + PollenEntityId<VoterListMember> memberId = PollenEntityId.newId(VoterListMember.class); + memberId.setEntityId(member.getTopiaId()); + return memberId; + }).collect(Collectors.toSet()); } public double getWeight() { 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 6750666..92a09d1 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 @@ -30,6 +30,7 @@ import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.Vote; import org.chorem.pollen.persistence.entity.VoteNotification; +import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.PollenUIContext; import org.chorem.pollen.services.service.mail.EmailService; @@ -140,6 +141,24 @@ public class NotificationService extends PollenServiceSupport { } } + if (PollType.RESTRICTED.equals(poll.getPollType())) { + + VoterList mainVoterList = getVoterListDao() + .forPollEquals(poll) + .addNull(VoterList.PROPERTY_PARENT) + .findUniqueOrNull(); + + List<VoterListMember> allMembers = getVoterListDao().getAllMembers(mainVoterList); + allMembers.stream() + .map(member -> member.getMember()) + .distinct() + .forEach(pollenPrincipal -> { + RestrictedPollInvitationEmail mail = emailService.newRestrictedPollInvitationEmail(poll, pollenPrincipal); + mail.addTo(pollenPrincipal.getEmail()); + emailService.send(mail); + }); + } + } 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 5d8a368..349c227 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 @@ -60,7 +60,6 @@ public class VoteService extends PollenServiceSupport { private final Function<VoteBean, VoteBean> voteBeanFunction = input -> { if (isNotPermitted(PermissionVerb.editVote, input.getEntityId())) { input.setPermission(null); - input.setVoterName(null); } return input; }; @@ -71,19 +70,20 @@ public class VoteService extends PollenServiceSupport { VoteBean voteBean = new VoteBean(); voteBean.setWeight(1d); - PollenUser connectedUser = getConnectedUser(); + PollenPrincipal mainPrincipal = getSecurityContext().getMainPrincipal(); - if (connectedUser != null) { + if (mainPrincipal != null) { - voteBean.setVoterName(connectedUser.getName()); - voteBean.setVoterId(connectedUser.getTopiaId()); + voteBean.setVoterName(mainPrincipal.getName()); - VoterListMember voterListMember = getVoterListMemberDao().forEquals(VoterListMember.PROPERTY_MEMBER + "." + PollenPrincipal.PROPERTY_POLLEN_USER + "." + PollenUser.PROPERTY_TOPIA_ID, connectedUser.getTopiaId()) - .addEquals(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL + "." + Poll.PROPERTY_TOPIA_ID, pollId) - .findUniqueOrNull(); - if (voterListMember != null) { - voteBean.setVoterListMemberId(voterListMember.getTopiaId()); - voteBean.setWeight(voterListMember.getWeight()); + List<VoterListMember> voterListMembers = getVoterListMemberDao() + .forEquals(VoterListMember.PROPERTY_MEMBER + "." + PollenPrincipal.PROPERTY_EMAIL, mainPrincipal.getEmail()) + .addEquals(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL + "." + Poll.PROPERTY_TOPIA_ID, pollId) + .findAll(); + if (voterListMembers != null) { + voteBean.setVoterListMembers(voterListMembers); + // fixme bavencoff 17/05/2017 faut-il toujour garder le poid sur le vote ?? et pas sur le VoterListMember + //voteBean.setWeight(voterListMember.getWeight()); } } @@ -268,14 +268,13 @@ public class VoteService extends PollenServiceSupport { PollenPrincipal principal = getSecurityContext().getMainPrincipal(); if (principal != null) { - VoterListMember voterListMember = getVoterListMemberDao().forEquals(VoterListMember.PROPERTY_MEMBER + "." + PollenPrincipal.PROPERTY_TOPIA_ID, principal.getTopiaId()) - .addEquals(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL + "." + Poll.PROPERTY_TOPIA_ID, poll.getTopiaId()) - .findUniqueOrNull(); - if (voterListMember != null) { - toSave.setVoterListMember(voterListMember); - toSave.setWeight(voterListMember.getWeight()); - toSave.setVoter(principal); - } + List<VoterListMember> voterListMembers = getVoterListMemberDao().forMemberEquals(principal) + .addEquals(VoterListMember.PROPERTY_VOTER_LIST + "." + VoterList.PROPERTY_POLL, poll) + .findAll(); + toSave.setVoterListMember(voterListMembers); + // FIXME bavencoff 17/05/2017 ne poids ne devrai plus etre enregistré dans le vote + //toSave.setWeight(voterListMember.getWeight()); + toSave.setVoter(principal); } // -- author -- // diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java index 2ced80e..1936514 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java @@ -308,6 +308,7 @@ public class VoterListService extends PollenServiceSupport { protected VoterList getMainVoterList0(Poll poll) { return getVoterListDao() .forPollEquals(poll) + .addNull(VoterList.PROPERTY_PARENT) .findUniqueOrNull(); } @@ -414,38 +415,56 @@ public class VoterListService extends PollenServiceSupport { } // when create or edit email - if (!voterListMemberExists || !voterListMember.getEmail().equals(toSave.getMember().getEmail())) { - PollenPrincipal member; - PollenUser user = getPollenUserDao().forEquals(PollenUser.PROPERTY_EMAIL, voterListMember.getEmail()).findUniqueOrNull(); + String cleanMail = getCleanMail(voterListMember.getEmail()); + if (!voterListMemberExists || !cleanMail.equals(toSave.getMember().getEmail())) { + PollenPrincipal member = searchOrCreatePrincipal(poll, cleanMail, voterListMember.getName()); + PollenUser user = getPollenUserDao().forEquals(PollenUser.PROPERTY_EMAIL, cleanMail).findUniqueOrNull(); if (user != null) { - member = getPollenPrincipalDao().create(); member.setPollenUser(user); - member.setEmail(user.getEmail()); member.setName(user.getName()); - member.setPermission(getSecurityService().generateNewToken()); - } else { - member = getSecurityService().generatePollenPrincipal(); } toSave.setMember(member); } toSave.getMember().setName(voterListMember.getName()); - toSave.getMember().setEmail(getCleanMail(voterListMember.getEmail())); toSave.setWeight(voterListMember.getWeight()); return toSave; } - protected ErrorMap checkVoterList(Set<String> sisterNames, VoterListBean voterList, List<VoterListMemberBean> members) { + protected PollenPrincipal searchOrCreatePrincipal(Poll poll, String email, String name) { + PollenPrincipal principal; + if (poll.getCreator().getEmail().equals(email)) { + principal = poll.getCreator(); + } else { + VoterList mainVoterList = getMainVoterList0(poll); + principal = getVoterListDao().getAllMembers(mainVoterList).stream() + .map(VoterListMember::getMember) + .filter(p -> p != null && p.getEmail() != null && p.getEmail().equals(email)) + .findFirst() + .orElse(null); + + } + if (principal == null) { + principal = getSecurityService().generatePollenPrincipal(); + principal.setEmail(email); + principal.setName(name); + } + + return principal; + } + + protected ErrorMap checkVoterList(Set<String> sisterNames, VoterListBean voterList, List<VoterListMemberBean> members, List<VoterListBean> subLists) { ErrorMap errors = new ErrorMap(); checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), l(getLocale(), "pollen.error.voterList.name.mandatory")); check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, l(getLocale(), "pollen.error.voterList.weight.greaterThan0")); - checkNotEmpty(errors, "member", members, l(getLocale(), "pollen.error.voterList.member.mandatory")); - + if (subLists.isEmpty()) { + checkNotEmpty(errors, "member", members, l(getLocale(), "pollen.error.voterList.member.mandatory")); + } boolean nameAlreadyUse = sisterNames.contains(voterList.getName()); check(errors, VoterList.PROPERTY_NAME, !nameAlreadyUse, l(getLocale(), "pollen.error.voterList.name.alreadyUsed")); @@ -588,31 +607,35 @@ public class VoterListService extends PollenServiceSupport { }); List<VoterListMemberBean> members = Collections.emptyList(); + List<VoterListBean> subLists = Collections.emptyList(); - if (voterList.getEntityId() != null) { - if (voterList.isTemporaryId()) { + if (voterList.isTemporaryId()) { - members = membersToSave.stream() - .filter(member -> member.getVoterListId().getEntityId().equals(voterList.getEntityId())) - .collect(Collectors.toList()); - - } else { + members = membersToSave.stream() + .filter(member -> voterList.getId().equals(member.getVoterListId())) + .collect(Collectors.toList()); - VoterList oldVoterList = getVoterList0(poll, voterList.getEntityId()); - sisterNames.remove(oldVoterList.getName()); + subLists = listsToSave.stream() + .filter(list -> voterList.getId().equals(list.getParentId())) + .collect(Collectors.toList()); - List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList.toEntity()); - members = toBeanList(VoterListMemberBean.class, existingVoterListMembers); - } + } else if (voterList.isPersisted()) { + + VoterList oldVoterList = getVoterList0(poll, voterList.getEntityId()); + sisterNames.remove(oldVoterList.getName()); + List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList.toEntity()); + members = toBeanList(VoterListMemberBean.class, existingVoterListMembers); + List<VoterList> existingSubVoterLists = getVoterLists0(poll, voterList.getEntityId()); + subLists = toBeanList(VoterListBean.class, existingSubVoterLists); } else if (listsToSave.size() == 1){ members = membersToSave; } - ErrorMap errorMap = checkVoterList(sisterNames, voterList, members); + ErrorMap errorMap = checkVoterList(sisterNames, voterList, members, subLists); errorMap.failIfNotEmpty(); sisterNames.add(voterList.getName()); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java index 166ffea..4216342 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java @@ -640,13 +640,13 @@ public class SecurityService extends PollenServiceSupport { for (Vote vote : principalByType.votes) { permissions.add(createWildcardSubjectPermission(vote)); - if (vote.getPoll().getPollType() != PollType.FREE) { - permissions.remove(createSubjectPermission(PermissionVerb.addVote, vote.getPoll())); - } - if (vote.getPoll().getVoteVisibility() == VoteVisibility.VOTER) { generatePollVoterPermission(permissions, vote.getPoll()); } + + if (vote.getPoll().getPollType() != PollType.FREE) { + permissions.remove(createSubjectPermission(PermissionVerb.addVote, vote.getPoll())); + } } return permissions; @@ -767,31 +767,19 @@ public class SecurityService extends PollenServiceSupport { Poll poll = getPollDao().forCreatorEquals(principal).findUniqueOrNull(); if (poll != null) { principalByType.polls.add(poll); - return; } - Choice choice = getChoiceDao().forCreatorEquals(principal).findUniqueOrNull(); - if (choice != null) { - principalByType.choices.add(choice); - return; - } + List<Choice> choices = getChoiceDao().forCreatorEquals(principal).findAll(); + principalByType.choices.addAll(choices); - Vote vote = getVoteDao().forVoterEquals(principal).findUniqueOrNull(); - if (vote != null) { - principalByType.votes.add(vote); - return; - } + List<Vote> votes = getVoteDao().forVoterEquals(principal).findAll(); + principalByType.votes.addAll(votes); - Comment comment = getCommentDao().forAuthorEquals(principal).findUniqueOrNull(); - if (comment != null) { - principalByType.comments.add(comment); - return; - } + List<Comment> comments = getCommentDao().forAuthorEquals(principal).findAll(); + principalByType.comments.addAll(comments); - FavoriteList favoriteList = getFavoriteListDao().forOwnerEquals(principal).findUniqueOrNull(); - if (favoriteList != null) { - principalByType.favoriteLists.add(favoriteList); - } + List<FavoriteList> favoriteLists = getFavoriteListDao().forOwnerEquals(principal).findAll(); + principalByType.favoriteLists.addAll(favoriteLists); } diff --git a/pollen-ui-riot-js/src/main/web/js/Poll.js b/pollen-ui-riot-js/src/main/web/js/Poll.js index b63720f..6cdfaaf 100644 --- a/pollen-ui-riot-js/src/main/web/js/Poll.js +++ b/pollen-ui-riot-js/src/main/web/js/Poll.js @@ -128,23 +128,31 @@ class Poll { if (this.resultIsVisible) { promises.push(resultService.getResults(this.id, this.permission || this.votePermission)); } + if (this.canVote) { + promises.push(voteService.getNewVote(this.id, this.permission || this.votePermission)); + } return Promise.all(promises).then(resultsArray => { - this.choices = resultsArray[0]; + let indexResult = 0; + this.choices = resultsArray[indexResult++]; this.choiceCount = this.choices.length; - this.votes = resultsArray[1]; + this.votes = resultsArray[indexResult++]; if (this.voteIsVisible) { this.voteCount = this.votes.length; } - this.voteCountingTypeValue = resultsArray[2]; + this.voteCountingTypeValue = resultsArray[indexResult++]; if (this.resultIsVisible) { - this.results = resultsArray[3]; + this.results = resultsArray[indexResult++]; this.choices.forEach(choice => { choice.score = this.results.scores.find(score => score.choiceId === choice.id); }); } + + if (this.canVote) { + this.voterName = resultsArray[indexResult++].voterName; + } bus.trigger("poll", this); return Promise.resolve(this); }); @@ -254,7 +262,9 @@ class Poll { return voteService.addVote(this.id, vote, this.votePermission || this.permission).then((result) => { this.voteId = result.id; this.votePermission = result.permission; - return Promise.all([this.reloadPoll(), this.loadVotes()]); + return this.reloadPoll().then(() => { + return this.loadVotes(); + }); }); } return Promise.reject("Init poll after add vote"); diff --git a/pollen-ui-riot-js/src/main/web/js/VoteService.js b/pollen-ui-riot-js/src/main/web/js/VoteService.js index ef729c6..cb6a68b 100644 --- a/pollen-ui-riot-js/src/main/web/js/VoteService.js +++ b/pollen-ui-riot-js/src/main/web/js/VoteService.js @@ -39,6 +39,14 @@ class VoteService extends FetchService { return this.form(url, {vote: form}); } + getNewVote(pollId, permission) { + let args = {}; + if (permission) { + args.permission = permission; + } + return this.getWithParams("/v1/polls/" + pollId + "/votes/new", args); + } + updateVote(pollId, form, permission) { let url = "/v1/polls/" + pollId + "/votes/" + form.id; if (permission) { diff --git a/pollen-ui-riot-js/src/main/web/js/VoterListService.js b/pollen-ui-riot-js/src/main/web/js/VoterListService.js index 6ee5738..9d923ef 100644 --- a/pollen-ui-riot-js/src/main/web/js/VoterListService.js +++ b/pollen-ui-riot-js/src/main/web/js/VoterListService.js @@ -78,6 +78,7 @@ class VoterListService extends FetchService { let voterList = this._newVoterList(parent); parent.subLists.push(voterList); this.voterListsById[voterList.id] = voterList; + return voterList; } deleteVoterList(voterList) { @@ -94,6 +95,7 @@ class VoterListService extends FetchService { let member = this._newMember(parent); parent.members.push(member); this.voterListMembersById[member.id] = member; + return member; } deleteMember(member) { diff --git a/pollen-ui-riot-js/src/main/web/tag/poll/Votes.tag.html b/pollen-ui-riot-js/src/main/web/tag/poll/Votes.tag.html index ef2074d..1384bde 100644 --- a/pollen-ui-riot-js/src/main/web/tag/poll/Votes.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/poll/Votes.tag.html @@ -21,7 +21,7 @@ require("./Podium.tag.html"); required={!voteId} disabled={voteId} placeholder={__.authorPlaceHolder} - value={userName}> + value={poll.voterName}> </div> <div if={!poll.canVote} class="choices-label"> @@ -210,8 +210,6 @@ require("./Podium.tag.html"); let session = require("../../js/Session"); let Choice = require("../../js/Choice"); this.installBundle(session, "poll_votes"); - let user = session.getUser(); - this.userName = user && user.name; this.tooManyChoicesSelected = false; this.poll = require("../../js/Poll.js"); -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.