Author: bleny Date: 2014-03-05 15:29:43 +0100 (Wed, 05 Mar 2014) New Revision: 1714 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1714 Log: refs #4560 deal with WaoUser#canReadBoats field in edit-wao-user Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp trunk/wao-web/src/main/webapp/css/wao.css Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ReferentialService.java 2014-03-05 14:29:43 UTC (rev 1714) @@ -25,6 +25,7 @@ package fr.ifremer.wao.services.service; import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.entity.Boat; @@ -91,10 +92,13 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; /** * Service permettant la gestion des différents référentiels. @@ -103,6 +107,9 @@ private static final Log log = LogFactory.getLog(ReferentialService.class); + /** Splitter qui permet de détecter toutes les immatriculations dans une chaîne (que le séparateur soit ' ', ',' ou autre). */ + protected static final Splitter BOAT_IMMATRICULATIONS_SPLITTER = Splitter.on(Pattern.compile("[^0-9]+")); + /** Pour chaque programme, les référentiels utilisés par ce programme. */ protected static final Map<ObsProgram, List<String>> PER_PROGRAM_REFERENTIAL; @@ -131,6 +138,7 @@ PER_PROGRAM_REFERENTIAL = Collections.unmodifiableMap(perProgramReferential); } + /** * Permet de maintenir à jour les informations sur les référentiels. À * chaque import de référentiel par Wao, il faut appeler cette méthode en @@ -972,4 +980,21 @@ } + public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) { + + Iterable<String> splitImmatriculations = BOAT_IMMATRICULATIONS_SPLITTER.split(joinedImmatriculations); + + Set<Integer> immatriculations = new HashSet<>(); + for (String splitImmatriculation : splitImmatriculations) { + if (StringUtils.isNotBlank(splitImmatriculation)) { + immatriculations.add(Integer.parseInt(splitImmatriculation)); + } + } + + List<Boat> boats = getBoatDao().forImmatriculationIn(immatriculations).findAll(); + + return boats; + + } + } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateWaoUserCommand.java 2014-03-05 14:29:43 UTC (rev 1714) @@ -23,6 +23,21 @@ protected ImmutableMap<String, Company> allCompanies; + /** + * Si l'utilisateur est professionnel, on doit savoir à quelle + * liste de navires il est restreint, Cette information est saisie + * en mettant à la suite les immatriculations des navires. + */ + protected String canReadBoats; + + public String getCanReadBoats() { + return canReadBoats; + } + + public void setCanReadBoats(String canReadBoats) { + this.canReadBoats = canReadBoats; + } + public String getCompanyId() { String companyId = null; if (waoUser.getCompany() != null) { Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/WaoUsersService.java 2014-03-05 14:29:43 UTC (rev 1714) @@ -2,13 +2,18 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Maps; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.Boats; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.UserRole; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.entity.WaoUserImpl; import fr.ifremer.wao.entity.WaoUserTopiaDao; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; @@ -71,10 +76,23 @@ if (optionalUserId.isPresent()) { - updateWaoUserCommand.setWaoUser(getWaoUser(optionalUserId.get())); + WaoUser waoUser = getWaoUser(optionalUserId.get()); + updateWaoUserCommand.setWaoUser(waoUser); + updateWaoUserCommand.setPasswordStrategy(UpdateWaoUserCommandPasswordStrategy.KEEP_SAME_PASSWORD); + if (waoUser.isCanReadBoatsNotEmpty()) { + + String canReadBoats = StringUtils.join( + Iterables.transform(waoUser.getCanReadBoats(), Boats.getImmatriculation()), + ' ' + ); + + updateWaoUserCommand.setCanReadBoats(canReadBoats); + + } + } else { updateWaoUserCommand.setWaoUser(newWaoUser()); @@ -89,8 +107,15 @@ public void save(UpdateWaoUserCommand updateWaoUserCommand) { + ObsProgram obsProgram = updateWaoUserCommand.getObsProgram(); WaoUser waoUser = updateWaoUserCommand.getWaoUser(); + waoUser.clearCanReadBoats(); + if (waoUser.hasUserRole(UserRole.PROFESSIONAL, obsProgram)) { + List<Boat> boatsFromImmatriculations = getReferentialService().getBoatsFromImmatriculations(updateWaoUserCommand.getCanReadBoats()); + waoUser.setCanReadBoats(boatsFromImmatriculations); + } + String newPassword; switch (updateWaoUserCommand.getPasswordStrategy()) { case GENERATE_NEW_PASSWORD: Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ReferentialServiceTest.java 2014-03-05 14:29:43 UTC (rev 1714) @@ -1,5 +1,6 @@ package fr.ifremer.wao.services.service; +import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.services.AbstractWaoServiceTest; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -9,6 +10,7 @@ import org.junit.Test; import java.io.InputStream; +import java.util.Collection; import java.util.Date; public class ReferentialServiceTest extends AbstractWaoServiceTest { @@ -139,4 +141,13 @@ IOUtils.closeQuietly(input); } } + + @Test + public void testGetBoatsByImmatriculations() { + testImportBoats(); + Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419"); + Assert.assertEquals(3, boats.size()); + boats = service.getBoatsFromImmatriculations(" "); + Assert.assertTrue(boats.isEmpty()); + } } Modified: trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-05 14:29:43 UTC (rev 1714) @@ -230,6 +230,7 @@ wao.ui.form.sortByTideBegin=Sort by observation begin date wao.ui.form.updateWaoUserCommand.admin=Administrator wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrator (read-only) +wao.ui.form.updateWaoUserCommand.canReadBoats=Only able to read boats wao.ui.form.updateWaoUserCommand.coordinator=Coordinator wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinator (read-only) wao.ui.form.updateWaoUserCommand.guest=Guest Modified: trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-05 14:29:43 UTC (rev 1714) @@ -230,6 +230,7 @@ wao.ui.form.sortByTideBegin=Trier par date de début d'observation (du plus récent au plus ancien) wao.ui.form.updateWaoUserCommand.admin=Administrateur wao.ui.form.updateWaoUserCommand.adminReadOnly=Administrateur (lecture seule) +wao.ui.form.updateWaoUserCommand.canReadBoats=Limiter à la consultation des navires wao.ui.form.updateWaoUserCommand.coordinator=Coordinateur wao.ui.form.updateWaoUserCommand.coordinatorReadOnly=Coordinateur (lecture seule) wao.ui.form.updateWaoUserCommand.guest=Invité Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/companies.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -17,21 +17,14 @@ <th> <s:text name="wao.ui.field.Company.active" /> </th> - <th> + <th class="actions"> <s:text name="wao.ui.actions" /> </th> </tr> <s:iterator value="companies"> <tr> - <td> - <s:if test="active"> - <s:property value="name" /> - </s:if> - <s:else> - <del> - <s:property value="name" /> - </del> - </s:else> + <td<s:if test=" ! active"> class="inactive"</s:if>> + <s:property value="name" /> </td> <td> <s:if test="active"> @@ -41,7 +34,7 @@ <s:text name="wao.ui.misc.no" /> </s:else> </td> - <td> + <td class="actions"> <s:url action="edit-company!input" id="editCompanyUrl"> <s:param name="companyId" value="topiaId" /> </s:url> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-company.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -26,7 +26,7 @@ </s:a> <s:submit type="button" cssClass="btn"> - <i class="icon-ok"></i> <s:text name="wao.ui.action.save" /> + <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" /> </s:submit> </div> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/edit-wao-user.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -16,9 +16,26 @@ } } - $('input[name="updateWaoUserCommand\\.passwordStrategy"]').change(showHideDefinePasswordFunction); + var $updateWaoUserCommandProfessionalInput = $('input[name="updateWaoUserCommand.professional"]'); + var $updateWaoUserCommandProfessionalReadOnlyInput = $('input[name="updateWaoUserCommand.professionalReadOnly"]'); + var showHideDefineCanReadBoatsFunction = function () { + var $defineCanReadBoats = $('#defineCanReadBoats'); + if ($updateWaoUserCommandProfessionalInput.prop('checked') || $updateWaoUserCommandProfessionalReadOnlyInput.prop('checked')) { + $defineCanReadBoats.show(); + } else { + $defineCanReadBoats.hide(); + } + } + + // bindings + $('input[name="updateWaoUserCommand.passwordStrategy"]').change(showHideDefinePasswordFunction); + $updateWaoUserCommandProfessionalInput.change(showHideDefineCanReadBoatsFunction); + $updateWaoUserCommandProfessionalReadOnlyInput.change(showHideDefineCanReadBoatsFunction); + + // init showHideDefinePasswordFunction(); + showHideDefineCanReadBoatsFunction(); }); </script> @@ -37,7 +54,9 @@ <s:select name="updateWaoUserCommand.companyId" label="%{getText('wao.ui.entity.Company')}" list="updateWaoUserCommand.allCompanies" - listValue="%{value.name}" /> + listValue="%{value.name}" + cssClass="input-xxlarge"/> + <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" /> </fieldset> @@ -64,8 +83,6 @@ <legend><s:text name="wao.ui.form.WaoUser.rights" /></legend> - <s:checkbox name="updateWaoUserCommand.waoUser.active" label="%{getText('wao.ui.field.WaoUser.active')}" /> - <s:checkbox name="updateWaoUserCommand.admin" label="%{getText('wao.ui.form.updateWaoUserCommand.admin')}" /> <s:checkbox name="updateWaoUserCommand.adminReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.adminReadOnly')}" /> <s:checkbox name="updateWaoUserCommand.coordinator" label="%{getText('wao.ui.form.updateWaoUserCommand.coordinator')}" /> @@ -77,6 +94,10 @@ <s:checkbox name="updateWaoUserCommand.professional" label="%{getText('wao.ui.form.updateWaoUserCommand.professional')}" /> <s:checkbox name="updateWaoUserCommand.professionalReadOnly" label="%{getText('wao.ui.form.updateWaoUserCommand.professionalReadOnly')}" /> + <div id="defineCanReadBoats"> + <s:textarea name="updateWaoUserCommand.canReadBoats" label="%{getText('wao.ui.form.updateWaoUserCommand.canReadBoats')}" /> + </div> + </fieldset> <fieldset> @@ -88,13 +109,15 @@ </fieldset> <div class="form-actions"> - <s:url action="companies" id="companiesUrl" /> - <s:a href="%{companiesUrl}" cssClass="btn"> + <s:url action="wao-users" id="waoUsersUrl"> + <s:param name="companyId" value="updateWaoUserCommand.companyId" /> + </s:url> + <s:a href="%{waoUsersUrl}" cssClass="btn"> <i class="icon-chevron-left"></i> <s:text name="wao.ui.action.cancel" /> </s:a> <s:submit type="button" cssClass="btn"> - <i class="icon-ok"></i> <s:text name="wao.ui.action.save" /> + <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" /> </s:submit> </div> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/administration/wao-users.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -26,15 +26,8 @@ </tr> <s:iterator value="waoUsers"> <tr> - <td> - <s:if test="active"> - <s:property value="login" /> - </s:if> - <s:else> - <del> - <s:property value="login" /> - </del> - </s:else> + <td<s:if test=" ! active"> class="inactive"</s:if>> + <s:property value="login" /> </td> <td> <s:property value="fullName" /> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/edit-news-input.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -11,7 +11,7 @@ <s:textfield name="news.title" label="%{getText('wao.ui.news.title')}" cssClass="input-xxlarge" /> - <s:textarea name="news.content" label="%{getText('wao.ui.news.content')}" cssClass="input-xxlarge" rows="15" /> + <s:textarea name="news.content" label="%{getText('wao.ui.news.content')}" /> <div class="form-actions"> <s:url action="news" id="newsUrl" /> @@ -20,7 +20,7 @@ </s:a> <s:submit type="button" cssClass="btn"> - <i class="icon-ok"></i> <s:text name="wao.ui.action.save" /> + <i class="icon-hdd"></i> <s:text name="wao.ui.action.save" /> </s:submit> </div> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/news.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -9,7 +9,7 @@ <s:url action="edit-news!input" id="createNewsUrl" /> <s:a href="%{createNewsUrl}"> - <%-- TODO i18n --> + <%-- TODO i18n --%> <i class="icon-plus"></i> Ajouter une actualité </s:a> Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-05 14:29:43 UTC (rev 1714) @@ -27,31 +27,31 @@ <a class="brand" href="#">Wao <s:property value="getText(obsProgram)" /></a> <ul class="nav"> <li class="active"> - <s:url action="news" id="newsUrl" /> + <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="news" id="newsUrl" /> <s:a href="%{newsUrl}"> <s:text name="wao.ui.page.Index.title" /> </s:a> </li> <li> - <s:url action="sampling-plan" id="samplingPlanUrl" /> + <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="sampling-plan" id="samplingPlanUrl" /> <s:a href="%{samplingPlanUrl}"> <s:text name="wao.ui.page.SamplingPlan.title" /> </s:a> </li> <li> - <s:url action="boats" id="boatsUrl" /> + <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="boats" id="boatsUrl" /> <s:a href="%{boatsUrl}"> <s:text name="wao.ui.page.Boats.title" /> </s:a> </li> <li> - <s:url action="contacts" id="contactsUrl" /> + <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="contacts" id="contactsUrl" /> <s:a href="%{contactsUrl}"> <s:text name="wao.ui.page.Contacts.title" /> </s:a> </li> <li> - <s:url action="synthesis" id="synthesisUrl" /> + <s:url namespace="/%{obsProgram.name().toLowerCase()}" action="synthesis" id="synthesisUrl" /> <s:a href="%{synthesisUrl}"> <s:text name="wao.ui.page.Synthesis.title" /> </s:a> @@ -111,12 +111,12 @@ </div> </div> - <content> + <main> <s:actionerror theme="bootstrap" /> <s:actionmessage theme="bootstrap" /> <s:fielderror theme="bootstrap" /> <decorator:body /> - </content> + </main> <footer class="hidden-print<s:if test="%{instanceDisclaimer != null}"> disclaimer-displayed</s:if>" > <ul> Modified: trunk/wao-web/src/main/webapp/css/wao.css =================================================================== --- trunk/wao-web/src/main/webapp/css/wao.css 2014-03-05 11:21:54 UTC (rev 1713) +++ trunk/wao-web/src/main/webapp/css/wao.css 2014-03-05 14:29:43 UTC (rev 1714) @@ -1,3 +1,7 @@ +/** + * Le style du layout + */ + footer { text-align: center; margin-left: auto; @@ -11,4 +15,45 @@ footer ul li { display: inline; margin-left: 20px; -} \ No newline at end of file +} + +main { + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +/** + * Le style général des formulaires + */ + +.form-actions { + margin-top: 75px; +} + +textarea { + width: 100%; + min-height: 300px; +} + +.form-actions button[type="submit"] { + float: right; +} + +legend+.control-group { + margin-top: 0px; +} + +/** + * Des classes à usage transverse + */ + +/* pour représente qu'une entité (société, utilisateur) est inactive */ +.inactive { + text-decoration: line-through; +} + +th.actions, td.actions { + white-space: nowrap; +} +