From 57b50c3e1a9191bc10e2834fd24264b35c945ea5 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 08:11:09 +0100 Subject: [PATCH 01/22] Update developpement.md layout --- docs/developpement.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/developpement.md b/docs/developpement.md index 156641b6..35d0a6a6 100644 --- a/docs/developpement.md +++ b/docs/developpement.md @@ -51,11 +51,11 @@ - Params : - codes : filtre sur une liste de codes de types de statuts séparés par des virgules. - gatherings : filtre sur une liste de type de regroupement de types de statuts séparés par des virgules. -- `/bdc_statuts/status_symbologies` : Retourne les symbologies associées au statuts au format JSON. \ - Ces symbologies sont définies statiquement, au format suivant:\ +- `/bdc_statuts/status_symbologies` : Retourne les symbologies associées au statuts au format JSON. + Ces symbologies sont définies statiquement, au format suivant : -```json -{ + ```json + { "symbologies": [ { "types": ["LRM", "LRE", "LRN", "LRR"], @@ -74,8 +74,8 @@ }, } ] -} -``` + } + ``` -> Ces valeurs sont issues de la charte des codes couleurs pour les statuts Liste rouge, définis internationalement par l'Union internationale pour la conservation de la nature (UICN) \ -> (page 55) + > Ces valeurs sont issues de la charte des codes couleurs pour les statuts Liste rouge, définis internationalement par l'Union internationale pour la conservation de la nature (UICN) \ + > (page 55) From 58e9bb968ad6fa193133cace1136b6b7eb25366c Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 08:57:51 +0100 Subject: [PATCH 02/22] Changelog 2.0.0 - complement --- docs/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.md b/docs/changelog.md index a1d72a67..c2cebb0b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -25,6 +25,7 @@ Compatibilité avec GeoNature 2.15.0 minimum. - Evolution de la procédure de migration Taxref (#382) - Déplacement de la doc de mise à jour de Taxref dans la documentation générale de TaxHub (#555) - Dépreciation de la route `/taxoninfo` au profit de la route `/taxref` (#554) +- Ajout des propriétés optionnelles sur la route `/taxref` permettant de récupérer les attributs et les médias de chaque taxon (#498) - Ajout d'une route `/bdc_statuts/status_symbologies` renvoyant la symbologie de statuts des taxons (couleurs des valeurs des listes rouges) (#510, par @edelclaux) - Amélioration de la vue `taxonomie.vm_taxref_list_forautocomplete` pour afficher tous les noms d'un taxon (#332, par @JulienCorny et @andriacap) - Ajout d’une vue matérialisée `vm_taxref_tree` contenant pour chaque `cd_nom` la liste complète des `cd_ref` de ses taxons parents (#567, par @jbdesbas, @amandine-sahl, @bouttier) From 8940f47fdcdb0560f7c58397762c46cfcf2f5a4f Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 08:58:12 +0100 Subject: [PATCH 03/22] Update changelog 2.0.0 --- docs/changelog.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index c2cebb0b..03be0ef1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -3,9 +3,9 @@ 2.0.0 (2024-10-29) ------------------ -Refonte globale de l'interface de TaxHub avec Flask-admin, pour simplifier son développement et sa maintenance, mais aussi permettre de l'intégrer complètement dans le module "Admin" de GeoNature. -Si vous utilisez GeoNature, TaxHub sera désormais intégré à celui-ci dans le module "Admin" et il ne sera plus nécessaire de l'installer, l'administrer ni le mettre à jour indépendamment. -Compatibilité avec GeoNature 2.15.0 minimum. +- Refonte globale de l'interface de TaxHub avec Flask-admin, pour simplifier son développement et sa maintenance, mais aussi permettre de l'intégrer complètement dans le module "Admin" de GeoNature. +- Si vous utilisez GeoNature, TaxHub sera désormais intégré à celui-ci dans le module "Admin" et il ne sera plus nécessaire de l'installer, l'administrer ni le mettre à jour indépendamment. +- Compatibilité avec GeoNature 2.15.0 minimum. **🚀 Nouveautés** From 3ed128c0b4e26f172a6b4636c1f5620934d003f6 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:00:24 +0100 Subject: [PATCH 04/22] Changelog 2.0.0 - authors --- docs/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index 03be0ef1..c013dcdf 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -9,7 +9,7 @@ **🚀 Nouveautés** -- Refonte majeure de l'interface. Migration de Angular JS à Flask-Admin (#297, #377) +- Refonte majeure de l'interface. Migration de Angular JS à Flask-Admin (#297, #377, par @amandine-sahl, @TheoLechemia, @jacquesfize) - Suppression de la table `bib_noms`. Les attributs et médias sont désormais directement associés à la table `taxref`. Cela simplifie la gestion des taxons par les administrateurs, ainsi que la mise à jour régulière de Taxref (#111, #163) - Ajout d'une interface d'administration pour la création des types d'attributs et des thèmes - Peuplement en lot des listes de taxons avec un CSV de cd_nom (#299) From a7f1833ba06f9ae140f1c96a5de2ebb4a89f6d8d Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:42:04 +0100 Subject: [PATCH 05/22] Update manuel-utilisateur.md with images --- docs/manuel-utilisateur.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/manuel-utilisateur.md b/docs/manuel-utilisateur.md index f27b10c0..68d05de0 100644 --- a/docs/manuel-utilisateur.md +++ b/docs/manuel-utilisateur.md @@ -6,19 +6,19 @@ L'application TaxHub permet de gérer les informations liées à la taxonomie dans votre instance de GeoNature : espèces saisissables sur le module Occtax de GeoNature, informations diverses sur les espèces, enrichissement des fiches espèces de GeoNature-atlas, regroupement des -taxons en listes personnalisées etc. +taxons en listes personnalisées, etc. 3 onglets principaux structurent l'application : - **TAXREF** : Dans cet onglet, tout utilisateur connecté ou non peut explorer le référentiel taxonomique. Un utilisateur disposant des - permissions suffisantss pourra également ajouter des attributs ou médias à un taxon. + permissions suffisantes pourra également ajouter des attributs ou médias à un taxon. - **LISTES** : Cet onglet recense les listes disponibles et permet d'en créer des nouvelles, de les peupler, les modifier et les exporter. - **ATTRIBUTS** : Cet onglet recense les attributs disponibles et permet d'en créer de nouveaux. -## Exploration du Taxref +## Exploration de Taxref Dans l'onglet Taxref, vous pouvez explorer le référentiel national complet. Vous pouvez ainsi requêter selon différents champs et filtrer les résultats sur @@ -26,7 +26,7 @@ ces différentes colonnes, ou encore consulter les fiches espèces sur le site de l'INPN. Pour ces fonctions, il n'est pas nécessaire d'être connecté. -![image](images/explore_taxref.gif) +![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/explore_taxref.gif) Cet onglet permet d'explorer le référentiel taxonomique national et de consultrer pour chaque taxon les attributs et médias de votre instance. From a34c4cc7f013341ec44f81e0b993d9d1957cc8ef Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:44:01 +0100 Subject: [PATCH 06/22] Update manuel-utilisateur.md with images --- docs/manuel-utilisateur.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manuel-utilisateur.md b/docs/manuel-utilisateur.md index 68d05de0..0b3a8942 100644 --- a/docs/manuel-utilisateur.md +++ b/docs/manuel-utilisateur.md @@ -26,7 +26,7 @@ ces différentes colonnes, ou encore consulter les fiches espèces sur le site de l'INPN. Pour ces fonctions, il n'est pas nécessaire d'être connecté. -![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/explore_taxref.gif) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/explore_taxref.gif) Cet onglet permet d'explorer le référentiel taxonomique national et de consultrer pour chaque taxon les attributs et médias de votre instance. From ab5292f261703cc99a9bee336030ae88b9e93248 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:50:13 +0100 Subject: [PATCH 07/22] Fix manuel-utilisateur.md gif absolute URL for RTFD --- docs/manuel-utilisateur.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/manuel-utilisateur.md b/docs/manuel-utilisateur.md index 0b3a8942..38f4ed8b 100644 --- a/docs/manuel-utilisateur.md +++ b/docs/manuel-utilisateur.md @@ -30,8 +30,7 @@ connecté. Cet onglet permet d'explorer le référentiel taxonomique national et de consultrer pour chaque taxon les attributs et médias de votre instance. -![image](images/detail_taxon.gif) - +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/detail_taxon.gif) ## Mettre à jour les informations d'un taxon @@ -49,7 +48,6 @@ pourrez associer un ou plusieurs médias à un taxon. Ces médias peuvent être des images, des vidéos, des enregistrements sonores, des fichiers PDF etc. - ## Créer et gérer des listes personnalisées TaxHub permet d'organiser les taxons au sein de listes personnalisées. @@ -78,7 +76,7 @@ insectes. Une fois la liste créée, vous pourrez la peupler ou l'exporter comme vu précédemment. -![image](images/create_use_lists.gif) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/create_use_lists.gif) ## Créer et gérer des thèmes et attributs personnalisés @@ -98,7 +96,7 @@ entrée dans l'onglet "Thème". En créant cette entité, un ordre peut être donné au nouveau thème afin de les ordonner dans l'interface. -![image](images/create_theme.gif) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/create_theme.gif) De la même manière, pour créer un attribut, il faut créer une nouvelle entrée dans l'onglet "Attribut"`. Il est alors possible de définir ses modalités possibles @@ -108,8 +106,7 @@ pour les listes, les attributs peuvent ou non être limités à un règne ou Votre application TaxHub est désormais dotée de nouveaux attributs ! -![image](images/create_attribut.gif) - +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/create_attribut.gif) ## Gérer le contenu de GeoNature-atlas From f181698134c6a95c8894f8e91d173aaaaefb29ef Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:51:54 +0100 Subject: [PATCH 08/22] Delete docs/images/taxon-details.jpg --- docs/images/taxon-details.jpg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 docs/images/taxon-details.jpg diff --git a/docs/images/taxon-details.jpg b/docs/images/taxon-details.jpg deleted file mode 100644 index 10ea2fd2..00000000 --- a/docs/images/taxon-details.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7744be9d82e602d761726bd299c4f1e5e6527304a4f8d185be4fe28ed284ea84 -size 96126 From 89fa28663a1edd7ff033c76a679e14434e43bc9f Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:52:18 +0100 Subject: [PATCH 09/22] Delete docs/images/detail-taxon.jpg --- docs/images/detail-taxon.jpg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 docs/images/detail-taxon.jpg diff --git a/docs/images/detail-taxon.jpg b/docs/images/detail-taxon.jpg deleted file mode 100644 index e2019884..00000000 --- a/docs/images/detail-taxon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bbea500466aed8e323c55f883280e3a7c447298e7e0a6061e54d3007280f5b0 -size 66652 From 83555f9eedacb91e36479ffb1ae4d4bcf15d480d Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:52:30 +0100 Subject: [PATCH 10/22] Delete docs/images/taxons-liste.jpg --- docs/images/taxons-liste.jpg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 docs/images/taxons-liste.jpg diff --git a/docs/images/taxons-liste.jpg b/docs/images/taxons-liste.jpg deleted file mode 100644 index d2805ed1..00000000 --- a/docs/images/taxons-liste.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbf60f7cd60a2881b9c686584cc6aadfbd90bdbdbb96150e8ed38d8be577d63b -size 199462 From c4a30b67ac13f7915a2aaa2875b7c18bfa3ffdab Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 09:52:47 +0100 Subject: [PATCH 11/22] Delete docs/images/taxref-liste.jpg --- docs/images/taxref-liste.jpg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 docs/images/taxref-liste.jpg diff --git a/docs/images/taxref-liste.jpg b/docs/images/taxref-liste.jpg deleted file mode 100644 index d03b255f..00000000 --- a/docs/images/taxref-liste.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16f0761365eb13f204a4fe72284ce78216560af6896c030fb6151ccdb83f9657 -size 50154 From a0a2b9dec9ce29a0d0860dbc06cc222028ef5ae5 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 10:03:35 +0100 Subject: [PATCH 12/22] Update and rename update_taxref_version.md to update-taxref-version.md --- ...ef_version.md => update-taxref-version.md} | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) rename docs/{update_taxref_version.md => update-taxref-version.md} (90%) diff --git a/docs/update_taxref_version.md b/docs/update-taxref-version.md similarity index 90% rename from docs/update_taxref_version.md rename to docs/update-taxref-version.md index 8a7b9cd5..954e01a6 100644 --- a/docs/update_taxref_version.md +++ b/docs/update-taxref-version.md @@ -7,7 +7,7 @@ A noter qu'il n'est pas nécessaire de migrer les versions de taxref une à une. Il est par exemple possible de passer directement de Taxref version 13 à 17. -## Avant de commencer : +## Avant de commencer - La migration d'une version de Taxref est une opération conséquente. Ce script permet d'automatiser au maximum les opérations, mais @@ -26,7 +26,8 @@ version 13 à 17. - Sinon le faire depuis GeoNature `(venv)$ geonature db autoupgrade` -## Migrer taxref +## Mettre à jour Taxref + Le passage vers une nouvelle version de Taxref se fait en 2 étapes, disponibles sous forme de commandes python. @@ -38,10 +39,10 @@ activer, il faut : # Activer le virtual env source venv/bin/activate -### Importer la nouvelle version de taxref +### Importer la nouvelle version de Taxref **import_taxref_vXX** : import de Taxref et détection des changements de -`bib_noms`. +`bib_noms` (avant TaxHub 2.0.0). Un export des changements est réalisé à l'issue du script, dans le fichier `liste_changements.csv`. @@ -53,10 +54,10 @@ Ce script réalise les opérations suivantes : - Analyse des données dans la Synthèse de GeoNature et identification de celles dont le cd_nom a disparu dans la nouvelle version de Taxref (listés dans le fichier `liste_cd_nom_disparus_synthese.csv`) -- Identification des cd_noms ayant disparu dans la table - `taxonomie.bib_noms` +- Identification des cd_noms ayant disparus dans la table + `taxonomie.bib_noms` (avant TaxHub 2.0.0) - Liste des cd_nom supprimés de `taxonomie.bib_noms` dans le fichier - `liste_cd_nom_disparus_bib_noms.csv` + `liste_cd_nom_disparus_bib_noms.csv` (avant TaxHub 2.0.0) - Détection et export des changements à venir dans le schéma temporaire `tmp_taxref_changes` et sa table `comp_grap` - Liste dans le fichier `liste_changements.csv` les changements qui @@ -161,7 +162,7 @@ pourrez relancer le script. remplacés et supprimés - Mise à jour des cd_ref de `taxonomie.bib_noms` en fonction des cd_noms, suppression des noms disparus, ajout des noms de références - manquants + manquants (avant TaxHub 2.0.0) - Répercussion des évolutions de Taxref sur les tables `taxonomie.t_medias` et `taxonomie.cor_taxon_attribut` en fonction des cas et actions définis dans la table @@ -191,12 +192,14 @@ sensibilité avec la version correspondant à la nouvelle version de Taxref. Voir . -![image](images/bdc_statut.png) +## MCD et cas de changements de taxons + +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/bdc_statut.png) -![image](images/update-taxref-cas-1.jpg) +![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-1.jpg) -![image](images/update-taxref-cas-2.jpg) +![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-2.jpg) -![image](images/update-taxref-cas-3.jpg) +![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-3.jpg) -![image](images/update-taxref-cas-4.jpg) \ No newline at end of file +![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-4.jpg) From 33d1191441ffc88e8a9127e68e305075fcf9d802 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 10:03:58 +0100 Subject: [PATCH 13/22] Update index.rst --- docs/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 51cef2a6..475ac5e3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,7 +8,7 @@ Bienvenue dans la doc de TaxHub manuel-utilisateur manuel-administrateur developpement - update_taxref_version + update-taxref-version changelog Contributeurs @@ -18,4 +18,4 @@ Contributeurs :limit: 100 :avatars: :exclude: dependabot[bot] - :contributions: \ No newline at end of file + :contributions: From a02c63234ec8d88e2312212ffdbce49881320957 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 10:08:10 +0100 Subject: [PATCH 14/22] Update update-taxref-version.md / Fix images URL --- docs/update-taxref-version.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/update-taxref-version.md b/docs/update-taxref-version.md index 954e01a6..73e705c1 100644 --- a/docs/update-taxref-version.md +++ b/docs/update-taxref-version.md @@ -196,10 +196,10 @@ Taxref. Voir ![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/bdc_statut.png) -![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-1.jpg) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/update-taxref-cas-1.jpg) -![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-2.jpg) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/update-taxref-cas-2.jpg) -![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-3.jpg) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/update-taxref-cas-3.jpg) -![image](https://github.com/PnX-SI/TaxHub/blob/master/docs/images/update-taxref-cas-4.jpg) +![image](https://media.githubusercontent.com/media/PnX-SI/TaxHub/master/docs/images/update-taxref-cas-4.jpg) From 18b662f9a4071e4336f639dfc4003542e485c5d3 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Wed, 30 Oct 2024 10:09:36 +0100 Subject: [PATCH 15/22] Update manuel-administrateur.md --- docs/manuel-administrateur.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/manuel-administrateur.md b/docs/manuel-administrateur.md index 78e8e206..73b6a9cd 100644 --- a/docs/manuel-administrateur.md +++ b/docs/manuel-administrateur.md @@ -13,15 +13,13 @@ Pour spécifier les taxons à traiter la commande prend comme paramètre un fichier CSV contenant une liste de cd_nom -Des scripts d'intégration - ## Mise à jour de Taxref Un ensemble de commandes permettent de réaliser un changement de version de Taxref. La documentation détaillée est accessible ici : - + ## Gestion des permissions From a78dd8dfb440aa5bf1e8cd0871bbe4e190762ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Thu, 5 Dec 2024 09:31:11 +0100 Subject: [PATCH 16/22] feat(db): optimize vm_taxref_tree (#587) * optimize vm_taxref_tree * Update changelog.md --------- Co-authored-by: Camille Monchicourt --- .../versions/3c4762751898_taxref_tree_v2.py | 90 +++++++++++++++++++ .../versions/83d7105edb76_taxref_tree.py | 77 ---------------- .../versions/83d7105edb76_taxref_tree_v1.py | 25 ++++++ docs/changelog.md | 5 ++ 4 files changed, 120 insertions(+), 77 deletions(-) create mode 100644 apptax/migrations/versions/3c4762751898_taxref_tree_v2.py delete mode 100644 apptax/migrations/versions/83d7105edb76_taxref_tree.py create mode 100644 apptax/migrations/versions/83d7105edb76_taxref_tree_v1.py diff --git a/apptax/migrations/versions/3c4762751898_taxref_tree_v2.py b/apptax/migrations/versions/3c4762751898_taxref_tree_v2.py new file mode 100644 index 00000000..6345caa0 --- /dev/null +++ b/apptax/migrations/versions/3c4762751898_taxref_tree_v2.py @@ -0,0 +1,90 @@ +"""create vm_taxref_tree v2 + +Revision ID: 3c4762751898 +Revises: 83d7105edb76 +Create Date: 2024-12-03 13:30:26.521216 + +""" + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "3c4762751898" +down_revision = "83d7105edb76" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute("DROP MATERIALIZED VIEW IF EXISTS taxonomie.vm_taxref_tree") + op.execute( + """ + CREATE MATERIALIZED VIEW taxonomie.vm_taxref_tree AS + WITH RECURSIVE + biota AS ( + SELECT + t.cd_nom, + t.cd_ref::TEXT::ltree AS path + FROM + taxonomie.taxref t + WHERE + t.cd_nom = 349525 + UNION ALL + SELECT + child.cd_nom AS cd_nom, + parent.path || child.cd_ref::TEXT AS path + FROM + taxonomie.taxref child + JOIN + taxonomie.taxref child_ref ON child.cd_ref = child_ref.cd_nom + JOIN + biota parent ON parent.cd_nom = child_ref.cd_sup + ), + orphans AS ( + SELECT + t.cd_nom, + t.cd_ref::TEXT::ltree AS path + FROM + taxonomie.taxref t + JOIN + taxonomie.taxref t_ref ON t.cd_ref = t_ref.cd_nom + LEFT JOIN + taxonomie.taxref parent ON t_ref.cd_sup = parent.cd_nom AND parent.cd_nom != t_ref.cd_nom + WHERE + parent.cd_nom IS NULL + ) + SELECT + cd_nom, + path + FROM + biota + UNION DISTINCT -- do not include biota twice + SELECT + cd_nom, + path + FROM + orphans + WITH DATA; + """ + ) + op.create_index( + index_name="taxref_tree_cd_nom_idx", + schema="taxonomie", + table_name="vm_taxref_tree", + columns=["cd_nom"], + unique=True, + ) + # required for these operators: <, <=, =, >=, >, @>, <@, @, ~, ? + op.create_index( + index_name="taxref_tree_path_idx", + schema="taxonomie", + table_name="vm_taxref_tree", + columns=["path"], + postgresql_using="gist", + ) + + +def downgrade(): + op.execute("DROP MATERIALIZED VIEW taxonomie.vm_taxref_tree") diff --git a/apptax/migrations/versions/83d7105edb76_taxref_tree.py b/apptax/migrations/versions/83d7105edb76_taxref_tree.py deleted file mode 100644 index caab1a5f..00000000 --- a/apptax/migrations/versions/83d7105edb76_taxref_tree.py +++ /dev/null @@ -1,77 +0,0 @@ -"""create vm_taxref_tree - -Revision ID: 83d7105edb76 -Revises: 44447746cacc -Create Date: 2024-10-05 17:40:11.302423 - -""" - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "83d7105edb76" -down_revision = "6a20cd1055ec" -branch_labels = None -depends_on = None - - -def upgrade(): - op.execute( - """ - CREATE MATERIALIZED VIEW taxonomie.vm_taxref_tree AS - WITH RECURSIVE childs AS ( - SELECT - t.cd_nom, - t.cd_ref::TEXT::ltree AS path, - 1 AS path_length, - t_ref.cd_sup AS cd_sup - FROM - taxonomie.taxref t - JOIN taxonomie.taxref t_ref ON - t.cd_ref = t_ref.cd_nom - UNION ALL - SELECT - child.cd_nom AS cd_nom, - parent.cd_ref::TEXT || child.path AS path, - child.path_length + 1 AS path_length, - parent_ref.cd_sup AS cd_sup - FROM - childs child - JOIN taxonomie.taxref parent ON - child.cd_sup = parent.cd_nom - JOIN taxonomie.taxref parent_ref ON - parent.cd_ref = parent_ref.cd_nom - ) - SELECT - DISTINCT ON - (cd_nom) cd_nom, - path - FROM - childs - ORDER BY - cd_nom, - path_length DESC - WITH DATA; - """ - ) - op.create_index( - index_name="taxref_tree_cd_nom_idx", - schema="taxonomie", - table_name="vm_taxref_tree", - columns=["cd_nom"], - unique=True, - ) - # required for these operators: <, <=, =, >=, >, @>, <@, @, ~, ? - op.create_index( - index_name="taxref_tree_path_idx", - schema="taxonomie", - table_name="vm_taxref_tree", - columns=["path"], - postgresql_using="gist", - ) - - -def downgrade(): - op.execute("DROP MATERIALIZED VIEW taxonomie.vm_taxref_tree") diff --git a/apptax/migrations/versions/83d7105edb76_taxref_tree_v1.py b/apptax/migrations/versions/83d7105edb76_taxref_tree_v1.py new file mode 100644 index 00000000..386bdcfd --- /dev/null +++ b/apptax/migrations/versions/83d7105edb76_taxref_tree_v1.py @@ -0,0 +1,25 @@ +"""create vm_taxref_tree v1 + +Revision ID: 83d7105edb76 +Revises: 44447746cacc +Create Date: 2024-10-05 17:40:11.302423 + +""" + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "83d7105edb76" +down_revision = "6a20cd1055ec" +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + op.execute("DROP MATERIALIZED VIEW IF EXISTS taxonomie.vm_taxref_tree") diff --git a/docs/changelog.md b/docs/changelog.md index c013dcdf..67867491 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,10 @@ # CHANGELOG +2.0.1 (unreleased) +------------------ + +- Optimisation de la VM `vm_taxref_tree` pour en améliorer les performances et gérer les cas où des taxons locaux ont été ajoutés à la table `taxref` (#587) + 2.0.0 (2024-10-29) ------------------ From 120dd42fec6d18b34fcb85738002cb93bcb097c0 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Fri, 6 Dec 2024 10:21:02 +0100 Subject: [PATCH 17/22] Changelog 2.0.1 --- docs/changelog.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 67867491..514e47f9 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,9 +1,12 @@ # CHANGELOG -2.0.1 (unreleased) +2.0.1 (2024-12-06) ------------------ -- Optimisation de la VM `vm_taxref_tree` pour en améliorer les performances et gérer les cas où des taxons locaux ont été ajoutés à la table `taxref` (#587) +- Optimisation de la VM `vm_taxref_tree` pour en améliorer les performances et gérer différents cas où des taxons locaux ont été ajoutés à la table `taxref` (#587) +- Ajout d'une route `/tmedias/types/` renvoyant la liste des types de médias (#588) +- Amélioration des performances de la route `/biblistes/` (#584) +- Ajout de la possibilité de filtrer la route `/taxref/` par une liste de cd_nom (#581) 2.0.0 (2024-10-29) ------------------ From 85f5645015bcfc601daa54979aa8c91cf229af18 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Fri, 6 Dec 2024 10:24:34 +0100 Subject: [PATCH 18/22] Changelog 2.1.0 - complements --- docs/changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index 514e47f9..b4d72d46 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,8 +1,10 @@ # CHANGELOG -2.0.1 (2024-12-06) +2.1.0 (2024-12-06) ------------------ +**🚀 Nouveautés** + - Optimisation de la VM `vm_taxref_tree` pour en améliorer les performances et gérer différents cas où des taxons locaux ont été ajoutés à la table `taxref` (#587) - Ajout d'une route `/tmedias/types/` renvoyant la liste des types de médias (#588) - Amélioration des performances de la route `/biblistes/` (#584) From d02c8c3feff7e2d0185584c0a774aa762ce34a27 Mon Sep 17 00:00:00 2001 From: Amandine Date: Fri, 6 Dec 2024 11:37:02 +0100 Subject: [PATCH 19/22] Ajout route t_medias (#588) * Ajout route t_medias * Nom route + doc * Review developpement.md --------- Co-authored-by: Camille Monchicourt --- apptax/taxonomie/routestmedias.py | 17 +++++++++++++++-- apptax/tests/test_media.py | 16 ++++++++++++++++ docs/developpement.md | 15 +++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/apptax/taxonomie/routestmedias.py b/apptax/taxonomie/routestmedias.py index 2856444a..f8ae7bfb 100644 --- a/apptax/taxonomie/routestmedias.py +++ b/apptax/taxonomie/routestmedias.py @@ -5,8 +5,8 @@ from flask import json, Blueprint, request, current_app, send_file, abort -from .models import TMedias -from .schemas import TMediasSchema +from .models import TMedias, BibTypesMedia +from .schemas import TMediasSchema, BibTypesMediaSchema from .filemanager import FILEMANAGER @@ -29,6 +29,19 @@ def get_tmedias(id=None): return TMediasSchema().dump(medias, many=True) +@adresses.route("/types", methods=["GET"]) +@adresses.route("/types/", methods=["GET"]) +def get_type_tmedias(id=None): + """ + Liste des types de médias + """ + if id: + type_media = BibTypesMedia.query.get(id) + return BibTypesMediaSchema().dump(type_media) + types_media = BibTypesMedia.query.all() + return BibTypesMediaSchema().dump(types_media, many=True) + + @adresses.route("/bycdref/", methods=["GET"]) def get_tmediasbyTaxon(cd_ref): """ diff --git a/apptax/tests/test_media.py b/apptax/tests/test_media.py index d62b788c..69fb287a 100644 --- a/apptax/tests/test_media.py +++ b/apptax/tests/test_media.py @@ -15,6 +15,7 @@ AppUser, ) from pypnusershub.tests.utils import set_logged_user_cookie +from schema import Schema, Optional, Or from .fixtures import noms_example, attribut_example, liste @@ -40,6 +41,21 @@ def user(): @pytest.mark.usefixtures("client_class", "temporary_transaction") class TestAPIMedia: + + type_media_schema = Schema( + [{"desc_type_media": Or(None, str), "id_type": int, "nom_type_media": str}] + ) + + def test_get_type_tmedias(self): + response = self.client.get(url_for("t_media.get_type_tmedias")) + assert response.status_code == 200 + assert self.type_media_schema.is_valid(response.json) + + def test_get_type_tmedias_one(self): + response = self.client.get(url_for("t_media.get_type_tmedias", id=1)) + assert response.status_code == 200 + assert response.json["nom_type_media"] == "Photo_principale" + def test_get_tmediasbyTaxon(self, noms_example): response = self.client.get(url_for("t_media.get_tmediasbyTaxon", cd_ref=67111)) assert response.status_code == 200 diff --git a/docs/developpement.md b/docs/developpement.md index 35d0a6a6..d840a501 100644 --- a/docs/developpement.md +++ b/docs/developpement.md @@ -79,3 +79,18 @@ > Ces valeurs sont issues de la charte des codes couleurs pour les statuts Liste rouge, définis internationalement par l'Union internationale pour la conservation de la nature (UICN) \ > (page 55) + +## Médias + +- `/tmedias/thumbnail/` : Retourne un média redimensionné aux dimensions spécifiées (vignette) + - Params : + - id_media : identifiant du média + - h (defaut = 300) : hauteur souhaitée + - w (defaut = 400) : largeur souhaitée + - regenerate : force la régénération du fichier thumbnail +- `/tmedias/types` : Retourne la liste des types de médias +- `/tmedias/types/` : Retourne le détail d'un type de média +- `/tmedias/` : Retourne la liste de tous les médias de TaxHub + - Attention route non paginée et sans filtre, donc peut crasher si il y a beaucoup de médias +- `/tmedias/` : Retourne le détail d'un média +- `/tmedias/bycdref/` : Retourne la liste des médias associés à un taxon From 6c68e5d7eb92f6f88f5e2c56faa3180db970de6c Mon Sep 17 00:00:00 2001 From: Amandine Date: Fri, 6 Dec 2024 11:38:23 +0100 Subject: [PATCH 20/22] =?UTF-8?q?Biblistes=20:=20performance=20r=C3=A9cup?= =?UTF-8?q?=C3=A9ration=20nombre=20de=20taxons=20(#589)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: improve perf route biblistes - Load only necessary fields - Remove useless parameter id=None - Fix expression "nb_taxons" in BibListes model Reviewed-by: andriacap * Optimisation interface admin + tests --------- Co-authored-by: Andria Capai --- apptax/taxonomie/models.py | 10 +++++--- apptax/taxonomie/routesbiblistes.py | 37 ++++++++++++++++++----------- apptax/tests/fixtures.py | 9 ++++++- apptax/tests/test_biblistes.py | 22 ++++++++--------- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index ac7e2663..df62c506 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -261,13 +261,17 @@ class BibListes(db.Model): @hybrid_property def nb_taxons(self): - return len(self.noms) + return db.session.scalar( + select([db.func.count(cor_nom_liste.c.cd_nom)]).where( + cor_nom_liste.c.id_liste == self.id_liste + ) + ) @nb_taxons.expression def nb_taxons(cls): return ( - db.select([db.func.count(cor_nom_liste.id_liste)]) - .where(BibListes.id_liste == cls.id_liste) + db.select([db.func.count(cor_nom_liste.c.cd_nom)]) + .where(cor_nom_liste.c.id_liste == cls.id_liste) .label("nb_taxons") ) diff --git a/apptax/taxonomie/routesbiblistes.py b/apptax/taxonomie/routesbiblistes.py index 512764c9..f0652634 100644 --- a/apptax/taxonomie/routesbiblistes.py +++ b/apptax/taxonomie/routesbiblistes.py @@ -3,16 +3,13 @@ import os import logging -from flask import Blueprint, request, current_app -from sqlalchemy import func, or_ -from sqlalchemy.orm import joinedload +from flask import Blueprint +from sqlalchemy import select -from pypnusershub import routes as fnauth from utils_flask_sqla.response import json_resp -from . import filemanager from . import db -from .models import BibListes, Taxref +from .models import BibListes from apptax.taxonomie.schemas import BibListesSchema adresses = Blueprint("bib_listes", __name__) @@ -24,26 +21,38 @@ @adresses.route("/", methods=["GET"]) @json_resp -def get_biblistes(id=None): +def get_biblistes(): """ retourne les contenu de bib_listes dans "data" et le nombre d'enregistrements dans "count" """ - data = db.session.query(BibListes).all() + biblistes_records = db.session.execute( + select( + BibListes.id_liste, + BibListes.code_liste, + BibListes.nom_liste, + BibListes.desc_liste, + BibListes.nb_taxons, + BibListes.regne, + BibListes.group2_inpn, + ) + ).all() biblistes_schema = BibListesSchema() - maliste = {"data": [], "count": 0} - maliste["count"] = len(data) - maliste["data"] = biblistes_schema.dump(data, many=True) - return maliste + biblistes_infos = { + "data": biblistes_schema.dump(biblistes_records, many=True), + "count": len(biblistes_records), + } + + return biblistes_infos @adresses.route("/", methods=["GET"], defaults={"group2_inpn": None}) @adresses.route("//", methods=["GET"]) def get_biblistesbyTaxref(regne, group2_inpn): - q = db.session.query(BibListes) + q = select(BibListes) if regne: q = q.where(BibListes.regne == regne) if group2_inpn: q = q.where(BibListes.group2_inpn == group2_inpn) - results = q.all() + results = db.session.scalars(q).all() return BibListesSchema().dump(results, many=True) diff --git a/apptax/tests/fixtures.py b/apptax/tests/fixtures.py index e35103e7..aec6503f 100644 --- a/apptax/tests/fixtures.py +++ b/apptax/tests/fixtures.py @@ -95,7 +95,14 @@ def liste(): "code_liste": "TEST_LIST_Plantae", "nom_liste": "Liste test Plantae", "desc_liste": "Liste description", - "regne": "Plantea", + "regne": "Plantae", + }, + { + "code_liste": "TEST_LIST_Mousses", + "nom_liste": "Liste test Mousses", + "desc_liste": "Liste description", + "regne": "Plantae", + "group2_inpn": "Mousses", }, ] diff --git a/apptax/tests/test_biblistes.py b/apptax/tests/test_biblistes.py index 3e7c161f..784c293b 100644 --- a/apptax/tests/test_biblistes.py +++ b/apptax/tests/test_biblistes.py @@ -8,22 +8,13 @@ @pytest.mark.usefixtures("client_class", "temporary_transaction") class TestApiBibListe: - schema_cor_nom_liste = Schema( - { - "items": [{"cd_nom": int, "id_liste": int}], - "total": int, - "limit": int, - "page": int, - } - ) - schema_allnamebyListe = Schema( [ { "id_liste": int, "code_liste": str, "nom_liste": str, - "desc_liste": str, + "desc_liste": Or(str, None), "regne": Or(str, None), "group2_inpn": Or(str, None), "nb_taxons": int, @@ -31,7 +22,7 @@ class TestApiBibListe: ] ) - def test_get_biblistes(self): + def test_get_biblistes(self, listes): query_string = {"limit": 10} response = self.client.get( url_for( @@ -45,7 +36,6 @@ def test_get_biblistes(self): assert self.schema_allnamebyListe.is_valid(data["data"]) def test_get_biblistesbyTaxref(self, listes): - response = self.client.get( url_for("bib_listes.get_biblistesbyTaxref", regne="Animalia", group2_inpn=None), ) @@ -53,3 +43,11 @@ def test_get_biblistesbyTaxref(self, listes): data = [d for d in response.json if d["desc_liste"] == "Liste description"] self.schema_allnamebyListe.validate(data) assert len(data) == 1 + + response = self.client.get( + url_for("bib_listes.get_biblistesbyTaxref", regne="Plantae", group2_inpn="Mousses"), + ) + # Filter test list only + data = [d for d in response.json if d["desc_liste"] == "Liste description"] + self.schema_allnamebyListe.validate(data) + assert len(data) == 1 From bd41185a1fb647f1ef88557336d6cdc552c64d39 Mon Sep 17 00:00:00 2001 From: Amandine Date: Fri, 6 Dec 2024 11:39:03 +0100 Subject: [PATCH 21/22] Route taxref : filtre cd_nom valeur multiple (#590) * Route taxref : filtre cd_nom valeur multiple --- apptax/taxonomie/models.py | 9 ++++++++- apptax/taxonomie/routestaxref.py | 12 ++++++++++-- apptax/tests/test_taxref.py | 24 ++++++++++++++++++++++++ docs/developpement.md | 3 ++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index df62c506..d0b244d5 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -216,7 +216,14 @@ def where_id_liste(cls, id_liste, *, query): def where_params(cls, filters=None, *, query): for filter in filters: - if hasattr(Taxref, filter) and filters[filter] != "": + # Test empty values + if not filters[filter]: + continue + + if hasattr(Taxref, filter) and isinstance(filters[filter], list): + col = getattr(Taxref, filter) + query = query.filter(col.in_(tuple(filters[filter]))) + elif hasattr(Taxref, filter) and filters[filter] != "": col = getattr(Taxref, filter) query = query.filter(col == filters[filter]) elif filter == "is_ref" and filters[filter] == "true": diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index 8a46e45a..a31088c3 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -162,10 +162,18 @@ def get_taxref_list(): limit = request.values.get("limit", 20, int) page = request.values.get("page", 1, int) id_liste = None + cd_nom = None + if "id_liste" in request.values: - id_liste = request.values.get("id_liste").split(",") + id_liste = ( + request.values.get("id_liste").split(",") if request.values.get("id_liste") else None + ) + if "cd_nom" in request.values: + cd_nom = request.values.get("cd_nom").split(",") if request.values.get("cd_nom") else None + fields = request.values.get("fields", type=str, default=[]) parameters = request.values.to_dict() + parameters["cd_nom"] = cd_nom dump_options = {} if fields: @@ -178,10 +186,10 @@ def get_taxref_list(): joinedload_when_attributs = get_joinedload_when_attributs(fields=fields) query = Taxref.joined_load(fields).options(*joinedload_when_attributs) + query = Taxref.where_params(parameters, query=query) if id_liste and "-1" not in id_liste: query = Taxref.where_id_liste(id_liste, query=query) - count_filter = db.session.scalar( db.select(func.count()).select_from( Taxref.where_params(parameters, query=query), diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py index 7b4b8c16..fe78249d 100644 --- a/apptax/tests/test_taxref.py +++ b/apptax/tests/test_taxref.py @@ -305,3 +305,27 @@ def test_get_taxref_list(self, liste_with_names): assert response.status_code == 200 response_json = response.json assert len(response_json["items"]) == limit + + def test_get_taxref_list_filters_cd_noms(self): + # Test de la route taxref avec des filtres sur le cd_nom + # 1 cd_nom + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": 103536}, + ) + assert response.status_code == 200 + assert len(response.json["items"]) == 1 + + # Plusieurs cd_nom + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": "103536, 461885,2891"}, + ) + assert len(response.json["items"]) == 3 + + # Valeur vide + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": ""}, + ) + assert response.status_code == 200 diff --git a/docs/developpement.md b/docs/developpement.md index d840a501..eecaa88e 100644 --- a/docs/developpement.md +++ b/docs/developpement.md @@ -8,7 +8,8 @@ - limit (defaut = 50) : nombre d'éléments à retourner - page (defaut = 0) : page à retourner - is_ref (default = false) : ne retourne que les noms valides (cd_nom = cd_ref) - - id_liste + - id_liste : liste d'identifiant des listes + - cd_nom : liste de cd_nom - fields (permet de spécifier les champs renvoyés). Permet aussi de récupérer les données secondaires non renvoyées par défaut, en les spécifiant explicitement (`fields=status,rang,medias,attributs,synonymes,listes`) - nomColonne : Permet de filtrer From a1fd19d46d4d08d38af4f67f6b831c083e0071c3 Mon Sep 17 00:00:00 2001 From: amandine-sahl Date: Fri, 6 Dec 2024 11:42:12 +0100 Subject: [PATCH 22/22] Update VERSION --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 227cea21..7ec1d6db 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.0 +2.1.0