Activité 4 : Prise en main des formats de représentation des événements (2h)

Le format ics

Le format .ics désigne la structure servant à décrire les informations/événements d’un calendrier. Ce format est compatible avec le standard iCalendar et permet une représentation textuelle des événements, souvent stockée dans un fichier d’extension .ics. Il utilise un ensemble d”identificateurs textuels pour décrire différentes propriétés d’un événement (date, heure, lieu, …).

Format ics d’un événement

Prenons l’exemple du TP suivant exporté d’ADE :

_images/un_evenement_ADE.png

Identificateurs principaux

Sa représentation au format .ics est :

Exemple d’événement ics
BEGIN:VEVENT
UID:ADE6050726f6a6574535453323032312d323032322d31373030382d302d31
SUMMARY:R104-TP-Eln
CATEGORIES:S1G1
DESCRIPTION:FAYOLLE GERARD,KASPER KEVIN
LOCATION:IUT1_126
DTSTART:20211126T080000Z
DTEND:20211126T120000Z
DTSTAMP:20211016T000000Z
TRANSP:OPAQUE
END:VEVENT

dans laquelle les identificateurs textuels s’interprètent comme suit :

  • BEGIN et END marquent le début et la fin de la description d’un événement de type (ici) VEVENT et forme un noeud d’informations

  • UID déclare la valeur d’un identifiant unique associé à cet événement (ici) ADE6050726f6a6574535453323032312d323032322d31373030382d302d31 ; deux événements différents ne pourront donc jamais avoir le même identifiant.

  • SUMMARY déclare l”intitulé de l’événement (ici) R104-TP-Eln

  • CATEGORIES est utilisé pour indiquer les groupes de TD pour lesquels l’événement a lieu (ici) S1G1

  • DESCRIPTION donne les enseignants qui interviennent sur l’événement (ici) Gérard FAYOLLE et Kévin KASPER

  • LOCATION précise la ou les salles dans lesquelles se tiennent l’événement (ici) en IUT1_126

  • DTSTART et DTEND précisent la date de début et la date de fin de l’événement (DTSTAMP est la date de création d’un message en lien avec l’événement et ne sera pas utilisé ici), dans un format vu pendant l”activité 3

  • TRANSP ne sera pas utilisé dans ce projet

Note

  • Le caractère ":" sépare systématiquement l’identificateur de la description de la propriété.

  • Les propriétés peuvent être optionnelles, auquel cas l’identificateur n’apparaît pas dans la description .ics.

  • Les propriétés ne sont pas ordonnées (l’ordre de déclaration peut changer d’un évènement à un autre).

Format ics d’un calendrier

Un calendrier au format .ics liste les événements qui le composent, les uns après les autres (de leur identificateur BEGIN à leur identicateur END) en :

  • les encapsulant dans un noeud de type VCALENDAR

  • décrivant des propriétés du calendrier grâce à des identificateurs textuels spécifiques

Prenons l’exemple du calendrier (extrait du calendrier des UFA) :

Exemple de calendrier ics
BEGIN:VCALENDAR
PRODID:ics.py - http://git.io/lLljaA
VERSION:2.0
BEGIN:VEVENT
DTSTAMP:20211029T000000Z
DTSTART:20220405T090000Z
DTEND:20220405T113000Z
SUMMARY:M4206-DS-PartTP-Android
DESCRIPTION:DELNONDEDIEU YVES,GOEURIOT LORRAINE
LOCATION:IUT1_T33 res1,IUT1_T32 res2
TRANSP:OPAQUE
UID:ADE6050726f6a6574535453323032312d323032322d353337372d302d30
CATEGORIES:S4UFA
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20211029T000000Z
DTSTART:20210906T090000Z
DTEND:20210906T100000Z
SUMMARY:Réunion de rentrée UFA
DESCRIPTION:CHOLLET REMY,VEDEL FRANCK
LOCATION:IUT1_121_GE
TRANSP:OPAQUE
UID:ADE6050726f6a6574535453323032312d323032322d34313931332d302d30
CATEGORIES:S3UFA
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20211029T000000Z
DTSTART:20220506T080000Z
DTEND:20220506T100000Z
SUMMARY:M4201-TD-Anglais
DESCRIPTION:NICOLL NICOLA,ROYER SANDRA
LOCATION:IUT1_C007,IUT1_C011
TRANSP:OPAQUE
UID:ADE6050726f6a6574535453323032312d323032322d32333037302d302d30
CATEGORIES:S4UFA
END:VEVENT
END:VCALENDAR

dans lequel les identificateurs textuels s’interprètent comme suit :

  • Le BEGIN initial (ligne 1) et le END final (dernière ligne) marquent le début et la fin de la description du calendrier de type (ici) VCALENDAR

  • VERSION et PRODID donnent des informations sur le mode de production du calendrier .ics

  • sont ensuite décrits 3 événements intitulés 4206-PartTP-Android, Réunion de rentrée UFA et 4201-Anglais

Note

  • La description d’un événement ne peut pas être commencée (BEGIN) avant que celle du précédent soit terminée (END).

  • Il n’y a jamais de ligne vide.

Remarques

Les données .ics sur lesquelles vous allez travailler ont été pré-traitées par les enseignants pour les simplifier et se libérer de certaines contraintes de la norme, qui à titre d’information stipulent que :

  • Dans la norme, les lignes ont une longueur maximale de 75 caractères par ligne. Elles peuvent commencer par un espace pour former la suite de la propriété commencée à la ligne précédente. Avec le pré-traitement, les lignes pourront faire plus de 75 caractères ; elles débuteront systématiquement par un identificateur et donneront la propriété en entier.

  • Dans la norme, les retours à la ligne sont ceux du système Windows. Ils utilisent la combinaison de caractères spéciaux "\r\n" (Cariage Return + Line Feed). Avec le pré-traitement, les retours à la ligne utilisent un simple '\n'.

Avertissement

La première étape de votre projet a pour objectif d’extraire les données des calendriers au format .ics fournis et de les transformer en un format plus compact et plus exploitable décrit ci-après. Il s’agit d’une étape dite de parsing ou d’une action de parser (anglicismes couramment répandus).

Format pseudo-csv

Le format dit pseudo-csv n’est pas un format normalisé ; c’est un choix de représentation, fait par les enseignants au moment de l’élaboration du cahier des charges, pour représenter le calendrier et ses événements de manière plus compacte.

Format d’un événement pseudo-csv

Un événement au format pseudo-csv est décrit par une chaine de caractères de la forme :

uid;date;heure;duree;code;modalite;intitule;salle1|salle2|...;prof1|prof2|...;groupe1|groupe2|...

représentant les différentes propriétés d’un événement, séparées les unes des autres par des ';' avec :

  • uid (uid) :  l’identifiant unique de l’événement

  • date (date) :  la date au format JJ-MM-AAAA à laquelle débute l’événement

  • heure (time) :  l’heure au format HH:MM marquant le début (horaire) de l’événement avec mention de l’heure HH et des minutes MM chacun sur 2 chiffres (les secondes étant omises)

  • duree (duration) :  la durée de l’événement traduite au format HH:MM avec mention du nombre d’heures pleines HH et du nombre de minutes restantes MM chacun sur 2 chiffres (les secondes étant omises)

  • code (code) :  le code de module (ressource, SAé ou module) auquel est rattaché l’événement

  • modalite (modality) :  la modalité (CM/TD/TP/Proj/DS) de l’événement

  • intitule (title) :  l’intitulé de l’événement (tel qu’il apparait dans ADE)

  • salle1|salle2|... (rooms) :  les salles réservées pour le créneau, séparées par des |

  • prof1|prof2|... (teachers) :  les professeurs qui encadrent le créneau, séparés par des |

  • groupe1|groupe2|... (groups) :  les groupes de TD qui suivent le créneau, séparés par des |

L’événement de l’exemple précédent (cf. Exemple d’événement ics) a donc pour description au format pseudo-csv :

ADE6050726f6a6574535453323032312d323032322d31373030382d302d31;26-11-2011;08:00;R104;TP;R104-TP-Eln;IUT1_126;FAYOLLE GERARD|KASPER KEVIN;S1G1

Note

Lorsqu’un événement n’est pas rattaché à un module, par exemple, la Réunion de rentrée de 1ère année, le code est "Autre". La modalité d’un événement peut être <vide>.

Format d’un calendrier pseudo-csv

Un calendrier au format pseudo-csv est une suite d’événements (un par ligne), chaque événement étant décrit au format pseudo-csv (décrit précédemment).

Le calendrier de l’exemple précédent (cf. Exemple de calendrier ics) a donc la description suivante dans un fichier au format pseudo-csv :

ADE6050726f6a6574535453323032312d323032322d353337372d302d30;05-04-2022;09:00;02:30;M4206;DS;M4206-DS-PartTP-Android;IUT1_T33 res1|IUT1_T32 res2;DELNONDEDIEU YVES|GOEURIOT LORRAINE;S4UFA
ADE6050726f6a6574535453323032312d323032322d34313931332d302d30;06-09-2021;09:00;01:00;Autre;;Réunion de rentrée UFA;IUT1_121_GE;CHOLLET REMY|VEDEL FRANCK;S3UFA
ADE6050726f6a6574535453323032312d323032322d32333037302d302d30;06-05-2022;02:00;M4201;TD;M4201-TD-Anglais;IUT1_C007|IUT1_C011;NICOLL NICOLA|ROYER SANDRA;S4UFA

C’est une suite de 3 lignes, chacune décrivant un événement.

Note

Remarquez la Réunion de rentrée dont le code est "Autre" et la modalité est <vide>.

Stratégie de prise en main

Votre objectif pour cette activité est de prendre en main le format .ics pour pouvoir ensuite commencer à réaliser la première étape de votre projet : parser les événements pour les convertir au format pseudo-csv.

Préparer un script Awk

A la racine du répertoire de votre projet (répertoire ~/SAE15) :

  1. Créez un nouveau fichier projet_ics.awk

  2. Recopiez le code suivant : (par un simple copier-coller)

BEGIN {
        print "Le script commence !"

        vevent = "ADE6050726f6a6574535453323032312d323032322d353337372d302d30;05-04-2022;09:00;02:30;M4206;DS;M4206-DS-PartTP-Android;IUT1_T33 res1,IUT1_T32 res2;DELNONDEDIEU YVES,GOEURIOT LORRAINE;S4UFA"

        # Point 1 : Codez ci-après le découpage de la chaine vevent en un tableau tevent

        # Fin du Point 1

        salles = tevent[8]
        profs = tevent[9]

        # Point 2 : Codez ci-après le remplacement des ',' par des '|'

        # Fin du Point 2

        print "salles avec des '|' = " salles
        print "profs  avec des '|' = " profs
}
  1. Ouvrez un terminal.

  2. Placez vous dans le répertoire SAE15 où vous avez normalement créé votre script.

  3. Testez votre script avec la commande :

awk -f ./projet_ics.awk
  1. Vous devriez voir s’écrire « Le script commence ! » sur votre console.

Préparer la conversion ics vers le pseudo-csv

  • Ecrivez le code demandé dans le script aux points 1 et 2.

  • Vous êtes prêt à coder les fonctions attendues sur les événements.

Avancer sur le codage des dates et de la conversion

  • Consultez la documentation des modules projet_phase1 et projet_ics2csv.

  • Complétez toutes les fonctions vides du module et testez les au fur et à mesure dans la boucle principale du module projet_ics2csv.

  • Commencez le code de la fonction icsEvtToCsv() sans vous soucier dans un premier temps du code "Autre" pour les événements qui ne sont pas des modules.

    Pour mettre au point et tester votre code (au fur et à mesure) :

    • travaillez sur le calendrier donné en exemple (téléchargeable ici) ;

    • le résultat attendu du parsing ics est le suivant (téléchargeable ici) :

ADE6050726f6a6574535453323032312d323032322d353337372d302d30;05-04-2022;09:00;02:30;M4206;DS;M4206-DS-PartTP-Android;IUT1_T33 res1|IUT1_T32 res2;DELNONDEDIEU YVES|GOEURIOT LORRAINE;S4UFA
ADE6050726f6a6574535453323032312d323032322d34313931332d302d30;06-09-2021;09:00;01:00;Réunion de rentrée UFA;;Réunion de rentrée UFA;IUT1_121_GE;CHOLLET REMY|VEDEL FRANCK;S3UFA
ADE6050726f6a6574535453323032312d323032322d32333037302d302d30;06-05-2022;08:00;02:00;M4201;TD;M4201-TD-Anglais;IUT1_C007|IUT1_C011;NICOLL NICOLA|ROYER SANDRA;S4UFA
  • Dans un deuxième temps, réglez le problème du code "Autre" pour les événements qui ne sont pas des modules.

  • Le résultat final de la transformation de l’union de tous les fichiers .ics (disponible ici) fournis dans le cahier des charges est le fichier disponible ici.