Open jacquesfize opened 6 months ago
+1 pour la simplicité et la généricité de la génération de graphiques. Dans le contexte du module d'import ou frontend est très générique et le backend spécifique à chaque module, ça me parait bien approprié. Petit warning sur le petit changement de paradigme que ça implique : on est plus sur un backend complétement agnostique du frontend. Ici le backend génère du javascript inteprété côté client. On ne délègue plus tout à angular. ça necessite aussi de bien synchroniser la lib Bokeh backend de celle chargée dans le frontend
La solution semble intéressante mais il faudrait évaluer si cela n'ajoute pas trop de dépendances qui pourraient compliquer et alourdir la maintenance globale ?
Contexte
Dans le cadre de l'évolution du module d'import, il est question de permettre d'intégrer différentes destinations : Synthèse, OccHab, etc...
Dans le rapport d'un import pour la synthèse, un graphique permet de visualiser la distribution des taxons selon différentes catégories (rang, genre, groupe_inpn, etc..). Pour le moment, aucun graphique n'existe dans le rapport de l'import OccHab. Dans la perspective d'ajouter de nouvelles destinations dans le module d'import, la généricité de ce graphique est une nécessité !
Dans cette issue, je propose de discuter de ce sujet. Pour débuter les discussions, je propose de s'appuyer sur une première proposition.
N.B.: Le sujet de la généricité des graphiques dépassent le cadre seul du module d'import ! Les solutions discutées ici sont envisagées pour l'import et GeoNature !
Solution proposée : génération du graphique côté backend dans une route partagée par toutes les destinations
Dans la nouvelle version de l'import de GeoNature, chaque destination (module GeoNature) doit définir une nouvelle classe dans un fichier
module.py
qui déclarent différentes méthodes et variables propres à la destination :En s'appuyant sur cette classe, on pourrait imaginer un nouvel attribut dans
__imports__
:report_plot
qui retourne les données nécessaires au rendu du graphique (en JSON).Ensuite, il suffit au frontend de faire appel à une route commune qui récupère et retourne le résultat de la fonction stockée dans
report_plot
. Enfin, à l'aide de la partie JS de la librairie choisie, reconstruire le graphique dans l'interface à l'aide des données JSON.En résumé :
Appel d'une route (par ex. "generate_plot")
__import__.report_plot
de la classe de la destination (par ex. OcchabModule)Utilisation de la librairie JS du module choisi pour reconstruire le graphique avec ses callbacks dans l'interface de GeoNature.
Génération du graphique côté backend
Librairies testées
Dans le domaine de la datascience, il existe plusieurs librairies Python permettant de faire des graphiques interactifs s'appuyant sur du HTML/CSS/JS. Ici, je mentionnerais :
plotly
,bokeh
.Chacune de ces librairies permet de générer un graphique et de pouvoir exporter ce dernier en JSON. Cependant,
plotly
(à ma connaissance) n'exporte que le graphique et pas les callbacks (permettant d'interagir sur le contenu du graphique). Contrairement àbokeh
!NB Il existe certainement d'autres librairies permettant d'exporter les callbacks et les graphiques ! (à fouiller)
POC
Ci-dessous, vous trouvez un poc (proof-of-concept) qui reproduit le processus (simplifié) de la procédure présenté ci-dessus.
index.html
app.py
Remarques sur la solution proposée