Changeset 76460 in spip-zone


Ignore:
Timestamp:
Sep 24, 2013, 11:19:01 AM (6 years ago)
Author:
amaury.adon@…
Message:

Ajout de la récupération automatique des nouveaux événements et des modifications d'événements (j'ai enfin réussi, enfin, je crois).
Une action pour forcer la synchro
Des modifications dans les chaines de langue
Un incrément de version

C'est presque fini, reste un peu de polish et les habituelles corrections.

Location:
_plugins_/import_ics
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/import_ics/action/synchro_almanach.php

    r74743 r76460  
    1313if (!defined("_ECRIRE_INC_VERSION")) return;
    1414
    15 // honteusement pompé sur http://doc.spip.org/@action_editer_site_dist
    16 function action_synchro_almanach_dist($id_almanach=null) {
     15include_spip('lib/iCalcreator.class'); /*pour la librairie icalcreator incluse dans le plugin icalendar*/
    1716
    18         if (is_null($id_almanach)){
    19                 $securiser_action = charger_fonction('securiser_action', 'inc');
    20                 $id_alamanach = $securiser_action();
     17function action_synchro_almanach_dist() {
     18
     19//vérification de l'auteur en cours//
     20$securiser_action = charger_fonction('securiser_action', 'inc');
     21$arg = $securiser_action();
     22
     23        if (!preg_match(",^(\d+)$,", $arg, $r)) {
     24                 spip_log("action_synchro_almanach_dist $arg pas compris");
     25                 return;
    2126        }
    2227
    23 
    24         $id_job = job_queue_add('synchro_a_jour','synchro_a_jour',array($id_synchro),'genie/synchro',true);
    25         // l'executer immediatement si possible
    26         if ($id_job) {
    27                 include_spip('inc/queue');
    28                 queue_schedule(array($id_job));
    29         }
    30         else {
    31                 spip_log("Erreur insertion synchro_a_jour($id_synchro) dans la file des travaux",_LOG_ERREUR);
    32         }
     28        $id_almanach = $r[1];
    3329
    3430}
  • _plugins_/import_ics/genie/import_ics_synchro.php

    r74743 r76460  
    11<?php
    22
     3/**
     4 * Gestion du génie import_ics_synchro
     5 *
     6 * @plugin import_ics pour SPIP
     7 * @license GPL
     8 *
     9 */
    310
    411if (!defined('_ECRIRE_INC_VERSION')) return;
    512
    6 ## complètement pompé de plugins/sites/genie/syndic.php
    7 ## valeurs modifiables dans mes_options
    8 ## attention il est tres mal vu de prendre une periode < 20 minutes
    9 if (!defined('_PERIODE_SYNCHRONISATION'))
    10         define('_PERIODE_SYNCHRONISATION', 24*60);
    11 if (!defined('_PERIODE_SYNCHRONISATION_SUSPENDUE'))
    12         define('_PERIODE_SYNCHRONISATION_SUSPENDUE', 48*60);
     13/**
     14 * Actualise tous les almanachs
     15 *
     16 * @genie import_ics_synchro
     17 *
     18 * @param int $last
     19 *     Timestamp de la dernière exécution de cette tâche
     20 * @return int
     21 *     Positif : la tâche a été effectuée
     22 */
     23function genie_import_ics_synchro_dist($t){
    1324
    14 genie_synchro_dist($t){
    15         return executer_une_synchronisation();
     25//on recupère toutes les infos sur les almanachs
     26if(
     27        $resultats = sql_allfetsel('*', 'spip_almanachs')
     28        and is_array($resultats)
     29)
     30{
     31//librairie icalcreator incluse dans le plugin icalendar
     32include_spip('lib/iCalcreator.class');
     33
     34//pour chacun des almanachs, on va traiter les différences
     35foreach ($resultats as $r) {
     36                //      on va faire une sélection des evenemnts associés à l'almanach en cours
     37                //donc jointure sur les table spip_evenemnts et spip_almanachs_liens
     38                $evenements_lies = sql_allfetsel('E.uid, E.id_evenement, E.sequence',
     39                        'spip_evenements AS E
     40                        INNER JOIN spip_almanachs_liens AS L
     41                        ON E.id_evenement = L.id_objet AND L.id_almanach='.intval($r['id_almanach']));
     42
     43                //tableau des uid associés à cet almanach tiré du tableau précédent
     44                        $uid ="";
     45                        foreach ($evenements_lies as $u ) {
     46                                $uid[] = $u['uid'];
     47                        };
     48
     49                //configuration nécessaire à la récupération et parsing du calendrier distant
     50
     51                        $config = array("unique_id" => "distant",
     52                                                        "url" => $r['url']);
     53                        $v = new vcalendar($config);
     54                        $v->parse();
     55
     56                        echo "almanach".$r["id_almanach"]."</br>";
     57                        while ($comp = $v->getComponent())
     58                        {
     59                //les variables qui vont servir à vérifier l'existence et l'unicité
     60                                $sequence_distante = $comp->getProperty( "SEQUENCE" );#sequence d l'evenement http://kigkonsult.se/iCalcreator/docs/using.html#SEQUENCE
     61                                $uid_distante = $comp->getProperty("UID");#uid de l'evenement;
     62                                //au cas où le flux ics ne fournirait pas le champ sequence, on initialise la valeur à 0 comme lors d'un import
     63                                if (!is_int($sequence_distante)){$sequence_distante="0";}
     64                                //On commence à vérifier l'existence et l'unicité  maintenant et on met à jour
     65                                //ou on importe selon le cas
     66                                if (in_array($uid_distante, $uid)){//si l'uid_distante est présente dans la bdd
     67                                        // on utilise le fait que les deux tableaux ont le même index pour le récupérer
     68                                        $cle = array_search($uid_distante, $uid);
     69                                        //sequence presente dans la base ayant le meme index
     70                                        $sequence = $evenements_lies[$cle]['sequence'];
     71                                        if ($sequence < $sequence_distante) {
     72                                                importation_evenement($comp,$r);
     73                                        }
     74                                } else {importation_evenement($comp,$r);}
     75                        }
     76                }
     77}
     78
     79return 1;
     80
    1681}
    1782
    1883
    19 function executer_une_synchronisation() {
    20         $id_synchro = '';
    21         // inserer la tache dans la file, avec controle d'unicite
    22         job_queue_add('synchro_a_jour','synchro_a_jour',array($id_synchro),'genie/syndic',true);
     84/**
     85* Importation d'un événement dans la base
     86**/
     87function importation_evenement($objet_evenement,$tableau_almanach){
     88        #on recupere les infos de l'evenement dans des variables
     89            $attendee = $objet_evenement->getProperty( "attendee" ); #nom de l'attendee
     90            $lieu = $objet_evenement->getProperty("location");#récupération du lieu
     91            $summary_array = $objet_evenement->getProperty("summary", 1, TRUE); #summary est un array on recupere la valeur dans l'insertion attention, summary c'est pour le titre !
     92                $url = $objet_evenement->getProperty( "URL");#on récupère l'url de l'événement pour la mettre dans les notes histoire de pouvoir relier à l'événement original
     93            $descriptif_array = $objet_evenement->getProperty("DESCRIPTION", 1,TRUE);
     94            $organizer = $objet_evenement->getProperty("ORGANIZER");#organisateur de l'evenement
     95        #données de localisation de l'évenement
     96            $localisation = $objet_evenement->getProperty( "GEO" );#c'est un array array( "latitude"  => <latitude>, "longitude" => <longitude>))
     97            $latitude = $localisation['latitude'];
     98            $longitude = $localisation['longitude'];
     99        //un petit coup avec l'uid
     100            $uid_distante = $objet_evenement->getProperty("UID");#uid de l'evenement
     101        #les 3 lignes suivantes servent à récupérer la date de début et à la mettre dans le bon format
     102            $dtstart_array = $objet_evenement->getProperty("dtstart", 1, TRUE);
     103                $dtstart = $dtstart_array["value"];
     104                        $startDate = "{$dtstart["year"]}-{$dtstart["month"]}-{$dtstart["day"]}";
     105                        $startTime = '';#on initialise le temps de début
     106                if (!in_array("DATE", $dtstart_array["params"])) {
     107                         $startTime = " {$dtstart["hour"]}:{$dtstart["min"]}:{$dtstart["sec"]}";
     108                        }
     109                #on fait une variable qui contient le résultat des deux précédentes actions
     110                $date_debut = $startDate.$startTime;
     111        #les 3 lignes suivantes servent à récupérer la date de fin et à la mettre dans le bon format
     112                $dtend_array = $objet_evenement->getProperty("dtend", 1, TRUE);
     113                        $dtend = $dtend_array["value"];
     114                $endDate = "{$dtend["year"]}-{$dtend["month"]}-{$dtend["day"]}";
     115                $endTime = '';#on initialise le temps de fin
     116                if (!in_array("DATE", $dtend_array["params"])) {
     117                        $endTime = " {$dtend["hour"]}:{$dtend["min"]}:{$dtend["sec"]}";
     118                        }
     119                #on fait une variable qui contient le résultat des deux précédentes actions
     120                $date_fin = $endDate.$endTime;
     121        #on insere les infos des événements dans la base
     122        //les infos de l'almanach
     123        $id_mot = $tableau_almanach['id_mot'];
     124        $id_article = $tableau_almanach['id_article'];
     125        $id_almanach = $tableau_almanach['id_almanach'];
     126
     127        //insertion de l'evenement en bdd
     128        $id_evenement= sql_insertq('spip_evenements',array('id_article' =>$id_article,'date_debut'=>$date_debut,'date_fin'=>$date_fin,'titre'=>str_replace('SUMMARY:', '', $summary_array["value"]),'descriptif'=>'<math>'.$descriptif_array["value"].'</math>','lieu'=>$lieu,'adresse'=>'','inscription'=>'0','places'=>'0','horaire'=>'oui','statut'=>'publie','attendee'=>str_replace('MAILTO:', '', $attendee),'id_evenement_source'=>'0','uid'=>$uid_distante,'sequence'=>$sequence_distante,'notes'=>$url));
     129        //on associe l'événement à l'almanach
     130        sql_insertq("spip_almanachs_liens",array('id_almanach'=>$id_almanach,'id_objet'=>$id_evenement,'objet'=>'evenement','vu'=>'oui'));
     131        //on associe l'événement à son mot
     132        sql_insertq("spip_mots_liens",array('id_mot'=>$id_mot,'id_objet'=>$id_evenement,'objet'=>'evenement'));
    23133}
    24134
    25 function synchro_a_jour(){
    26 
    27 
    28 }
    29 
    30 function inserer_dans_la_base(){}
    31 
    32 
    33 // récupérer url fichier distant
    34 // parser le fichier distant
    35 
    36 // pour chaque événement du fichier distant
    37 //      récupération uid_distant
    38 
    39 //              pour chaque enregistrement déjà présent dans la base
    40 //              si uid_distant = uid_local alors
    41 //                      récupérer sequence_distant
    42 //                      si sequence_distant != sequence_local alors
    43 //                              supprimer l événement local et le remplacer par l événement distant
    44 //              sinon insérer l événement distant dans la base
    45 
    46 
    47 
    48135?>
  • _plugins_/import_ics/import_ics_pipelines.php

    r74678 r76460  
    2828
    2929function import_ics_taches_generales_cron($taches_generales){
    30         $taches_generales['import_ics_synchro'] = 3600*24;
     30        $taches_generales['import_ics_synchro'] = 3600*24;/*mettre à jour toutes les 24 heures parait bien*/
    3131        return $taches_generales;
    3232}
  • _plugins_/import_ics/lang/almanach_fr.php

    r74743 r76460  
    1212',
    1313        //C
    14         'confirmation_suppression_evenements' => 'Êtes vous certain(e) de vouloir supprimer ces événements ?',
    15 
     14        'confirmation_suppression_evenements' => 'Êtes vous certain(e) de vouloir supprimer les événements de l\'almanach \"@titre_almanach@\" ?',
     15        'confirmation_mise_a_jour_evenements' => 'Voulez-vous réellement mettre à jour la liste des événements de l\'almanach \"@titre_almanach@\" ?\nCela peut prendre un certain temps.',
    1616        // E
    1717        'explication_id_article' => 'Choisissez un article qui va recevoir les événements importés.',
  • _plugins_/import_ics/paquet.xml

    r74678 r76460  
    22        prefix="import_ics"
    33        categorie="date"
    4         version="1.0.0"
     4        version="1.1.0"
    55        etat="dev"
    66        compatibilite="[3.0.7;3.0.*]"
  • _plugins_/import_ics/prive/objets/contenu/almanach.html

    r74743 r76460  
    7272
    7373        <div class='synchro_almanach'>
    74                 [(#BOUTON_ACTION{<:almanach:lien_synchro_almanach:>,#URL_ACTION_AUTEUR{synchro_almanach,#ID_ALMANACH,#SELF},ajax})]
     74                [(#BOUTON_ACTION{<:almanach:lien_synchro_almanach:>,#URL_ACTION_AUTEUR{synchro_almanach,#ID_ALMANACH,#SELF},ajax,<:almanach:confirmation_mise_a_jour_evenements{titre_almanach=#TITRE}:>,})]
    7575        </div>
    7676
     
    8181        <div class='purge'><:almanach:purger_almanach:></div>
    8282        [(#AUTORISER{supprimer, almanach, #ID_ALMANACH}|oui)
    83                 [(#BOUTON_ACTION{<:almanach:info_supprimer_evenements:>,#URL_ACTION_AUTEUR{supprimer_evenements_almanach,#ID_ALMANACH,#SELF},ajax,<:almanach:confirmation_suppression_evenements:>,'','(function(me){$(me).parents("tr").animateRemove();return true;})(this)'})]
     83                [(#BOUTON_ACTION{<:almanach:info_supprimer_evenements:>,#URL_ACTION_AUTEUR{supprimer_evenements_almanach,#ID_ALMANACH,#SELF},ajax,<:almanach:confirmation_suppression_evenements{titre_almanach=#TITRE}:>,'','(function(me){$(me).parents("tr").animateRemove();return true;})(this)'})]
    8484        ]       
    8585        </B_nb_evenement>
Note: See TracChangeset for help on using the changeset viewer.