Retour : page principale > sommaire eFlore v5 > Coel

Cahier des charges et notes

L'application devra :
  1. gérer les standards : NCD, BIOCASE -> les tables de base correspondront à ce modèle
  2. gérer un historique des modifications -> utilisation de l'historisation en mode ligne
  3. gestion multi-projets versionnables (plusieurs inventaires doivent pouvoir être gérés en parallèle et chacun d'entre eux doit pouvoir être versionné).

Dans une deuxième temps :
  1. le fonctionnement hors-ligne quand GWT supportera l'API du HTML5 concernant le mode déconnecté
  2. gérer l'ajout de données spécifiques au projet Herbier LR/PACA -> utilisation de la technique des métadonnées.


Mise en ligne d'une nouvelle version
  • Si c'est une version majeure :
    • crĂ©er une branche sur le svn avec nom et numĂ©ro de version
    • crĂ©er un tag sur le svn avec nom et numĂ©ro de version
    • modifier dans la branche le fichier A_LIRE.txt
  • dans tous les cas :
    • dans la branche modifier le fichier : war/apropos.defaut.js en indiquant le numĂ©ro de version et le nom de la version majeure
    • dans la branche crĂ©er/modifier le fichier : war/apropos.js en indiquant le numĂ©ro de version et le nom de la version majeure
    • faire un merge avec la branche principale.
  • Lancer le script : mise_en_ligne qui va : ./mise_en_ligne.sh -h 193.54.123.169 -u telabotap -p MOT_DE_PASSE
    • compiler l'application dans le dossier war
    • envoyer sur le serveur le dossier war
    • envoyer sur le serveur le dossier Jrest
  • Si la base de donnĂ©es a changĂ© lancer via phpmyadmin le fichier sql de mise Ă  jour.
  • Si c'est le premier envoie ou si la configuration Ă  changĂ©e modifier ou crĂ©er sur le serveur les fichiers :
    • config.js de Coel
    • .htacces de Coel ( Php5 + Utf-8)
    • config.ini.php de Jrest
    • .htacces de Jrest (Redirection vers les services)

Notes sur le modèle de la base de données


Projet
Les tables principales du modèle possèdent une clé primaire auto incrémentée et sont liées à la table des projets par une clé étrangère.
Les tables de liaisons composées des clés primaires des tables principales quelles lient, ne possède généralement pas de clé étrangère vers la table projet.
Ainsi, si pour un projet donnée nous devons gérer des codes ou identifiants particuliers, il est nécessaire de prévoir des champs spécifiques.
Par ailleurs les version des projets sont gérées via les dates des enregistrements et les tables d'historiques.

Structures et collections
  • Une structure ne peut pas ĂŞtre supprimĂ©e si elle possède des collections liĂ©es

Historisation
Concernant l'historisation, le principe retenu consiste à noter dans une table d'historique des lignes les informations sur un enregistrement et ses versions précédentes. Donc, nous aurons soit des enregistrements : ajoutés, modifiés ou supprimés.
Quand un enregistrement est ajouté :
  • un nouvel enregistrement est crĂ©Ă© dans la table d'historique des lignes. Elle permet de savoir : qui a fait la modification, pourquoi, quand et depuis oĂą (adresse IP).
  • une ligne est crĂ©Ă©e et les donnĂ©es (dont l'identifiant des mĂ©tadonnĂ©es) sont insĂ©rĂ©es dans sa table.
Quand un enregistrement est modifié :
  • ses champs modifiĂ©s ont leurs anciennes valeurs stockĂ©es dans une table d'historique des colonnes. Elle contient seulement les valeurs des champs d'un enregistrement : ajoutĂ© ou modifiĂ©s Pour un champ d'un enregistrement donnĂ©e, nous pouvons savoir : quelle valeur il avait et quand il a Ă©tĂ© enregistrĂ©e.
  • un nouvel enregistrement est crĂ©Ă© dans la table d'historique des lignes
  • on met Ă  jour les champs modifiĂ© (dont l'identifiant des mĂ©tadonnĂ©es).
Quand un enregistrement est supprimé :
  • un nouvel enregistrement est crĂ©Ă© dans la table d'historique des lignes
  • les valeurs de tous les champs de l'enregistrement supprimĂ© sont stockĂ©es au format XML de la table d'historique des lignes.
  • l'enregistrement est supprimĂ© de sa table

Relation de type 0,n - 0,n liant une table de donnée à une table de liste de valeurs
Pour les champs de type cases à cocher ou liste de choix multiples, qui peuvent contenir plusieurs valeurs et même un champ "autre", nous utiliserons un champ dénormalisé. Cela permettra de simplifier la gestion et d'augmenter les performances.
Ce type de champ :
  • possĂ©dera dans son nom l'abreviation "_truk_"
  • sera au format VARCHAR(255)
  • stockera plusieurs valeurs sĂ©parĂ©es par deux points virgules consĂ©cutifs ";;".
  • le mot en majuscule "AUTRE" sera sĂ©parĂ© de la valeur dĂ©fini par l'utilisateur par deux symboles dièse consĂ©cutif "##".
  • le mot en majuscule "TOTAL" sera sĂ©parĂ© de la valeur dĂ©fini par l'utilisateur par deux symboles dièse consĂ©cutif "##". Il permettra de stocker les totaux des autres valeurs.
  • au sein d'une valeur, un Ă©ventuel identifiant sera sĂ©parĂ© de la valeur par deux symboles dièse consĂ©cutif "##". Cela permet de gĂ©rer plusieurs rĂ©fĂ©rentiels. Exemple : pour les codes gĂ©ographiques on peut avoir ISO-3116-1, ISO-3166-2 et ISO-3116-3 ; pour les acronymes des structures on pourra avoir : IH (Index Herbarium) ou MNHN (MusĂ©um National d'Histoire Naturelle). Dans ce cas, le fichier contenant le vocabulaire du modèle devra contenir la liste des identifiants avec leur signification.
Certains champs peuvent être plus complexe encore et dans ce cas le modèle de données devra indiquer leur fonctionnement. Nous tenterons de rester homogène dans leur fonctionnement. Par exemple pour les lieux de récoltes, après chaque code ISO un signe pipe | peut être suivi des années de récolte séparées par des virgules ou des tirets pour les périodes continues. Si une valeur est inconnu, on utilisera un point d'interrogation. Exemple : ISO-3166-1##FR|1905-1908,1910;;ISO-3166-1##PS|1912;;ISO-3166-2##FR-34|1917.

Relation de type 0,1 - 0,n liant une table de donnée à une table de liste de valeurs
Pour les champs contenant une seule valeur provenant d'une liste, nous utiliserons la table "valeur" du module métadonnées pour lister l'ensemble des valeurs possible et leur identifiant.
Ce type de champ :
  • possèdera dans son nom l'abrĂ©viation "_ce_"
  • sera le plus souvent au format INTEGER(3)
  • contiendra l'identifiant de la valeur choisi
Si ce champ peut aussi contenir une valeur libre ( = champ "autre") alors il :
  • possèdera dans son nom l'abrĂ©viation "_ce_truk_"
  • sera le plus souvent au format VARCHAR(255)
  • contiendra seulement l'identifiant de la valeur choisi si le champ autre n'est pas rempli
  • stockera plusieurs valeurs sĂ©parĂ©es par des points virgule ";" (uniquement si une sĂ©lection est faite et que le champ autre est rempli).
  • le mot en majuscule"AUTRE" sera sĂ©parĂ© de la valeur dĂ©fini par l'utilisateur par le symbole dièse "#".

Champ de formatage
Certains champs peuvent contenir des données pré-formatées correspondant à la concaténation de plusieurs autres champs de la table.
Ce type de champ :
  • possèdera dans son nom l'abrĂ©viation "_fmt_"

Droits et rĂ´les des utilisateurs
La table "personne" indique le rôle de plus grande importance que possède l'utilisateur vis à vis de l'ensemble des projets.
  • super-admin : vis Ă  vis de tous les projets.
  • admin : vis Ă  vis de tous d'un ou plusieurs projets.
  • coordinateurs : vis Ă  vis d'un ou plusieurs projets (voir table "personne_a_relation").
  • contributeurs : vis Ă  vis d'une structure d'un ou plusieurs projets (voir table "structure_a_personne").

Pour les super-admins, seul la table "personne" servira Ă  indiquer leur rĂ´le vis Ă  vis de l'ensemble des projets.

Pour les administrateurs, leur rôle vis à vis d'un projet particulier est défini via la table "personne_a_relation" qui contiendra l'identifiant du coordinateur (= personne) à la fois dans le champ "id_personne_01" et "id_personne_02".

Pour les coordinateurs, leur rôle vis à vis d'un projet particulier est défini via la table "personne_a_relation" qui contiendra l'identifiant du coordinateur (= personne) à la fois dans le champ "id_personne_01" et "id_personne_02".
Pour savoir quels utilisateurs un coordinateur coordonne, il suffit de regarder quels sont les gestionnaire des structures du projet.

Pour les contributeurs a une structure en particulier (et donc aux collections quelle contient), il faudra utiliser la table "structure_a_personne" avec la valeur pour le champ "id_role" correspondant Ă  "est administrer par".
Pour connaître le(s) coordinateur(s), il suffit de regarder a quel projet appartiennent ces structures, puis de regarder quels sont les coordinateurs de ces projets.

Les différents rôles des utilisateurs sont les suivants:
(Les rôles ci-dessous sont classé par importance décroissante. Chacun d'eux possède les droits du suivant.)

- Super Administrateur : il désigne les Administrateurs et crée les projets
- Administrateur : lié à un projet, il peut le modifier et désigner des coordinateurs
- Coordinateur : Lié à une structure, il peut les modifier
- Contributeur: Il peut modifier une structure, il peut désigner des contributeurs


Comment réaliser les versions des projets ?
Dans l'interface d'administration d'un projet, il y aura la possibilité d'indiquer les dates de début et de fin d'une version qui indiquera ainsi les étapes clés d'un projet.

Comment se fera la publications des données sur Tela Botanica ?
Via l'interface de gestion des projets, l'administrateur ou super-administrateur pourra demander une autorisation de publication sur le site de Tela Botanica.
Cela consiste en :
  • l'utilisation du protocole UDDI fournit dans le  TapirLink installĂ© avec le COEL
  • le client UDDI appellera un service d'eFlore (nommĂ© UDDI) qui va rĂ©cupĂ©rer toutes les infos nĂ©cessaires pour synchroniser un projet (voir Tapir metadata) et les stocker dans eFlore.
  • ce service UDDI d'eFlore prĂ©viendra aussi le COEL si le projet a Ă©tĂ© autorisĂ© ou pas...
  • un flux RSS prĂ©viendra des nouvelles demandes les administrateurs de la base eFlore
  • le champ "esws_ce_projet_eflore" de la table eflore_structure_web_service permettra d'autoriser la synchronisation (Ă  faire manuellement). Ce champ contiendra l'id du projet au sein d'eFlore quand la synchro est autorisĂ©e.
  • pĂ©riodiquement sur le serveur oĂą eFlore est hĂ©bergĂ© (cron) une script (nommĂ© Tapirus) sera lancĂ© et se connectera aux  TapirLink fournit avec le COEL, il rĂ©cupĂ©rera les nouveautĂ©s autorisĂ©es a ĂŞtre publiĂ© depuis la dernière synchronisation et mettra Ă  jour eFlore
  • le transfert entre eFlore et un fournisseur COEL se fera selon le protocole Tapir

DĂ©tail du fonctionnement de Tapirus vis Ă  vis du COEL
  • Pour chaque projet d'un COEL demandant une synchro avec eFlore une ressource  TapirLink sera crĂ©e.
  • Cette ressource principale contiendra toutes les mĂ©tadonnĂ©es liĂ©es au projet et sera liĂ©e Ă  une table de la bdd COEL contenant 3 champs principaux : id_projet, id_table, date_modification. Ces 3 champs permettrons de savoir la date de dernière modification d'un enregistrement d'une table au sein d'un projet donnĂ©.
  • D'une façon globale, une ressource par table de la bdd COEL sera crĂ©Ă©e au sein de  TapirLink
  • Tapirus se chargera d'appelĂ© chacun des services liĂ©e Ă  une table si le service principal indique que la table a Ă©tĂ© mise Ă  jour. Il mettra un filtre en fonction de l'id du projet principal.

Quelles données seront rendues publiques sur le site de Tela Botanica ?
Dans l'interface d'administration, un utilisateur pourra marquer les structures et collections qu'il gère comme "données transmises à Tela Botanica".
Si le projet hébergeant ces données a été autorisé à être publié sur Tela, les données marquées seront collecté par Tela Botanica et mise en ligne sur le site.
Périodiquement, Tela Botanica récupèrera les modifications apportées à ces données "publiques" pour mettre à jour le site de consultation.

Notions de référentiels, liste de valeurs (typologie)
Par référentiels nous entendons tout ensemble homogène, c'est à dire une liste, de valeurs, chaque valeur étant constituées d'au moins 3 caractéristiques : nom, code et description.
Nous distinguons deux types de référentiels :
  • simple : contient seulement des donnĂ©es constituĂ© de ces 3 caractĂ©ristiques : nom, code (= abrĂ©viation) et description.
  • complexe : le rĂ©fĂ©rentiel possèdes des donnĂ©es plus dĂ©taillĂ©es. Exemple : des communes françaises avec indication de latitude et longitude de leurs barycentres...

Un référentiel simple peut devenir complexe et inversement.

Au niveau des bases de données, un référentiel simple sera géré dans la table "liste_valeur" du module "Métadonnées", un référentiel complexe aura son propre module (Ex. : zones géographiques, langues, nomenclature botanique...).

Synchronisation des référentiels
Via l'interface de paramétrage d'une application (ici COEL), un super-admin pourra réaliser la synchronisation des référentiels avec la base de référence (eFlore).

Pour ce faire, tout référentiel simple pourra être mise à jour avec un référentiel complexe présent sur la base de référence grâce au champ "code/abréviation" (exemple : nn, code insee, code iso...) et à la date de dernière modification d'une valeur. La date de dernière modification de la liste de cette valeur permettra de connaître la date de dernière synchronisation.

Logiquement, la base de référence (eFlore) devrait contenir à la fois les référentiels complexes et les référentiels simples.

Référentiels dans le cadre de l'application COEL
Les référentiels "complexes" :
Les référentiels "simples" :
  • Pour les noms de pays... intĂ©grer le standard suivant dans la table "liste_valeur" du module MĂ©tadonnĂ©es :
  • Pour les noms de dĂ©partement... intĂ©grer les standards suivant dans la table "liste_valeur" du module MĂ©tadonnĂ©es :
  • Pour les noms de communes... intĂ©grer le standard suivant dans la table "liste_valeur" du module MĂ©tadonnĂ©es :
    • INSEE Communes françaises
  • Si besoin pour les langues... intĂ©grer le standard suivant dans la table "liste_valeur" du module MĂ©tadonnĂ©es :

Insertion du schéma de la base de données et des listes de valeurs
Pour les listes de valeurs, les insérer dans cet ordre :
  • les valeur d'Ă©tat d'enregistrement [0-10]
  • les tables [11-200]
  • la liste des listes [201-999]

Références

Notes
  • Si on veut distinguer numĂ©ros de tĂ©lĂ©phone, fax, courriels, url... du domicile / bureau, il faudrait utilisait la table structure_a_personne (pour stocker les infos "bureau" d'une personne vis Ă  vis d'une structure), personne (pour les infos du domicile) et structure (pour les infos propres au bureau).
  • Le registre devrait seulement servir Ă  stocker des paramĂŞtres de l'appli chargĂ© depuis un fichier de config. PrĂ©fĂ©rer les variables de classes Ă  l'utilisation du registre. Cela sera plus facile Ă  tester.

A faire
  • VĂ©rifier les types de champ : _ce_, _ce_truk_ et _truk_ lors de la mise en place des formulaires dans l'appli
  • Rajouter les relations entre les champs de type ..._ce_..., ..._ce_truk_... et la table coel_meta_liste_valeur
  • Rajouter les relations entre .._ce_meta et la table coel_meta_historique_ligne
  • Supprimer la taille pour le type INTEGER dans le modèle
  • VĂ©rifier la suppression des valeurs "Autres" du fichier de vocabulaire pour les champs de type "_ce_truk_"
  • Ajouter au script Perl dbd_rapport un squelette pour la crĂ©ation du fichier SQL de structure de la base de donnĂ©es avec commentaires
  • CrĂ©er un script PHP qui automatise l'insertion des informations dans les tables de mĂ©tadonnĂ©es depuis le fichier ".ini" contenant le vocabulaire et le fichier sql de crĂ©ation de la base de donnĂ©es
  • RĂ©gler le problème des champs pour les Collections de l'ancienne appli Herbiers non prĂ©sent dans la nouvelle enquĂŞte : Mode de conservation des spĂ©cimens, Nombre de spĂ©cimens, CaractĂ©riser le dĂ©nombrement de spĂ©cimens, Nombre d'espèces, CaractĂ©riser le dĂ©nombrement d'espèces, État de la prĂ©sentation, État du classement, État de la prĂ©sentation, État de la documentation, % de la documentation en base de donnĂ©es
  • Il faudra peut ĂŞtre crĂ©er un module commentaire pour gĂ©rer les notes...

  • Tester si c'est plus intĂ©ressant de laisser un champ *_ce_etat dans les tables pour reconnaĂ®tre les champs supprimĂ©s des autres (ajoutĂ©s et modifiĂ©s). PlutĂ´t que de tout mettre dans la table "coel_meta_historique_ligne".
  • Tester les diffĂ©rents types d'historisation

A faire pour la compatibilité Coel / eFlore
  • mettre en place dans le modèle DBD une seule table de mĂ©ta-donnĂ©es "liste_valeur" dans un nouveau module "MĂ©tadonnĂ©es".
  • Modifier le script SQL de mise Ă  jour d'eFlore.
  • CrĂ©er le fichier texte tabulĂ© gĂ©rant les rĂ©fĂ©rentiels "simples"
  • Modifier le script de gĂ©nĂ©ration du SQL pour la bdd COEL
  • CrĂ©er une mĂ©thode gĂ©nĂ©rant un rapport dans le script de gĂ©nĂ©ration du SQL. Il doit permettre de charger le contenu de la table "liste_valeur" prĂ©sent pour la bdd eFlore.

A faire sur le service Coel-Tapir vers eFlore
  • Tester la chaine complète sur un petit ensemble de donnĂ©es (une seule table : structure) :
    • mise Ă  jour du sql d'eFlore pour gĂ©rer les fournisseurs
    • Service de demande d'autorisation ( EfloreFournisseur)
    • Service Tapir Coel
      • crĂ©er un schĂ©ma XML permettant de mapper une table du COEL
      • Ajouter le champ dernière modification et Ă©tat pour tester les dernière modifications.
    • Script eFlore gĂ©rĂ© par cron pour rĂ©cupĂ©rer les donnĂ©es,
      • intĂ©rogation d'un  TapirLink via les donnĂ©es stockĂ©es dans la table "eflore_structure_web_service"
      • rĂ©cupĂ©ration et insertion de toutes les donnĂ©es d'une table dans eFlore lors d'une première synchronisation
      • ajouter des messages d'info quand des mĂ©tadonnĂ©es sont modifiĂ©es
      • prendre en charge les prĂ©fĂ©rences d'indexation pour la mise Ă  jour
      • historisation des donnĂ©es dans eFlore, lors d'une mise Ă  jour.

Améliorations possibles
  • Utiliser la champ _truk_telephone pour stocker les numĂ©ros de fax. Il pourrait porter le type "FAX". Nous avons dĂ©jĂ  : "FIX" pour les numĂ©ros de tĂ©lĂ©phone fixe, "GSM" pour les portables et "PAG" pour les pagers.

RequĂŞte pour le flux RSS

SELECT h.cmhl_id_historique_ligne, h.cmhl_ce_table, h.cmhl_cle_ligne, MAX(h.cmhl_date_modification) AS date_max, hp.cmhl_date_modification AS date_max_pre
FROM coel_meta_historique_ligne AS h LEFT JOIN coel_meta_historique_ligne AS hp ON (h.cmhl_ce_table = hp.cmhl_ce_table AND h.cmhl_cle_ligne = hp.cmhl_cle_ligne)
WHERE h.cmhl_ce_table IN (101, 106)
AND hp.cmhl_date_modification < h.cmhl_date_modification
GROUP BY h.cmhl_ce_table, h.cmhl_cle_ligne