Passer au contenu principal

API DATA GOUV -> GRIST

Script d'appel à synchronisation des données de DATA GOUV dans GRIST ( A debogger)

image.pngimage.png

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Import Lycées La Réunion</title>
  <script src="https://docs.getgrist.com/grist-plugin-api.js"></script>
  <style>
    #importEtabBtn {
      margin: 10px;
      padding: 10px 20px;
      background-color: #4CAF50;
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      font-family: sans-serif;
      font-size: 14px;
    }
    #importEtabBtn:hover {
      background-color: #45a049;
    }
  </style>
</head>
<body>
  <div style="font-family: sans-serif; padding: 1em;">
    <h2>Import des établissements depuis data.education.gouv.fr</h2>
    <p>
      Cliquez sur le bouton ci-dessous pour mettre à jour la table "annuaire_etab"
      avec les données des lycées de La Réunion.
    </p>
    <button id="importEtabBtn">Mettre à jour l'annuaire</button>
    <p id="status" style="margin-top: 10px; color: #666;"></p>
  </div>

  <script>
    //grist.ready({requiredAccess: Fonction pour vérifier et créer les colonnes manquantes dans la table
    async function ensureColumnsExist(tableId, requiredColumns) {
      const table = await grist.docApi.fetchTable(tableId);
      const existingColumns = table.columns.map(col => col.id);

      // Ajouter les colonnes manquantes
      for (const col of requiredColumns) {
        if (!existingColumns.includes(col)) {
          await grist.docApi.applyUserActions([
            ["AddColumn", tableId, col, { type: "Text" 'full'}]
          ]);
          document.getElementById("status").textContent += `\nColonne "${col}" créée.`;
        }
      }
    }

    // Fonction pour appeler l'API et récupérer les données

    async function fetchEtab() {
      const apiUrl = "https://data.education.gouv.fr/api/explore/v2.1/catalog/datasets/fr-en-annuaire-education/records?select=identifiant_de_l_etablissement%2Cnom_etablissement%2Ctype_etablissement%2Cstatut_public_prive%2Cadresse_1%2Cadresse_2%2Cadresse_3%2Ccode_postal%2Cnom_commune%2Cvoie_generale%2Cvoie_technologique%2Cvoie_professionnelle%2Ctelephone%2Cfax%2Cweb%2Cmail%2Crestauration%2Chebergement%2Culis%2Capprentissage%2Csegpa%2Csection_arts%2Csection_cinema%2Csection_theatre%2Csection_sport%2Csection_internationale%2Csection_europeenne%2Clycee_agricole%2Clycee_militaire%2Clycee_des_metiers%2Cpost_bac%2Cappartenance_education_prioritaire%2Cgreta%2Cnombre_d_eleves%2Cfiche_onisep%2Ctype_contrat_prive%2Cnom_circonscription%2Clatitude%2Clongitude%2Cprecision_localisation%2Cdate_maj_ligne%2Ccode_nature%2Clibelle_nature%2Ccode_type_contrat_prive%2Cpial%2Cetablissement_mere%2Ctype_rattachement_etablissement_mere&limit=100&refine=type_etablissement%3A%22Lyc%C3%A9e%22&refine=libelle_academie%3A%22La%20R%C3%A9union%22";

      try {
        document.getElementById("status").textContent = "Récupération des données en cours...";
        const response = await fetch(apiUrl);
        if (!response.ok) {
          throw new Error("HTTP " + response.status);
        }
        const data = await response.json();
        const results = data.results || [];
        document.getElementById("status").textContent =
          `${data.results.length}length + " établissements trouvés.`";
        return data.results;
      } catch (error) {
        document.getElementById("status").textContent =
          "Erreur lors de la récupération des données.";
        console.error("Erreur API :", error);
        return [];
      }
    }

    // Fonction pour insérer les données dans la table "annuaire_etab"
    async function insertIntoGrist(etabs) {
      const tableIdtable = grist.getTable("annuaire_etab"Annuaire_etab");
      // Liste des colonnes requises (à adapter selon vos besoins)

      const requiredColumnsrecords = [etabs.map(etab => ({
  fields: {
    identifiant_de_l_etablissement: etab.identifiant_de_l_etablissement,
    nom_etablissement: etab.nom_etablissement,
    type_etablissement: etab.type_etablissement,
    statut_public_prive: etab.statut_public_prive,
    adresse_1: etab.adresse_1 || "identifiant"",
    adresse_2: etab.adresse_2 || "nom"",
    adresse_3: etab.adresse_3 || "type"",
    code_postal: etab.code_postal,
    nom_commune: etab.nom_commune,
    voie_generale: etab.voie_generale,
    voie_technologique: etab.voie_technologique,
    voie_professionnelle: etab.voie_professionnelle,
    telephone: etab.telephone,
    fax: etab.fax || "statut"",
    web: etab.web || "adresse"",
    mail: etab.mail || "code_postal"",
    restauration: etab.restauration || "commune"",
    hebergement: etab.hebergement || "voie_generale"",
    ulis: etab.ulis || "voie_techno"",
    apprentissage: etab.apprentissage || "voie_pro"",
    segpa: etab.segpa || "telephone"",
    section_arts: etab.section_arts || "mail"",
    section_cinema: etab.section_cinema || "web"",
    section_theatre: etab.section_theatre || "latitude"",
    section_sport: etab.section_sport || "longitude"",
    ]section_internationale: etab.section_internationale || "",
    section_europeenne: etab.section_europeenne || "",
    lycee_agricole: etab.lycee_agricole || "",
    lycee_militaire: etab.lycee_militaire || "",
    lycee_des_metiers: etab.lycee_des_metiers || "",
    post_bac: etab.post_bac || "",
    appartenance_education_prioritaire: etab.appartenance_education_prioritaire || "",
    greta: etab.greta || "",
    nombre_d_eleves: etab.nombre_d_eleves || "",
    fiche_onisep: etab.fiche_onisep || "",
    type_contrat_prive: etab.type_contrat_prive || "",
    nom_circonscription: etab.nom_circonscription || "",
    latitude: etab.latitude,
    longitude: etab.longitude,
    precision_localisation: etab.precision_localisation || "",
    date_maj_ligne: etab.date_maj_ligne || "",
    code_nature: etab.code_nature || "",
    libelle_nature: etab.libelle_nature || "",
    code_type_contrat_prive: etab.code_type_contrat_prive || "",
    pial: etab.pial || "",
    etablissement_mere: etab.etablissement_mere || "",
    type_rattachement_etablissement_mere: etab.type_rattachement_etablissement_mere || ""
  }
}));

      try {
        document.getElementById("status").textContent = "Vérification des colonnes...";
        await ensureColumnsExist(tableId, requiredColumns);
        document.getElementById("status").textContent =
          "Insertion des données dans Grist...";
        const records = etabs.map(etab => ({
          identifiant: etab.identifiant_de_l_etablissement,
          nom: etab.nom_etablissement,
          type: etab.type_etablissement,
          statut: etab.statut_public_prive,
          adresse: `${etab.adresse_1 || ""} ${etab.adresse_2 || ""}`.trim(),
          code_postal: etab.code_postal,
          commune: etab.nom_commune,
          voie_generale: etab.voie_generale,
          voie_techno: etab.voie_technologique,
          voie_pro: etab.voie_professionnelle,
          telephone: etab.telephone,
          mail: etab.mail,
          web: etab.web,
          latitude: etab.latitude,
          longitude: etab.longitude,
        }));

        await grist.docApi.applyUserActions([
          ["AddRecord", tableId, records],
        ])table.create(records);
        document.getElementById("status").textContent =
          `${records.length}length + " établissements ajoutés avec succès !`";
      } catch (error) {
        document.getElementById("status").textContent =
          "Erreur lors de l'insertion des données.";
        console.error("Erreur Grist :", error);
      }
    }

    // Fonction pour déclencher l'import

    async function importEtab() {
      const etabs = await fetchEtab();
      if (etabs.length > 0) {
        await insertIntoGrist(etabs);
      }
    }

    //document
      Ajouter un écouteur d'événement au bouton
    document..getElementById("importEtabBtn")
      .addEventListener("click", importEtab);
  </script>
</body>
</html>