import org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin
import org.hibernate.Session
import org.hibernate.SQLQuery
+import org.lilie.services.eliot.scolarite.StructureEnseignement
+import org.lilie.services.eliot.scolarite.annuaire.LocalGroupeService
+import org.lilie.services.eliot.annuaire.Fonction
+import org.lilie.services.eliot.scolarite.Matiere
abstract class AbstractMigraionPartgasService {
AnnuaireService annuaireService
DistantAutoriteService distantAutoriteService
+ LocalGroupeService localGroupeService
def grailsApplication
SessionFactory sessionFactory
SELECT autorisation
FROM Autorisation AS autorisation
INNER JOIN FETCH autorisation.autorite as autorite
- WHERE autorisation.item.id =:itemId
+ WHERE autorisation.item.id = :itemId
AND autorite.type = :groupe
AND autorite.localisation = :localisation
AND autorisation.valeurPermissionsExpliciteDefaut != 0
sqlQuery.executeUpdate()
}
+
+
+ protected void migrePermissionsManuelsSurGroupesScolariteLocaux(Item item) {
+
+ List<Autorisation> autorisations = findAllAutorisationManuelGroupeDistant(item)
+
+ autorisations.each {Autorisation autorisation ->
+ migrePermissionManuelSurGroupeScolariteLocal(autorisation)
+ }
+ }
+
+
+ private void migrePermissionManuelSurGroupeScolariteLocal(Autorisation autorisation) {
+
+ String idExterneGroupeDistant = autorisation.autorite.idExterne
+ GroupeInfo groupeDistant = annuaireService.getGroupeInfo(autorisation.autorite.idExterne)
+
+ if (!groupeDistant) {
+ log.warn(
+ "Le groupe distant pour l'idExterne = $idExterneGroupeDistant n'est pas trouvé. " +
+ "L'autorisation $autorisation ne peut pas être migré sur un groupe local."
+ )
+ return
+ }
+
+ if (groupeDistant.typeGroupe != GroupeInfo.TYPEGROUPE_SCOLARITE) {
+ log.info(
+ "Le groupe distant idExterne = ${idExterneGroupeDistant} n'est pas un groupe de scolarité. " +
+ "L'autorisation $autorisation ne peut pas être migré ")
+ return
+ }
+
+ switch (groupeDistant.typeGroupeScolarite) {
+ case GroupeInfo.GROUPE_ELEVE:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.classe,
+ FonctionEnum.ELEVE
+ )
+ break
+
+ case GroupeInfo.GROUPE_GROUPE_ENSEIGNEMENT_ELEVE:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.groupeEnseignement,
+ FonctionEnum.ELEVE
+ )
+ break
+
+ case GroupeInfo.GROUPE_PARENT:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.classe,
+ FonctionEnum.PERS_REL_ELEVE
+ )
+ break
+
+ case GroupeInfo.GROUPE_GROUPE_ENSEIGNEMENT_PARENT:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.groupeEnseignement,
+ FonctionEnum.PERS_REL_ELEVE
+ )
+ break
+
+ case GroupeInfo.GROUPE_ENSEIGNANT:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.classe,
+ FonctionEnum.ENSEIGNANT
+ )
+ break
+
+ case GroupeInfo.GROUPE_GROUPE_ENSEIGNEMENT_ENSEIGNANT:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.groupeEnseignement,
+ FonctionEnum.ENSEIGNANT
+ )
+ break
+
+ case GroupeInfo.GROUPE_PRINCIPAUX_ENSEIGNANT:
+ migrePermissionsGroupeStructureEnseignement(
+ autorisation,
+ groupeDistant.etablissementId,
+ groupeDistant.groupeEnseignement,
+ FonctionEnum.ENSEIGNANT,
+ true
+ )
+ break
+
+ case GroupeInfo.GROUPE_DISCIPLINE_ENSEIGNANT:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.ENSEIGNANT,
+ groupeDistant.discipline
+ )
+ break
+
+ case GroupeInfo.GROUPE_ADMINS_LOCAUX:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.ADMIN_LOCAL
+ )
+ break
+
+ case 'GRP_INVITE':
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.INVITE
+ )
+ break
+
+ case GroupeInfo.GROUPE_PERSONNEL:
+ switch (groupeDistant.fonction) {
+ case GroupeInfo.FONCTION_PERSONNEL_DIRECTION:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.DIRECTION
+ )
+ break
+
+ case GroupeInfo.FONCTION_PERSONNEL_CPE:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.EDUCATION
+ )
+ break
+
+ case GroupeInfo.FONCTION_CHEF_TRAVAUX:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.CHEF_TRAVAUX
+ )
+ break
+
+ case GroupeInfo.FONCTION_PERSONNEL_DOCUMENTATION:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.DOCUMENTALISTE
+ )
+ break
+
+ case GroupeInfo.FONCTION_PERSONNEL_ORIENTATION:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.ORIENTATION
+ )
+ break
+
+ case GroupeInfo.FONCTION_PERSONNEL_MDS:
+ migrePermissionsGroupeEtablissement(
+ autorisation,
+ groupeDistant.etablissementId,
+ FonctionEnum.PERSONNEL_MEDICO_SOCIAL
+ )
+ break
+
+ default:
+ if (log.infoEnabled) {
+ log.info("Le groupe de personnel éducation distant avec fonction ${groupeDistant.fonction} " +
+ "n'a pas d'équivalence dans l'annuaire local. L'autorisation $autorisation " +
+ "ne peut donc pas être migré sur un groupe local.")
+ }
+ break
+ }
+ break
+
+ default:
+ if (log.infoEnabled) {
+ log.info("Le groupe de scolarité distant de type ${groupeDistant.typeGroupeScolarite} " +
+ "n'a pas d'équivalence dans l'annuaire local. L'autorisation $autorisation " +
+ "ne peut donc pas être migré sur un groupe local.")
+ }
+ break
+ }
+ }
+
+
+ private void migrePermissionsGroupeStructureEnseignement(Autorisation autorisation,
+ String etabIdExterne,
+ String structEnsCode,
+ FonctionEnum fonction,
+ Boolean isResponsable = null) {
+ if (!etabIdExterne) {
+ log.warn("L'idExterne de l'établissement du groupe distant n'est pas fourni. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ Etablissement etab = Etablissement.findByIdExterne(etabIdExterne)
+
+ if (!etab) {
+ log.warn("L'établissement avec idExterne = $etabIdExterne n'existe pas dans dans l'annuaire local. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ if (!structEnsCode) {
+ log.warn("Le code de la structure d'enseignement du groupe distant n'est pas fourni. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ StructureEnseignement structure =
+ StructureEnseignement.findByCodeAndEtablissement(structEnsCode, etab)
+
+ if (!structure) {
+ log.warn("La structure d'enseignement avec code = $structEnsCode n'existe pas dans l'établissement $etab. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ Autorite autoriteGroupeLocal = localGroupeService.findOrCreeGroupeStructureEnseignement(
+ structure,
+ Fonction.findByCode(fonction.code, [cache: true]),
+ isResponsable
+ ).autorite
+
+ migrePermissions(autorisation, autoriteGroupeLocal)
+ }
+
+ private void migrePermissionsGroupeEtablissement(Autorisation autorisation,
+ String etabIdExterne,
+ FonctionEnum fonction,
+ String nomMatiere = null) {
+ if (!etabIdExterne) {
+ log.warn("L'idExterne de l'établissement du groupe distant n'est pas fourni. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ Etablissement etab = Etablissement.findByIdExterne(etabIdExterne)
+
+ if (!etab) {
+ log.warn("L'établissement avec idExterne = $etabIdExterne n'existe pas dans l'annuaire local. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+
+ Matiere matiere = null
+ if (nomMatiere) {
+ matiere = findMatiereByEtablissementAndNomMatiere(etab, nomMatiere)
+
+ if (!matiere) {
+ log.warn("La matière avec code = $nomMatiere n'existe pas dans l'établissement $etab. " +
+ "L'autorisation $autorisation ne peut donc pas être migré sur un groupe local.")
+ return
+ }
+ }
+
+ Autorite autoriteGroupeLocal = localGroupeService.findOrCreeGroupeEtablissement(
+ etab,
+ Fonction.findByCode(fonction.code, [cache: true]),
+ matiere
+ ).autorite
+
+ migrePermissions(autorisation, autoriteGroupeLocal)
+ }
+
+
+ private Matiere findMatiereByEtablissementAndNomMatiere(Etablissement etablissement,
+ String nomMatiere) {
+ Matiere.createCriteria().get {
+ eq('etablissement', etablissement)
+ or {
+ eq('codeGestion', nomMatiere)
+ eq('libelleCourt', nomMatiere)
+ eq('libelleEdition', nomMatiere)
+ eq('libelleLong', nomMatiere)
+ }
+ maxResults(1)
+ }
+ }
+
+
+ private void migrePermissions(Autorisation autorisation, Autorite autoriteCible) {
+
+ Autorisation autorisationCible =
+ Autorisation.findByItemAndAutorite(autorisation.item, autoriteCible)
+
+ if (autorisationCible) {
+ autorisationCible.valeurPermissionsExplicite =
+ autorisationCible.valeurPermissionsExplicite |
+ autorisation.valeurPermissionsExplicite
+
+ autorisationCible.save(failOnError: true)
+ autorisation.delete()
+ }
+ else {
+ autorisation.autorite = autoriteCible
+ autorisation.save(failOnError: true, flush: true)
+ }
+ }
+
+
+ private static final String FIND_ALL_AUTORISATION_MANUEL_GROUPE_DISTANT =
+ """select autorisation
+ from Autorisation autorisation
+ inner join fetch autorisation.autorite autorite
+ where autorisation.item.id = :itemId
+ and autorisation.proprietaire = false
+ and autorisation.valeurPermissionsExpliciteDefaut = 0
+ and autorite.localisation = '${Autorite.LOCALISATION_DISTANTE}'
+ and autorite.type = '${Autorite.TYPE_GROUPE}'
+ """
+
+ private List<Autorisation> findAllAutorisationManuelGroupeDistant(Item item) {
+
+ return Autorisation.executeQuery(
+ FIND_ALL_AUTORISATION_MANUEL_GROUPE_DISTANT,
+ [itemId: item.id]
+ )
+ }
+
}
import org.hibernate.FlushMode
import org.lilie.services.eliot.annuaire.GroupeInfo
import org.lilie.services.eliot.scolarite.Etablissement
-import org.lilie.services.eliot.scolarite.annuaire.LocalGroupeService
import org.lilie.services.eliot.securite.impl.Autorite
import org.lilie.services.eliot.securite.PermissionsManager
import org.lilie.services.eliot.securite.impl.DefaultPermissionsManager
private static final MIGRATION_PARTAGES_MANUEL = 'TEXTES_MIGRATION_PARTAGES_MANUEL'
CahierDeTextesPartageAutoService cahierDeTextesPartageAutoService
- LocalGroupeService localGroupeService
void execute() {
// La migration se fait uniquement en mode maintenance
GroupeInfo groupe = annuaireService.getGroupeInfo(idExterneGroupeDistant)
if (!groupe) {
- log.warn("Le groupe distant pour l'idExterne $idExterneGroupeDistant n'est pas trouvé")
+ log.warn("Le groupe distant pour l'idExterne = $idExterneGroupeDistant n'est pas trouvé")
return
}
private void migrePartagesManuel() {
- //TOIMP ...
+ String operation = MIGRATION_PARTAGES_MANUEL
+ if (grailsApplication.config.eliot.textes.migration.partages.manuel != true) {
+ if (log.infoEnabled) {
+ log.info("L'opération $operation n'est pas activée (eliot.textes.migration.partages.manuel)")
+ }
+ return
+ }
+
+ if (isTermine(operation)) {
+ if (log.infoEnabled) {
+ log.info("L'oprération $operation avait déjà été effectuée")
+ }
+ return
+ }
+
+ if (log.infoEnabled) {log.info("Début opération: " + operation)}
+
+ GormUtils.withFlushModeAndSession(FlushMode.MANUAL) {Session session ->
+
+ if (!isCommence(operation)) {
+ marqueCahiersPartagesManuellementAMigrer()
+ }
+
+ marqueDebutOperation(operation)
+
+ for (
+ List<CahierDeTextes> cdts = findLotCahierDeTextesATraiter();
+ !cdts.isEmpty();
+ cdts = findLotCahierDeTextesATraiter()
+ ) {
+
+ CahierDeTextes.withTransaction {
+ cdts.each { CahierDeTextes cdt ->
+ migrePermissionsManuelsSurGroupesLocaux(cdt)
+ }
+ session.flush()
+ clear()
+ }
+ }
+
+ marqueFinOperation(operation)
+ }
+
+ if (log.infoEnabled) {log.info('Fin opération: ' + operation)}
+ }
+
+
+ private void marqueCahiersPartagesManuellementAMigrer() {
+
+ String query = """
+ UPDATE entcdt.cahier_de_textes AS cahier
+ SET is_migre =
+ CASE
+ WHEN EXISTS (
+ SELECT * FROM entcdt.cahier_de_textes AS cdt
+ LEFT JOIN ent.annee_scolaire AS annee
+ ON cdt.annee_scolaire_id = annee.id
+ INNER JOIN securite.autorisation AS autorisation
+ ON cdt.item_id = autorisation.item_id
+ INNER JOIN securite.autorite AS autorite
+ ON autorisation.autorite_id = autorite.id
+ WHERE cdt.id = cahier.id
+ AND annee.annee_en_cours IS DISTINCT FROM false
+ AND autorisation.proprietaire = false
+ AND valeur_permissions_explicite_defaut = 0
+ AND autorite.localisation = 'DISTANTE'
+ AND autorite.type = 'groupe'
+ )
+ THEN false
+ ELSE NULL
+ END
+ """
+
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(query)
+
+ sqlQuery.executeUpdate()
+ }
+
+
+ private void migrePermissionsManuelsSurGroupesLocaux(CahierDeTextes cdt) {
+
+ if (log.infoEnabled) {
+ log.info("Migration des partages manuels pour le cahier CahierDeTextes{id = ${cdt.id}, nom = ${cdt.nom}}")
+ }
+
+ migrePermissionsManuelsSurGroupesScolariteLocaux(cdt.item)
+
+ cdt.isMigre = true
+ cdt.save(failOnError: true)
}