--- /dev/null
+/*
+ * Copyright © FYLAB and the Conseil Régional d'Île-de-France, 2009
+ * This file is part of L'Interface Libre et Interactive de l'Enseignement (Lilie).
+ *
+ * Lilie is free software. You can redistribute it and/or modify since
+ * you respect the terms of either (at least one of the both license) :
+ * - 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.
+ * - the CeCILL-C as published by CeCILL-C; either version 1 of the
+ * License, or any later version
+ *
+ * There are special exceptions to the terms and conditions of the
+ * licenses as they are applied to this software. View the full text of
+ * the exception in file LICENSE.txt in the directory of this software
+ * distribution.
+ *
+ * Lilie 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
+ * Licenses for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the CeCILL-C along with Lilie. If not, see :
+ * <http://www.gnu.org/licenses/> and
+ * <http://www.cecill.info/licences.fr.html>.
+ */
+
+
+
+package org.lilie.services.eliot.textes
+
+import org.lilie.services.eliot.securite.impl.Item
+
+import org.lilie.services.eliot.securite.impl.Autorite
+import org.lilie.services.eliot.securite.PermissionsManager
+import org.lilie.services.eliot.securite.impl.DefaultPermissionsManager
+import org.lilie.services.eliot.DistantAutoriteService
+import org.lilie.services.eliot.annuaire.AnnuaireService
+import org.lilie.services.eliot.applications.textes.recherche.TextesIndexationService
+import org.lilie.services.eliot.annuaire.SecuriteSession
+import org.lilie.services.eliot.annuaire.FonctionEnum
+import org.lilie.services.eliot.scolarite.personne.AutoriteNomAffichageService
+import org.lilie.services.eliot.droits.EliotDroitsService
+import org.lilie.services.eliot.fonctionnalites.EliotFonctionnalite
+import org.lilie.services.eliot.textes.fonctionnalite.TextesFonctionnalite
+import org.codehaus.groovy.grails.commons.GrailsApplication
+import org.lilie.services.eliot.droits.DroitsEtPermissionsService
+import org.lilie.services.eliot.droits.Droit
+
+/**
+ * Façade recouperant les info sur les droits associé à un cahier de textes
+ */
+class DroitsService extends EliotDroitsService {
+
+ static transactional = true
+
+ DistantAutoriteService distantAutoriteService
+ TextesIndexationService textesIndexationService
+ AnnuaireService annuaireService
+ TextesActiviteService textesActiviteService
+ org.lilie.services.eliot.scolarite.personne.LocalPersonneService localPersonneService
+ AutoriteNomAffichageService autoriteNomAffichageService
+ DroitsEtPermissionsService droitsEtPermissionsService
+
+ // jcok : grailsApplication est un singleton
+ @SuppressWarnings('GrailsStatelessService')
+ GrailsApplication grailsApplication
+
+ public static final String TYPE_GROUPE = 'g'
+ public static final String TYPE_ACTEUR = 'u'
+
+
+ protected List<EliotFonctionnalite> getFonctionnalites() {
+ List<EliotFonctionnalite> result = []
+ result.addAll(TextesFonctionnalite.values().toList())
+ return result
+ }
+
+ public HashSet getFonctionnalitesAccessibles(SecuriteSession securiteSession) {
+
+
+ List<EliotFonctionnalite> listeFonctionnalites = getFonctionnalites()
+ Boolean isAccesLvsActive = grailsApplication.config.eliot.accesLvs.active
+
+
+ if (!securiteSession.hasFonctionIn([FonctionEnum.DIRECTION])) {
+ listeFonctionnalites.remove(
+ TextesFonctionnalite.RECHERCHE_DES_CAHIERS_DE_TEXTES
+ )
+ }
+
+ if (!isAccesLvsActive) {
+ listeFonctionnalites.remove(
+ TextesFonctionnalite.VIE_SCOLAIRE
+ )
+ }
+
+ HashSet fonctionnalitesAccessibles = (HashSet) listeFonctionnalites
+ return fonctionnalitesAccessibles
+ }
+
+ /**
+ * Recoupere la liste des droits des groupes d'un cdt
+ * @return une liste d'objets <code>Droit</code>
+ */
+ List<Droit> chargeDroitsGroupes(CahierDeTextes cahierDeTextes,
+ SecuriteSession securiteSession) {
+ Item item = cahierDeTextes.item
+
+ return droitsEtPermissionsService.chargeDroitsGroupes(item, securiteSession)
+ }
+
+ /**
+ * Recupere la liste des droits des acteurs d'un cdt
+ * @return une liste d'objets <code>Droit</code>
+ */
+ List<Droit> chargeDroitsActeurs(CahierDeTextes cahierDeTextes,
+ SecuriteSession securiteSession) {
+ Item item = cahierDeTextes.item
+ return droitsEtPermissionsService.chargeDroitsActeursItem(item, securiteSession)
+ }
+
+ /**
+ * Met à jour les droits.
+ * @param cahierDeTextes cahier de textes affecté
+ * @param droitsActeurs une liste d'objets <code>Droit</code> pour les acteurs
+ * @param droitsGroupes une liste d'objets <code>Droit </code> pour les groupes
+ * @param item l'élément pour lequel on veut modifier les droits
+ * @param securiteSession une session de securité
+ * @throws org.lilie.services.eliot.securite.AutorisationException si la
+ * <code>securiteSession</code> n'a pas les droits de modifer les droits...
+ */
+ void majDroits(CahierDeTextes cahierDeTextes,
+ List<Droit> droitsActeurs,
+ List<Droit> droitsGroupes,
+ SecuriteSession securiteSession) {
+
+ Item item = cahierDeTextes.item
+
+ // Récupération des droits existants
+ List droitsActeursExistants = chargeDroitsActeurs(
+ cahierDeTextes,
+ securiteSession
+ )
+ List droitsGroupesExistants = chargeDroitsGroupes(
+ cahierDeTextes,
+ securiteSession
+ )
+
+ // Calcul des droits à supprimer = droits existants - droits à ajouter ou maj,
+ List idsAutoriteActeursSuppr =
+ droitsActeursExistants*.idAutorite - droitsActeurs*.idAutorite
+
+ List idsAutoriteGroupesSuppr =
+ droitsGroupesExistants*.idAutorite - droitsGroupes*.idAutorite
+
+ droitsActeurs = filtreDroitsPasChanges(droitsActeurs, droitsActeursExistants)
+ droitsGroupes = filtreDroitsPasChanges(droitsGroupes, droitsGroupesExistants)
+
+ // enregistre les droits à ajouter ou a maj
+ enregistreDroitsActeurs(securiteSession, item, droitsActeurs)
+ enregistreDroitsGroupes(securiteSession, item, droitsGroupes)
+
+ // enregistre les droits à supprimmer
+ enleveDroitsActeurs(securiteSession, item, idsAutoriteActeursSuppr)
+ enleveDroitsGroupes(securiteSession, item, idsAutoriteGroupesSuppr)
+
+ textesIndexationService.reindexerCahierDeTextesDroits(
+ securiteSession,
+ cahierDeTextes
+ )
+ }
+
+ /**
+ * Enleve de droitsNouvels les droits qui n'ont pas changee par rapport
+ * aux droits existants
+ * @param droitsNouvels
+ * @param droitsExistants
+ * @return droits a enregistrer
+ */
+ private List<Droit> filtreDroitsPasChanges(List<Droit> droitsNouvels,
+ List<Droit> droitsExistants) {
+ droitsNouvels.each { Droit droitNouvel ->
+ Droit droitExistant = droitsExistants.find { it.idAutorite == droitNouvel.idAutorite }
+ if (droitExistant) {
+
+ if (droitExistant.consultationParDefaut) {
+ droitNouvel.consultation = null // droit par defaut - on ne peut pas le changer
+ } else if (droitExistant.consultation == droitNouvel.consultation) {
+ droitNouvel.consultation = null // rien a change
+ }
+
+ if (droitExistant.modificationParDefaut) {
+ droitNouvel.modification = null // droit par defaut - on ne peut pas le changer
+ } else if (droitExistant.modification == droitNouvel.modification) {
+ droitNouvel.modification = null // rien a change
+ }
+ }
+ }
+
+ return droitsNouvels.findAll { it.consultation != null || it.modification != null }
+ }
+
+ /**
+ * Enleve les droits d'acteurs sur un item
+ * @param securiteSession
+ * @param item
+ * @param droits
+ */
+ private void enleveDroitsActeurs(SecuriteSession securiteSession,
+ Item item,
+ List acteurAutoriteIds) {
+ acteurAutoriteIds.each {String idAutorite ->
+ Autorite autorite = distantAutoriteService.getAutoriteActeurForIdExterne(
+ idAutorite,
+ true
+ )
+ enregistreDroits(securiteSession, item, autorite, false, false)
+ }
+ }
+
+ /**
+ * Enleve les droits des groupes sur un item
+ * @param securiteSession
+ * @param item
+ * @param droits
+ */
+ private void enleveDroitsGroupes(SecuriteSession securiteSession,
+ Item item,
+ List groupeAutoriteIds) {
+ groupeAutoriteIds.each {String idAutorite ->
+ Autorite autorite = distantAutoriteService.getAutoriteGroupeForIdExterne(
+ idAutorite,
+ true
+ )
+ enregistreDroits(securiteSession, item, autorite, false, false)
+ }
+ }
+
+ /**
+ * Enregistre les droits d'acteurs sur un item
+ * @param securiteSession
+ * @param item
+ * @param droits
+ */
+ private void enregistreDroitsActeurs(SecuriteSession securiteSession,
+ Item item,
+ List<Droit> droits) {
+ droits.each { Droit droit ->
+ Autorite autorite = distantAutoriteService.getAutoriteActeurForIdExterne(
+ droit.idAutorite,
+ true
+ )
+ enregistreDroits(
+ securiteSession,
+ item,
+ autorite,
+ droit.consultation,
+ droit.modification)
+ }
+ }
+
+ /**
+ * Enregistre les droits des groupes sur un item
+ * @param securiteSession
+ * @param item
+ * @param droits
+ */
+ private void enregistreDroitsGroupes(SecuriteSession securiteSession,
+ Item item,
+ List<Droit> droits) {
+ droits.each {Droit droit ->
+ Autorite autorite = distantAutoriteService.getAutoriteGroupeForIdExterne(
+ droit.idAutorite,
+ true
+ )
+ enregistreDroits(
+ securiteSession,
+ item,
+ autorite,
+ droit.consultation,
+ droit.modification)
+ }
+ }
+
+ /**
+ * Enregistre les droits d'une autorite sur un item
+ * @param securiteSession
+ * @param item
+ * @param autorite
+ * @param peutConsulter
+ * @param peutModifier
+ */
+ private void enregistreDroits(SecuriteSession securiteSession,
+ Item item,
+ Autorite autorite,
+ Boolean peutConsulter,
+ Boolean peutModifier) {
+ PermissionsManager permManager = new DefaultPermissionsManager(
+ item,
+ autorite,
+ securiteSession
+ )
+ changeDroits(permManager, peutConsulter, peutModifier)
+ }
+
+ /**
+ * Changement des droits en fonction des permissions passées en paramètre.
+ */
+ private void changeDroits(PermissionsManager permManager,
+ Boolean peutConsulter,
+ Boolean peutModifier) {
+ if (peutModifier != null) {
+ if (peutModifier) {
+ permManager.addPermissionModification()
+ } else {
+ permManager.deletePermissionModification()
+ }
+ }
+ if (peutConsulter != null) {
+ if (peutConsulter) {
+ permManager.addPermissionConsultation()
+ } else {
+ permManager.deletePermissionConsultation()
+ }
+ }
+ }
+
+}