Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 21/03/2023 11:05:20

Mathieu
Guest
Registered: 26/09/2017
Posts: 42

Extraction de données ODF

Salut,

je viens de faire un petit script pour sortir des informations des coursesContent depuis un catalogue :

let count = 0;

print('Compteur; Libellé; Code Apogée; Description; Objectifs; Pré requis nécessaires; Contrôle des connaissances; syllabus; compétences visées; Informations complémentaires; Composantes; lieux; Campus; rôle1; contacts1; role2; contacts2; Label; Mots clés; Volume horaire; Effectif; Période de l année; Plage horaire; Méthode d enseignement; Organisation d enseignement; Forme d enseignement; Langues; Date de début des cours')  
 
Repository.query('//element(*, ametys:courseContent)[ametys:catalog="ue-iibres-2023"]').forEach(function(courseContent) {
  count++;
 
 
  //Haut de page
  let libellé= courseContent.getNode().getProperty("ametys:title").getString();
  //print("\n"+libellé);
  let codeApogee= courseContent.getNode().getProperty("ametys:codeApogee").getString();
  //print(codeApogee);
 
  //Onglet Presentation
  let description = courseContent.getNode().getNode("ametys:description").getProperty("jcr:data").getString();
  //print(description);
  let objectifs = courseContent.getNode().getNode("ametys:objectives").getProperty("jcr:data").getString();
  //print(objectifs);
  let prerequis = courseContent.getNode().getNode("ametys:neededPrerequisite").getProperty("jcr:data").getString();
  //print(prerequis);
 
  //Onglet +d'infos
  let controleConnaissance = courseContent.getNode().getNode("ametys:formOfAssessment").getProperty("jcr:data").getString();
  //print(controleConnaissance);
  let syllabus = courseContent.getNode().getNode("ametys:syllabus").getProperty("jcr:data").getString();
  //print(syllabus);
  let competencesVisées = courseContent.getNode().getNode("ametys:skills").getProperty("jcr:data").getString();
  //print(competencesVisées);
  let infosComplementaires = courseContent.getNode().getNode("ametys:additionalInformations").getProperty("jcr:data").getString();
  //print(infosComplementaires);
 
  //Onglet Contacts
  let composantesValues = courseContent.getNode().getProperty("ametys:orgUnit").getValues();
  let composantes=[];
  for (let i = 0; i < composantesValues.length; i++) {
    composantes.push(Repository.resolver.resolveById(composantesValues[i].getString()).getNode().getProperty("ametys:title").getString());
  }
  //print(composantes);
 
  let lieuxValues = courseContent.getNode().getProperty("ametys:teachingLocation").getValues();
  let lieux=[];
  for (let i = 0; i < lieuxValues.length; i++) {
    lieux.push(Repository.resolver.resolveById(lieuxValues[i].getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString());
  }
  //print(lieux);
 
  let campusValues = courseContent.getNode().getProperty("ametys:campus").getValues();
  let campus=[];
  for (let i = 0; i < campusValues.length; i++) {
    campus.push(Repository.resolver.resolveById(campusValues[i].getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString());
  }
  //print(campus);
 
  //contact et role
  let role1=null;
  let contacts1=[];
  if(courseContent.getNode().getNode("ametys:contacts").hasNode("ametys:1"))
  {
    role1 = Repository.resolver.resolveById(courseContent.getNode().getNode("ametys:contacts").getNode("ametys:1").getProperty("ametys:role").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
    //print(role1);
    let contacts1Values = courseContent.getNode().getNode("ametys:contacts").getNode("ametys:1").getProperty("ametys:persons").getValues();
    for (let i = 0; i < contacts1Values.length; i++) {
      contacts1.push(Repository.resolver.resolveById(contacts1Values[i].getString()).getNode().getProperty("ametys:title").getString());
    }
    //print(contacts1);
  }

  let role2=null;
  let contacts2=[];
    if(courseContent.getNode().getNode("ametys:contacts").hasNode("ametys:2"))
  {
    role2 = Repository.resolver.resolveById(courseContent.getNode().getNode("ametys:contacts").getNode("ametys:2").getProperty("ametys:role").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
    //print(role2);
    let contacts2Values = courseContent.getNode().getNode("ametys:contacts").getNode("ametys:2").getProperty("ametys:persons").getValues();
    for (let i = 0; i < contacts2Values.length; i++) {
      contacts2.push(Repository.resolver.resolveById(contacts2Values[i].getString()).getNode().getProperty("ametys:title").getString());
    }
    //print(contacts2);
  }
 
  //Onglet en bref
  let labelValues = courseContent.getNode().getProperty("ametys:labellisation").getValues();
  let label=[];
  for (let i = 0; i < labelValues.length; i++) {
    label.push(Repository.resolver.resolveById(labelValues[i].getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString());
  }
  //print(label);
  let motsClésValues= courseContent.getNode().getProperty("ametys:keywords").getValues();
  let motsClés=[];
  for (let i = 0; i < motsClésValues.length; i++) {
    motsClés.push(motsClésValues[i].getString());
  }
  //print(motsClés);

  //if(courseContent.getNode().hasProperty("ametys:nbHours"))
  let volumeHoraire = courseContent.getNode().hasProperty("ametys:nbHours") ? courseContent.getNode().getProperty("ametys:nbHours").getString() : null ;
  //print(volumeHoraire);
 
  let effectif = courseContent.getNode().getProperty("ametys:maxNumberOfStudents").getString();
  //print(effectif);

  let periodeAnnée = Repository.resolver.resolveById(courseContent.getNode().getProperty("ametys:teachingTerm").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
  //print(periodeAnnée);
 
  let plageHoraire= null;
  if(courseContent.getNode().hasProperty("ametys:timeSlot") & courseContent.getNode().getProperty("ametys:timeSlot").getString() != "")
  {
    plageHoraire = Repository.resolver.resolveById(courseContent.getNode().getProperty("ametys:timeSlot").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
    //print(plageHoraire);
  }
 
  let methodeEnseignement = Repository.resolver.resolveById(courseContent.getNode().getProperty("ametys:formofteachingMethod").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
  //print(methodeEnseignement);
 
  let organisationEnseignementValues = courseContent.getNode().getProperty("ametys:formofteachingOrg").getValues();
  let organisationEnseignement=[];
  for (let i = 0; i < organisationEnseignementValues.length; i++) {
    organisationEnseignement.push(Repository.resolver.resolveById(organisationEnseignementValues[i].getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString());
  }
  //print(organisationEnseignement);
 
  let formeEnseignement= null;
  if(courseContent.getNode().hasProperty("ametys:teachingActivity") & courseContent.getNode().getProperty("ametys:teachingActivity").getString() != "")
  {
      formeEnseignement = Repository.resolver.resolveById(courseContent.getNode().getProperty("ametys:teachingActivity").getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString();
      //print(formeEnseignement);
  }
    
  let languesValues = courseContent.getNode().getProperty("ametys:teachingLanguage").getValues();
  let langues=[];
  for (let i = 0; i < languesValues.length; i++) {
    langues.push(Repository.resolver.resolveById(languesValues[i].getString()).getNode().getNode("ametys:title").getProperty("ametys:fr").getString());
  }
  //print(langues);
      
  let dateDebutCours = courseContent.getNode().getProperty("ametys:startDate").getString();
  //print(dateDebutCours);

  print(`"${count}";"${libellé}";"${codeApogee}";"${description}";"${objectifs}";"${prerequis}";"${controleConnaissance}";"${syllabus}";"${competencesVisées}";"${infosComplementaires}";"${composantes}";"${lieux}";"${campus}";"${role1}";"${contacts1}";"${role2}";"${contacts2}";"${label}";"${motsClés}";"${volumeHoraire}";"${effectif}";"${periodeAnnée}";"${plageHoraire}";"${methodeEnseignement}";"${organisationEnseignement}";"${formeEnseignement}";"${langues}";"${dateDebutCours}"`);  
    
}); 

Il faudra sans doute améliorer le script (factoriser le courseContent.getNode() sur chaque ligne, et rajouter des hasNode/hasProperty avant d'aller y faire du getValues/getString, la je ne l'ai fais que pour les quelques cas qui posaient problème dans mon jeu de test) mais j'ai quelques questions pour que ce soit plus pratique à l'usage :
Au lieu de faire un print en sortie console qui ressemble à un csv, est ce qu'il est possible de remplir directement une sortie de type fichier ?
Au lieu de faire un script est ce qu'il serait envisageable d'en faire (relativement facilement) un genre de mini plugin pour que cela soit accessible depuis le cms plutot que via la _repository ? Selectionner un des catalogues + cliquer sur un bouton => obtenir un fichier d'extraction

Offline

#2 21/03/2023 15:35:35

Cédric Damioli
Ametys Product Manager
From: Toulouse
Registered: 10/08/2010
Posts: 321

Re: Extraction de données ODF

Bonjour Mathieu,

Quelle est ta version d'Ametys ?
Dans les versions récentes (>= 4.5 je dirais), on a la fonction Report.create accessible en script et qui permet de générer des rapportes type "tableau", soit en CSV, soit en PJ par mail, soit en print dans la console

En bonus, une fois qu'on a fait ce script, on peut l'enregistrer dans le répertoire de requête et mettre une tâche programmée pour l'exécuter régulièrement par exemple.

Cédric

Offline

#3 21/03/2023 16:21:44

Mathieu
Guest
Registered: 26/09/2017
Posts: 42

Re: Extraction de données ODF

Salut Cédric,

j'utilise la version 4.4.9 et ça à l'air disponible *o* , merci, plus qu'à voir comment faire ça big_smile

Et en attendant, nouvelle version du code en utilisant des fonctions pour faire les vérifications hasProperty et hasNode (pour le coup je perds le coté "objet" :-/)

function getProperty(courseContentNode , propertyName , type)
{
  if(courseContentNode == null && type=="values")
  {
    return [];
  }

  if(courseContentNode == null)
  {
    return null;
  }

  if(courseContentNode.hasProperty(propertyName))
  {
    if(type=="string")
    {
      return courseContentNode.getProperty(propertyName).getString();
    }
    else if (type=="values")
    {
      return courseContentNode.getProperty(propertyName).getValues();
    }
  }
  else {
    return null;
  }
}

function getPropertyString(courseContentNode , propertyName)
{
  return getProperty(courseContentNode , propertyName , "string");
}

function getPropertyValues(courseContentNode , propertyName)
{
  return getProperty(courseContentNode , propertyName , "values");
}

function getNode(courseContentNode , nodeName)
{
  if(courseContentNode == null)
  {
    return null;
  }

  if (courseContentNode.hasNode(nodeName))
  {
    return courseContentNode.getNode(nodeName);
  }
  else
  {
    return null;
  }
}

function getNodeById(id)
{
  if(id == null || id == "")
  {
    return null;
  }

  return Repository.resolver.resolveById(id).getNode();
}

let count = 0;
print('Compteur; Libellé; Code Apogée; Description; Objectifs; Pré requis nécessaires; Contrôle des connaissances; syllabus; compétences visées; Informations complémentaires; Composantes; lieux; Campus; rôle1; contacts1; role2; contacts2; Label; Mots clés; Volume horaire; Effectif; Période de l année; Plage horaire; Méthode d enseignement; Organisation d enseignement; Forme d enseignement; Langues; Date de début des cours')

Repository.query('//element(*, ametys:courseContent)[ametys:catalog="ue-iibres-2023"]').forEach(function(courseContent) {
  count++;
  let courseContentNode = courseContent.getNode();

  //Haut de page
  let libellé= getPropertyString(courseContentNode, "ametys:title");
  //print("\n"+libellé);

  let codeApogee= getPropertyString(courseContentNode,"ametys:codeApogee");
  //print(codeApogee);


  //Onglet Presentation
  let description = getPropertyString(getNode(courseContentNode,"ametys:description"),"jcr:data");

  //print(description);
  let objectifs = getPropertyString(getNode(courseContentNode,"ametys:objectives"),"jcr:data");
  //print(objectifs);

  let prerequis = getPropertyString(getNode(courseContentNode,"ametys:neededPrerequisite"),"jcr:data");
  //print(prerequis);

  //Onglet +d'infos
  let controleConnaissance = getPropertyString(getNode(courseContentNode,"ametys:formOfAssessment"),"jcr:data");
  //print(controleConnaissance);

  let syllabus = getPropertyString(getNode(courseContentNode,"ametys:syllabus"),"jcr:data");
  //print(syllabus);

  let competencesVisées = getPropertyString(getNode(courseContentNode,"ametys:skills"),"jcr:data");
  //print(competencesVisées);

  let infosComplementaires = getPropertyString(getNode(courseContentNode,"ametys:additionalInformations"),"jcr:data");
  //print(infosComplementaires);

  //Onglet Contacts
  let composantesValues = getPropertyValues(courseContentNode,"ametys:orgUnit");
  let composantes=[];
  for (let i = 0; i < composantesValues.length; i++) {
    composantes.push(getPropertyString(getNodeById(composantesValues[i].getString()),"ametys:title"));
  }
  //print(composantes);

  let lieuxValues = getPropertyValues(courseContentNode,"ametys:teachingLocation");
  let lieux=[];
  for (let i = 0; i < lieuxValues.length; i++) {
    lieux.push(getPropertyString(getNode(getNodeById(lieuxValues[i].getString()),"ametys:title"),"ametys:fr"));
  }
  //print(lieux);

  let campusValues = getPropertyValues(courseContentNode,"ametys:campus");
  let campus=[];
  for (let i = 0; i < campusValues.length; i++) {
    campus.push(getPropertyString(getNode(getNodeById(campusValues[i].getString()),"ametys:title"),"ametys:fr"));
  }
  //print(campus);

  //contact et role
  let role1=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:role")),"ametys:title"),"ametys:fr");
  //print(role2);
  let contacts1Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:persons");
  let contacts1=[];
  for (let i = 0; i < contacts1Values.length; i++) {
    contacts1.push(getPropertyString(getNodeById(contacts1Values[i].getString()),"ametys:title"));
  }
  //print(contacts2);

  let role2=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:role")),"ametys:title"),"ametys:fr");
  //print(role2);
  let contacts2Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:persons");
  let contacts2=[];
  for (let i = 0; i < contacts2Values.length; i++) {
    contacts2.push(getPropertyString(getNodeById(contacts2Values[i].getString()),"ametys:title"));
  }
  //print(contacts2);

  //Onglet en bref
  let labelValues = getPropertyValues(courseContentNode,"ametys:labellisation");
  let label=[];
  for (let i = 0; i < labelValues.length; i++) {
    label.push(getPropertyString(getNode(getNodeById(labelValues[i].getString()),"ametys:title"),"ametys:fr"));
  }
  //print(label);

  let motsClésValues= getPropertyValues(courseContentNode,"ametys:keywords");
  let motsClés=[];
  for (let i = 0; i < motsClésValues.length; i++) {
    motsClés.push(motsClésValues[i].getString());
  }
  //print(motsClés);

  let volumeHoraire = getPropertyString(courseContentNode,"ametys:nbHours");
  //print(volumeHoraire);

  let effectif = getPropertyString(courseContentNode,"ametys:maxNumberOfStudents");
  //print(effectif);

  let periodeAnnée = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingTerm")),"ametys:title"),"ametys:fr");
  //print(periodeAnnée);

  let plageHoraire= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:timeSlot")),"ametys:title"),"ametys:fr");
  //print(plageHoraire);

  let methodeEnseignement = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:formofteachingMethod")),"ametys:title"),"ametys:fr");
  //print(methodeEnseignement);

  let organisationEnseignementValues = getPropertyValues(courseContentNode,"ametys:formofteachingOrg");
  let organisationEnseignement=[];
  for (let i = 0; i < organisationEnseignementValues.length; i++) {
    organisationEnseignement.push(getPropertyString(getNode(getNodeById(organisationEnseignementValues[i].getString()),"ametys:title"),"ametys:fr"));
  }
  //print(organisationEnseignement);

  let formeEnseignement= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingActivity")),"ametys:title"),"ametys:fr");
  //print(formeEnseignement);

  let languesValues = getPropertyValues(courseContentNode,"ametys:teachingLanguage");
  let langues=[];
  for (let i = 0; i < languesValues.length; i++) {
    langues.push(getPropertyString(getNode(getNodeById(languesValues[i].getString()),"ametys:title"),"ametys:fr"));
  }
  //print(langues);

  let dateDebutCours = getPropertyString(courseContentNode,"ametys:startDate");
  //print(dateDebutCours);

  print(`"${count}";"${libellé}";"${codeApogee}";"${description}";"${objectifs}";"${prerequis}";"${controleConnaissance}";"${syllabus}";"${competencesVisées}";"${infosComplementaires}";"${composantes}";"${lieux}";"${campus}";"${role1}";"${contacts1}";"${role2}";"${contacts2}";"${label}";"${motsClés}";"${volumeHoraire}";"${effectif}";"${periodeAnnée}";"${plageHoraire}";"${methodeEnseignement}";"${organisationEnseignement}";"${formeEnseignement}";"${langues}";"${dateDebutCours}"`);

});

print(`${count} results(s)`);

Last edited by Mathieu (21/03/2023 16:22:17)

Offline

#4 21/03/2023 17:26:22

Mathieu
Guest
Registered: 26/09/2017
Posts: 42

Re: Extraction de données ODF

Hop, nouvelle version avec la fonction Report.create , au final c'est relativement simple de passer les 2 prints que j'avais par l'appel à cette fonction :

  function getProperty(courseContentNode , propertyName , type)
  {
    if(courseContentNode == null && type=="values")
    {
      return [];
    }

    if(courseContentNode == null)
    {
      return null;
    }

    if(courseContentNode.hasProperty(propertyName))
    {
      if(type=="string")
      {
        return courseContentNode.getProperty(propertyName).getString();
      }
      else if (type=="values")
      {
        return courseContentNode.getProperty(propertyName).getValues();
      }
    }
    else {
      return null;
    }
  }

  function getPropertyString(courseContentNode , propertyName)
  {
    return getProperty(courseContentNode , propertyName , "string");
  }

  function getPropertyValues(courseContentNode , propertyName)
  {
    return getProperty(courseContentNode , propertyName , "values");
  }

  function getNode(courseContentNode , nodeName)
  {
    if(courseContentNode == null)
    {
      return null;
    }

    if (courseContentNode.hasNode(nodeName))
    {
      return courseContentNode.getNode(nodeName);
    }
    else
    {
      return null;
    }
  }

  function getNodeById(id)
  {
    if(id == null || id == "")
    {
      return null;
    }

    return Repository.resolver.resolveById(id).getNode();
  }

  let count = 0;

  //print('Compteur; Libellé; Code Apogée; Description; Objectifs; Pré requis nécessaires; Contrôle des connaissances; syllabus; compétences visées; Informations complémentaires; Composantes; lieux; Campus; rôle1; contacts1; role2; contacts2; Label; Mots clés; Volume horaire; Effectif; Période de l année; Plage horaire; Méthode d enseignement; Organisation d enseignement; Forme d enseignement; Langues; Date de début des cours')
  var report = Report.create("My report", "This report just display the random data");
  report.addHeader("Compteur","Libellé","Code Apogée","Description","Objectifs","Pré requis nécessaires","Contrôle des connaissances","syllabus","compétences visées","Informations complémentaires","Composantes","lieux","Campus","rôle1","contacts1","role2","contacts2","Label","Mots clés","Volume horaire","Effectif","Période de l année","Plage horaire","Méthode d enseignement","Organisation d enseignement","Forme d enseignement","Langues","Date de début des cours");

  Repository.query('//element(*, ametys:courseContent)[ametys:catalog="ue-iibres-2023"]').forEach(function(courseContent) {
    count++;
    let courseContentNode = courseContent.getNode();

    //Haut de page
    let libellé= getPropertyString(courseContentNode, "ametys:title");
    //print("\n"+libellé);

    let codeApogee= getPropertyString(courseContentNode,"ametys:codeApogee");
    //print(codeApogee);


    //Onglet Presentation
    let description = getPropertyString(getNode(courseContentNode,"ametys:description"),"jcr:data");

    //print(description);
    let objectifs = getPropertyString(getNode(courseContentNode,"ametys:objectives"),"jcr:data");
    //print(objectifs);

    let prerequis = getPropertyString(getNode(courseContentNode,"ametys:neededPrerequisite"),"jcr:data");
    //print(prerequis);

    //Onglet +d'infos
    let controleConnaissance = getPropertyString(getNode(courseContentNode,"ametys:formOfAssessment"),"jcr:data");
    //print(controleConnaissance);

    let syllabus = getPropertyString(getNode(courseContentNode,"ametys:syllabus"),"jcr:data");
    //print(syllabus);

    let competencesVisées = getPropertyString(getNode(courseContentNode,"ametys:skills"),"jcr:data");
    //print(competencesVisées);

    let infosComplementaires = getPropertyString(getNode(courseContentNode,"ametys:additionalInformations"),"jcr:data");
    //print(infosComplementaires);

    //Onglet Contacts
    let composantesValues = getPropertyValues(courseContentNode,"ametys:orgUnit");
    let composantes=[];
    for (let i = 0; i < composantesValues.length; i++) {
      composantes.push(getPropertyString(getNodeById(composantesValues[i].getString()),"ametys:title"));
    }
    //print(composantes);

    let lieuxValues = getPropertyValues(courseContentNode,"ametys:teachingLocation");
    let lieux=[];
    for (let i = 0; i < lieuxValues.length; i++) {
      lieux.push(getPropertyString(getNode(getNodeById(lieuxValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(lieux);

    let campusValues = getPropertyValues(courseContentNode,"ametys:campus");
    let campus=[];
    for (let i = 0; i < campusValues.length; i++) {
      campus.push(getPropertyString(getNode(getNodeById(campusValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(campus);

    //contact et role
    let role1=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:role")),"ametys:title"),"ametys:fr");
    //print(role2);
    let contacts1Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:persons");
    let contacts1=[];
    for (let i = 0; i < contacts1Values.length; i++) {
      contacts1.push(getPropertyString(getNodeById(contacts1Values[i].getString()),"ametys:title"));
    }
    //print(contacts2);

    let role2=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:role")),"ametys:title"),"ametys:fr");
    //print(role2);
    let contacts2Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:persons");
    let contacts2=[];
    for (let i = 0; i < contacts2Values.length; i++) {
      contacts2.push(getPropertyString(getNodeById(contacts2Values[i].getString()),"ametys:title"));
    }
    //print(contacts2);

    //Onglet en bref
    let labelValues = getPropertyValues(courseContentNode,"ametys:labellisation");
    let label=[];
    for (let i = 0; i < labelValues.length; i++) {
      label.push(getPropertyString(getNode(getNodeById(labelValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(label);

    let motsClésValues= getPropertyValues(courseContentNode,"ametys:keywords");
    let motsClés=[];
    for (let i = 0; i < motsClésValues.length; i++) {
      motsClés.push(motsClésValues[i].getString());
    }
    //print(motsClés);

    let volumeHoraire = getPropertyString(courseContentNode,"ametys:nbHours");
    //print(volumeHoraire);

    let effectif = getPropertyString(courseContentNode,"ametys:maxNumberOfStudents");
    //print(effectif);

    let periodeAnnée = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingTerm")),"ametys:title"),"ametys:fr");
    //print(periodeAnnée);

    let plageHoraire= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:timeSlot")),"ametys:title"),"ametys:fr");
    //print(plageHoraire);

    let methodeEnseignement = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:formofteachingMethod")),"ametys:title"),"ametys:fr");
    //print(methodeEnseignement);

    let organisationEnseignementValues = getPropertyValues(courseContentNode,"ametys:formofteachingOrg");
    let organisationEnseignement=[];
    for (let i = 0; i < organisationEnseignementValues.length; i++) {
      organisationEnseignement.push(getPropertyString(getNode(getNodeById(organisationEnseignementValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(organisationEnseignement);

    let formeEnseignement= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingActivity")),"ametys:title"),"ametys:fr");
    //print(formeEnseignement);

    let languesValues = getPropertyValues(courseContentNode,"ametys:teachingLanguage");
    let langues=[];
    for (let i = 0; i < languesValues.length; i++) {
      langues.push(getPropertyString(getNode(getNodeById(languesValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(langues);

    let dateDebutCours = getPropertyString(courseContentNode,"ametys:startDate");
    //print(dateDebutCours);

    //print(`"${count}";"${libellé}";"${codeApogee}";"${description}";"${objectifs}";"${prerequis}";"${controleConnaissance}";"${syllabus}";"${competencesVisées}";"${infosComplementaires}";"${composantes}";"${lieux}";"${campus}";"${role1}";"${contacts1}";"${role2}";"${contacts2}";"${label}";"${motsClés}";"${volumeHoraire}";"${effectif}";"${periodeAnnée}";"${plageHoraire}";"${methodeEnseignement}";"${organisationEnseignement}";"${formeEnseignement}";"${langues}";"${dateDebutCours}"`);
    report.addRow(count,libellé,codeApogee,description,objectifs,prerequis,controleConnaissance,syllabus,competencesVisées,infosComplementaires,composantes,lieux,campus,role1,contacts1,role2,contacts2,label,motsClés,volumeHoraire,effectif,periodeAnnée,plageHoraire,methodeEnseignement,organisationEnseignement,formeEnseignement,langues,dateDebutCours);
  });

  //print(`${count} results(s)`);
  report.print();
  report.saveAsCSV();
  report.printLink()

Le soucis c'est que ça me fait un résultat assez bizarre en fonction des données vide ou multiple :-/
Si c'est vide il prends la colonne d'après, si c'est multiple il rempli plusieurs colonnes au lieu de tout mettre dans une seule colonne.
Et si j'utilise la version avec le fichier, je me retrouve à voir la balise xml des jcr-data dans le fichier.

Il faudra que je vois comment améliorer ça quand j'aurai un peu plus de temps (je dois pouvoir faire des implodes/explodes mais je ne sais pas si il n'y a pas de solution plus propre)

Offline

#5 23/03/2023 15:50:58

Mathieu
Guest
Registered: 26/09/2017
Posts: 42

Re: Extraction de données ODF

Bon je me suis pas mal pris la tête à voir comment je pourrais gérer l'affichage en fonction des différents type de données (pour rien en fait c'était tout con u_u)

A priori ça sera la dernière version du code :

  function getProperty(courseContentNode , propertyName , type)
  {
    if(courseContentNode == null && type=="values")
    {
      return [];
    }

    if(courseContentNode == null)
    {
      return null;
    }

    if(courseContentNode.hasProperty(propertyName))
    {
      if(type=="string")
      {
        return courseContentNode.getProperty(propertyName).getString();
      }
      else if (type=="values")
      {
        return courseContentNode.getProperty(propertyName).getValues();
      }
    }
    else {
      return null;
    }
  }

  function getPropertyString(courseContentNode , propertyName)
  {
    return getProperty(courseContentNode , propertyName , "string");
  }

  function getPropertyValues(courseContentNode , propertyName)
  {
    return getProperty(courseContentNode , propertyName , "values");
  }

  function getNode(courseContentNode , nodeName)
  {
    if(courseContentNode == null)
    {
      return null;
    }

    if (courseContentNode.hasNode(nodeName))
    {
      return courseContentNode.getNode(nodeName);
    }
    else
    {
      return null;
    }
  }

  function getNodeById(id)
  {
    if(id == null || id == "")
    {
      return null;
    }

    return Repository.resolver.resolveById(id).getNode();
  }

  let count = 0;

  //print('Compteur; Libellé; Code Apogée; Description; Objectifs; Pré requis nécessaires; Contrôle des connaissances; syllabus; compétences visées; Informations complémentaires; Composantes; lieux; Campus; rôle1; contacts1; role2; contacts2; Label; Mots clés; Volume horaire; Effectif; Période de l année; Plage horaire; Méthode d enseignement; Organisation d enseignement; Forme d enseignement; Langues; Date de début des cours ; discipline d enseignement ')
  var report = Report.create("Exctraction ODF");
  report.addHeader("Compteur","Libellé","Code Apogée","Description","Objectifs","Pré requis nécessaires","Contrôle des connaissances","syllabus","compétences visées","Informations complémentaires","Composantes","lieux","Campus","rôle1","contacts1","role2","contacts2","Label","Mots clés","Volume horaire","Effectif","Période de l année","Plage horaire","Méthode d enseignement","Organisation d enseignement","Forme d enseignement","Langues","Date de début des cours","discipline d enseignement");

  Repository.query('//element(*, ametys:courseContent)[ametys:catalog="ue-iibres-2023"]').forEach(function(courseContent) {
    count++;
    let courseContentNode = courseContent.getNode();
    //print(courseContent);
    
    //Haut de page
    let libellé= getPropertyString(courseContentNode, "ametys:title");
    //print("\n"+libellé);

    let codeApogee= getPropertyString(courseContentNode,"ametys:codeApogee");
    //print(codeApogee);


    //Onglet Presentation
    let description = getPropertyString(getNode(courseContentNode,"ametys:description"),"jcr:data");

    //print(description);
    let objectifs = getPropertyString(getNode(courseContentNode,"ametys:objectives"),"jcr:data");
    //print(objectifs);

    let prerequis = getPropertyString(getNode(courseContentNode,"ametys:neededPrerequisite"),"jcr:data");
    //print(prerequis);

    //Onglet +d'infos
    let controleConnaissance = getPropertyString(getNode(courseContentNode,"ametys:formOfAssessment"),"jcr:data");
    //print(controleConnaissance);

    let syllabus = getPropertyString(getNode(courseContentNode,"ametys:syllabus"),"jcr:data");
    //print(syllabus);

    let competencesVisées = getPropertyString(getNode(courseContentNode,"ametys:skills"),"jcr:data");
    //print(competencesVisées);

    let infosComplementaires = getPropertyString(getNode(courseContentNode,"ametys:additionalInformations"),"jcr:data");
    //print(infosComplementaires);

    //Onglet Contacts
    let composantesValues = getPropertyValues(courseContentNode,"ametys:orgUnit");
    let composantes=[];
    for (let i = 0; i < composantesValues.length; i++) {
      composantes.push(getPropertyString(getNodeById(composantesValues[i].getString()),"ametys:title"));
    }
    //print(composantes);

    let lieuxValues = getPropertyValues(courseContentNode,"ametys:teachingLocation");
    let lieux=[];
    for (let i = 0; i < lieuxValues.length; i++) {
      lieux.push(getPropertyString(getNode(getNodeById(lieuxValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(lieux);

    let campusValues = getPropertyValues(courseContentNode,"ametys:campus");
    let campus=[];
    for (let i = 0; i < campusValues.length; i++) {
      campus.push(getPropertyString(getNode(getNodeById(campusValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(campus);

    //contact et role
    let role1=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:role")),"ametys:title"),"ametys:fr");
    //print(role2);
    let contacts1Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:1"),"ametys:persons");
    let contacts1=[];
    for (let i = 0; i < contacts1Values.length; i++) {
      contacts1.push(getPropertyString(getNodeById(contacts1Values[i].getString()),"ametys:title"));
    }
    //print(contacts2);

    let role2=getPropertyString(getNode(getNodeById(getPropertyString(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:role")),"ametys:title"),"ametys:fr");
    //print(role2);
    let contacts2Values = getPropertyValues(getNode(getNode(courseContentNode,"ametys:contacts"),"ametys:2"),"ametys:persons");
    let contacts2=[];
    for (let i = 0; i < contacts2Values.length; i++) {
      contacts2.push(getPropertyString(getNodeById(contacts2Values[i].getString()),"ametys:title"));
    }
    //print(contacts2);

    //Onglet en bref
    let labelValues = getPropertyValues(courseContentNode,"ametys:labellisation");
    let label=[];
    for (let i = 0; i < labelValues.length; i++) {
      label.push(getPropertyString(getNode(getNodeById(labelValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(label);

    let motsClésValues= getPropertyValues(courseContentNode,"ametys:keywords");
    let motsClés=[];
    for (let i = 0; i < motsClésValues.length; i++) {
      motsClés.push(motsClésValues[i].getString());
    }
    //print(motsClés);

    let volumeHoraire = getPropertyString(courseContentNode,"ametys:nbHours");
    //print(volumeHoraire);

    let effectif = getPropertyString(courseContentNode,"ametys:maxNumberOfStudents");
    //print(effectif);

    let periodeAnnée = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingTerm")),"ametys:title"),"ametys:fr");
    //print(periodeAnnée);

    let plageHoraire= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:timeSlot")),"ametys:title"),"ametys:fr");
    //print(plageHoraire);

    let methodeEnseignement = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:formofteachingMethod")),"ametys:title"),"ametys:fr");
    //print(methodeEnseignement);

    let organisationEnseignementValues = getPropertyValues(courseContentNode,"ametys:formofteachingOrg");
    let organisationEnseignement=[];
    for (let i = 0; i < organisationEnseignementValues.length; i++) {
      organisationEnseignement.push(getPropertyString(getNode(getNodeById(organisationEnseignementValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(organisationEnseignement);

    let formeEnseignement= getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:teachingActivity")),"ametys:title"),"ametys:fr");
    //print(formeEnseignement);

    let languesValues = getPropertyValues(courseContentNode,"ametys:teachingLanguage");
    let langues=[];
    for (let i = 0; i < languesValues.length; i++) {
      langues.push(getPropertyString(getNode(getNodeById(languesValues[i].getString()),"ametys:title"),"ametys:fr"));
    }
    //print(langues);

    let dateDebutCours = getPropertyString(courseContentNode,"ametys:startDate");
    dateDebutCours = dateDebutCours.substring(0, 10);
    //print(dateDebutCours);

    //Onglet Pilotage
    let disciplineEnseignement = getPropertyString(getNode(getNodeById(getPropertyString(courseContentNode,"ametys:disciplineEnseignement")),"ametys:title"),"ametys:fr");
    //print(disciplineEnseignement);
    
    //print(`"${count}";"${libellé}";"${codeApogee}";"${description}";"${objectifs}";"${prerequis}";"${controleConnaissance}";"${syllabus}";"${competencesVisées}";"${infosComplementaires}";"${composantes}";"${lieux}";"${campus}";"${role1}";"${contacts1}";"${role2}";"${contacts2}";"${label}";"${motsClés}";"${volumeHoraire}";"${effectif}";"${periodeAnnée}";"${plageHoraire}";"${methodeEnseignement}";"${organisationEnseignement}";"${formeEnseignement}";"${langues}";"${dateDebutCours}";"${disciplineEnseignement}"`);
    //report.addRow(count,libellé,codeApogee,description,objectifs,prerequis,controleConnaissance,syllabus,competencesVisées,infosComplementaires,composantes,lieux,campus,role1,contacts1,role2,contacts2,label,motsClés,volumeHoraire,effectif,periodeAnnée,plageHoraire,methodeEnseignement,organisationEnseignement,formeEnseignement,langues,dateDebutCours);
    report.addRow(`${count}`,`${libellé}`,`${codeApogee}`,`${description}`,`${objectifs}`,`${prerequis}`,`${controleConnaissance}`,`${syllabus}`,`${competencesVisées}`,`${infosComplementaires}`,`${composantes}`,`${lieux}`,`${campus}`,`${role1}`,`${contacts1}`,`${role2}`,`${contacts2}`,`${label}`,`${motsClés}`,`${volumeHoraire}`,`${effectif}`,`${periodeAnnée}`,`${plageHoraire}`,`${methodeEnseignement}`,`${organisationEnseignement}`,`${formeEnseignement}`,`${langues}`,`${dateDebutCours}`,`${disciplineEnseignement}`);
  });

  //print(`${count} results(s)`);
  //report.print();
  //report.saveAsCSV();
  //report.saveAsXLS();
  //report.saveAsHTML();
  //report.printLink()
  
  // Get the mail of the currently connected user
  var useridentityConnected = Ametys.serviceManager.lookup(org.ametys.core.user.CurrentUserProvider.ROLE).getUser();
  var userConnected = Ametys.serviceManager.lookup(org.ametys.core.user.UserManager.ROLE).getUser(useridentityConnected);
  var mail = userConnected.getEmail();
  
  let fileXLS = report.saveAsXLS();
  //let fileCSV = report.saveAsCSV();
  //let fileHTML = report.saveAsHTML();
  let date = new Date();
  let YYYYMMDD = date.getFullYear()+"/"+date.getMonth()+"/"+date.getDate();

  //print(date.getDate());
  //print(date.getMonth());
  //print(date.getFullYear());
  //print(file);
  
  Ametys.mail({
    "subject" : "Extraction ODF "+YYYYMMDD,
    "htmlBody" : "Rapport de l'extraction ODF en pièce jointe",
    "toRecipients" : mail,
    "attachments" : fileXLS
    //"attachments" : [fileXLS, fileCSV, fileHTML]
  })

Du coup j'ai une question sur ce passage la (mais je me dit que c'est peut etre pas encore dispo en 4.4.9):

une fois qu'on a fait ce script, on peut l'enregistrer dans le répertoire de requête

Où est ce que je peux trouver ce repertoire ?
Pour le moment j'ai vu qu'à partir du plannificateur de taches je peux faire une nouvelle tache de type "Executer un script" mais je dois y coller mon code dedans, je n'ai pas l'air de pouvoir selectionner des scripts existants (après c'est peut etre une option qui n'apparait qu'une fois que l'on a des scripts sauvegardés existants)

Edit : Petit question de plus :  est ce qu'il y a possibilité de deleguer ça à un utilisateur pour qu'il lance le script (pour lui même) ?

Last edited by Mathieu (23/03/2023 15:54:50)

Offline

Board footer

Powered by FluxBB