From abfdef0b69930236380913c45657b7497a29b168 Mon Sep 17 00:00:00 2001 From: amandine-sahl Date: Fri, 23 Jun 2023 16:34:46 +0200 Subject: [PATCH 1/3] Add table t_meta_taxref --- .../32c5ed42bdbd_add_table_t_meta_taxref.py | 53 +++++++++++++++++++ .../commands/migrate_taxref/commands_v15.py | 8 ++- .../commands/migrate_taxref/commands_v16.py | 8 ++- apptax/taxonomie/commands/taxref.py | 8 ++- apptax/taxonomie/commands/taxref_v15_v16.py | 5 +- apptax/taxonomie/commands/utils.py | 6 +++ apptax/taxonomie/models.py | 8 +++ apptax/taxonomie/routestaxref.py | 13 +++++ apptax/tests/test_taxref.py | 6 +++ apptax/tests/test_taxref_last_version.py | 10 ++-- 10 files changed, 115 insertions(+), 10 deletions(-) create mode 100644 apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py diff --git a/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py b/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py new file mode 100644 index 00000000..60031a6d --- /dev/null +++ b/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py @@ -0,0 +1,53 @@ +"""Add table: t_meta_taxref + +Revision ID: 32c5ed42bdbd +Revises: 3bd542b72955 +Create Date: 2023-06-23 15:51:00.031901 + +""" +import datetime +from alembic import op +from sqlalchemy import Column, Unicode, DateTime, func +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "32c5ed42bdbd" +down_revision = "3bd542b72955" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "t_meta_taxref", + Column("taxref_version", Unicode, primary_key=True), + Column("taxref_update_date", DateTime, server_default=func.now()), + schema="taxonomie", + ) + op.execute( + """ + WITH meta_taxref AS ( + SELECT 1019039 as max_cd_nom, 'TAXREF v16' AS taxref_version + UNION + SELECT 1002708 as max_cd_nom, 'TAXREF v15' AS taxref_version + UNION + SELECT 972486 as max_cd_nom, 'TAXREF v14' AS taxref_version + UNION + SELECT 935095 as max_cd_nom, 'TAXREF v13' AS taxref_version + UNION + SELECT 887126 as max_cd_nom, 'TAXREF v11' AS taxref_version + ) + INSERT INTO taxonomie.t_meta_taxref (taxref_version) + SELECT taxref_version + FROM taxonomie.taxref AS t + JOIN meta_taxref m + ON t.cd_nom = max_cd_nom + ORDER BY cd_nom DESC + LIMIT 1; + """ + ) + + +def downgrade(): + op.drop_table(table_name="t_meta_taxref", schema="taxonomie") diff --git a/apptax/taxonomie/commands/migrate_taxref/commands_v15.py b/apptax/taxonomie/commands/migrate_taxref/commands_v15.py index 2da8a52c..04811a2f 100644 --- a/apptax/taxonomie/commands/migrate_taxref/commands_v15.py +++ b/apptax/taxonomie/commands/migrate_taxref/commands_v15.py @@ -9,7 +9,12 @@ from utils_flask_sqla.migrations.utils import open_remote_file from apptax.database import db -from apptax.taxonomie.commands.utils import copy_from_csv, truncate_bdc_statuts, refresh_taxref_vm +from apptax.taxonomie.commands.utils import ( + copy_from_csv, + truncate_bdc_statuts, + refresh_taxref_vm, + insert_taxref_numversion, +) from apptax.taxonomie.commands.taxref_v15_v16 import import_bdc_statuts_v15 from .utils import save_data, analyse_taxref_changes from . import logger @@ -132,6 +137,7 @@ def apply_changes( logger.info("Refresh materialized views…") refresh_taxref_vm() + insert_taxref_numversion("15") db.session.commit() diff --git a/apptax/taxonomie/commands/migrate_taxref/commands_v16.py b/apptax/taxonomie/commands/migrate_taxref/commands_v16.py index f750e225..dbce52e0 100644 --- a/apptax/taxonomie/commands/migrate_taxref/commands_v16.py +++ b/apptax/taxonomie/commands/migrate_taxref/commands_v16.py @@ -9,7 +9,12 @@ from utils_flask_sqla.migrations.utils import open_remote_file from apptax.database import db -from apptax.taxonomie.commands.utils import copy_from_csv, truncate_bdc_statuts, refresh_taxref_vm +from apptax.taxonomie.commands.utils import ( + copy_from_csv, + truncate_bdc_statuts, + refresh_taxref_vm, + insert_taxref_numversion, +) from apptax.taxonomie.commands.taxref_v15_v16 import import_bdc_statuts_v16 from .utils import save_data, analyse_taxref_changes from . import logger @@ -132,6 +137,7 @@ def apply_changes( logger.info("Refresh materialized views…") refresh_taxref_vm() + insert_taxref_numversion("16") db.session.commit() diff --git a/apptax/taxonomie/commands/taxref.py b/apptax/taxonomie/commands/taxref.py index f0966344..08e3df83 100644 --- a/apptax/taxonomie/commands/taxref.py +++ b/apptax/taxonomie/commands/taxref.py @@ -2,7 +2,7 @@ from flask.cli import with_appcontext from apptax.database import db -from apptax.taxonomie.models import Taxref, TaxrefBdcStatutText +from apptax.taxonomie.models import Taxref, TaxrefBdcStatutText, TMetaTaxref from .utils import truncate_bdc_statuts from .taxref_v14 import import_v14, import_bdc_v14 @@ -27,6 +27,12 @@ def taxref(): @with_appcontext def info(): click.echo("TaxRef :") + taxref_version = ( + db.session.query(TMetaTaxref).order_by(TMetaTaxref.taxref_update_date.desc()).scalar() + ) + click.echo( + f"\tVersion de taxref : {taxref_version.taxref_version} ({taxref_version.taxref_update_date})" + ) taxref_count = db.session.query(Taxref.cd_nom).count() click.echo(f"\tNombre de taxons : {taxref_count}") status_count = db.session.query(TaxrefBdcStatutText.id_text).count() diff --git a/apptax/taxonomie/commands/taxref_v15_v16.py b/apptax/taxonomie/commands/taxref_v15_v16.py index a7a3be15..ecee62ef 100644 --- a/apptax/taxonomie/commands/taxref_v15_v16.py +++ b/apptax/taxonomie/commands/taxref_v15_v16.py @@ -17,8 +17,9 @@ import_bdc_statuts, populate_bdc_statut_cor_text_area, populate_enable_bdc_statut_text, + insert_taxref_numversion, ) -from apptax.taxonomie.models import Taxref +from apptax.taxonomie.models import Taxref, TMetaTaxref base_url = "http://geonature.fr/data/inpn/taxonomie/" @@ -129,6 +130,8 @@ def import_taxref(logger, num_version, taxref_archive_name, taxref_file_name): "url", ), ) + insert_taxref_numversion(num_version) + db.session.commit() @click.command() diff --git a/apptax/taxonomie/commands/utils.py b/apptax/taxonomie/commands/utils.py index 791a6e27..fbaf04fc 100644 --- a/apptax/taxonomie/commands/utils.py +++ b/apptax/taxonomie/commands/utils.py @@ -10,6 +10,7 @@ from utils_flask_sqla.migrations.utils import open_remote_file from apptax.database import db +from apptax.taxonomie.models import TMetaTaxref def import_bdc_statuts(logger, base_url, zipfile, status_types_file, status_file): @@ -296,3 +297,8 @@ def copy_from_csv( """ ) table.drop(bind=db.session.connection()) + + +def insert_taxref_numversion(num_version): + taxref_version = TMetaTaxref(taxref_version=f"TAXREF v{num_version}") + db.session.add(taxref_version) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index 8cc3315b..e4350979 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -444,3 +444,11 @@ class VBdcStatus(db.Model): full_citation = db.Column(db.Unicode, primary_key=True) doc_url = db.Column(db.Unicode) type_value = db.Column(db.Unicode) + + +@serializable +class TMetaTaxref(db.Model): + __tablename__ = "t_meta_taxref" + __table_args__ = {"schema": "taxonomie"} + taxref_version = db.Column(db.Unicode, primary_key=True) + taxref_update_date = db.Column(db.DateTime, default=db.func.now(), nullable=False) diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index 71b8720a..6d3046f3 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -18,6 +18,7 @@ BibTaxrefHabitats, CorNomListe, BibListes, + TMetaTaxref, ) from .repositories import BdcStatusRepository @@ -38,6 +39,18 @@ def getTaxrefList(): return genericTaxrefList(False, request.args) +@adresses.route("/version", methods=["GET"]) +@json_resp +def getTaxrefVersion(): + """ + Retourne la version de taxref ainsi que ça date de mise à jour + """ + taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.taxref_update_date.desc()).scalar() + if not taxref_version: + return {"msg": "Table t_meta_taxref non peulplée"}, 500 + return taxref_version.as_dict() + + @adresses.route("/bibnoms/", methods=["GET"]) @json_resp def getTaxrefBibtaxonList(): diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py index 71b8b579..390b8d0f 100644 --- a/apptax/tests/test_taxref.py +++ b/apptax/tests/test_taxref.py @@ -1,4 +1,5 @@ import pytest +import json from flask import url_for from schema import Schema, Optional, Or @@ -102,3 +103,8 @@ def test_regneGroup2Inpn_routes(self): def test_bib_routes(self): response = self.client.get(url_for("taxref.get_bib_hab")) assert response.status_code == 200 + + def test_taxrefversion_routes(self): + response = self.client.get(url_for("taxref.getTaxrefVersion")) + assert response.status_code == 200 + assert json.loads(response.data)["taxref_version"] == "TAXREF v16" diff --git a/apptax/tests/test_taxref_last_version.py b/apptax/tests/test_taxref_last_version.py index 22924009..b694f0e3 100644 --- a/apptax/tests/test_taxref_last_version.py +++ b/apptax/tests/test_taxref_last_version.py @@ -4,7 +4,7 @@ pytestmark = pytest.mark.skipif(os.environ.get("CI") != "true", reason="Test for CI only") -from apptax.taxonomie.models import Taxref, TaxrefBdcStatutText +from apptax.taxonomie.models import Taxref, TaxrefBdcStatutText, TMetaTaxref from apptax.taxonomie.commands.utils import populate_enable_bdc_statut_text @@ -40,8 +40,6 @@ def test_enable_bdc_statut(self): nb_bdc_texts = TaxrefBdcStatutText.query.filter(TaxrefBdcStatutText.enable == True).count() assert nb_bdc_texts == 194 - def test_link_bdc_statut_to_areas(self): - text_barc = TaxrefBdcStatutText.query.filter( - TaxrefBdcStatutText.cd_type_statut == "BARC" - ).scalar() - assert len(text_barc.areas) == 96 + def test_taxref_version(self): + taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.taxref_update_date.desc()).scalar() + assert taxref_version.taxref_version == "TAXREF v16" From 05067802d304a99f1886ff371d385d176ce86fb2 Mon Sep 17 00:00:00 2001 From: Camille Monchicourt Date: Sat, 24 Jun 2023 10:26:01 +0200 Subject: [PATCH 2/3] routestaxref.py - Fix help typos --- apptax/taxonomie/routestaxref.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index 6d3046f3..b2dcc248 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -43,11 +43,11 @@ def getTaxrefList(): @json_resp def getTaxrefVersion(): """ - Retourne la version de taxref ainsi que ça date de mise à jour + Retourne la version de Taxref ainsi que sa date de dernière mise à jour """ taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.taxref_update_date.desc()).scalar() if not taxref_version: - return {"msg": "Table t_meta_taxref non peulplée"}, 500 + return {"msg": "Table t_meta_taxref non peuplée"}, 500 return taxref_version.as_dict() @@ -62,11 +62,11 @@ def getSearchInField(field, ilike): """.. http:get:: /taxref/search/(str:field)/(str:ilike) .. :quickref: Taxref; - Retourne les 20 premiers résultat de la table "taxref" pour une + Retourne les 20 premiers résultats de la table "taxref" pour une requête sur le champ `field` avec ILIKE et la valeur `ilike` fournie. L'algorithme Trigramme est utilisé pour établir la correspondance. - :query fields: Permet de récupérer des champs suplémentaire de la + :query fields: Permet de récupérer des champs suplémentaires de la table "taxref" dans la réponse. Séparer les noms des champs par des virgules. :query is_inbibnom: Ajoute une jointure sur la table "bib_noms". @@ -308,8 +308,8 @@ def genericHierarchieSelect(tableHierarchy, rang, parameters): @json_resp def get_regneGroup2Inpn_taxref(): """ - Retourne la liste des règne et groupe 2 - défini par taxref de façon hiérarchique + Retourne la liste des règnes et groupes 2 + définis par Taxref de façon hiérarchique formatage : {'regne1':['grp1', 'grp2'], 'regne2':['grp3', 'grp4']} """ q = ( @@ -335,16 +335,16 @@ def get_AllTaxrefNameByListe(code_liste=None): """ Route utilisée pour les autocompletes Si le paramètre search_name est passé, la requête SQL utilise l'algorithme - des trigrames pour améliorer la pertinence des résultats - Route utilisé par le mobile pour remonter la liste des taxons + des trigrammes pour améliorer la pertinence des résultats + Route utilisée par le mobile pour remonter la liste des taxons params URL: - - code_liste : code de la liste (si id liste est null ou = à -1 on ne prend pas de liste) + - code_liste : code de la liste (si id_liste est null ou = à -1 on ne prend pas de liste) params GET (facultatifs): - - search_name : nom recherché. Recherche basé sur la fonction - ilike de sql avec un remplacement des espaces par % - - regne : filtre sur le regne INPN + - search_name : nom recherché. Recherche basée sur la fonction + ilike de SQL avec un remplacement des espaces par % + - regne : filtre sur le règne INPN - group2_inpn : filtre sur le groupe 2 de l'INPN - - limit: nombre de résultat + - limit: nombre de résultats - offset: numéro de la page """ # Traitement des cas ou code_liste = -1 @@ -363,7 +363,7 @@ def get_AllTaxrefNameByListe(code_liste=None): # Get id_liste try: - # S'il y a une id_liste elle à forcement la valeur -1 + # S'il y a un id_liste elle a forcement la valeur -1 # c-a-d pas de liste if not id_liste: q = ( @@ -399,7 +399,7 @@ def get_AllTaxrefNameByListe(code_liste=None): q = q.order_by( desc(VMTaxrefListForautocomplete.cd_nom == VMTaxrefListForautocomplete.cd_ref) ) - # if no search name no need to order by trigram or cd_nom=cdref - order by PK (use for mobile app) + # if no search name, no need to order by trigram or cd_nom=cdref - order by PK (used for mobile app) else: q = q.order_by(VMTaxrefListForautocomplete.gid) From debd9f867c3c765202425eabea0c187cadeaf601 Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Fri, 30 Jun 2023 17:26:27 +0200 Subject: [PATCH 3/3] change t_meta_taxref modelisation --- .../32c5ed42bdbd_add_table_t_meta_taxref.py | 21 ++++++++++--------- .../commands/migrate_taxref/commands_v15.py | 2 +- .../commands/migrate_taxref/commands_v16.py | 2 +- apptax/taxonomie/commands/utils.py | 2 +- apptax/taxonomie/models.py | 5 +++-- apptax/taxonomie/routestaxref.py | 6 ++++-- apptax/tests/test_taxref.py | 2 +- apptax/tests/test_taxref_last_version.py | 4 ++-- 8 files changed, 24 insertions(+), 20 deletions(-) diff --git a/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py b/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py index 60031a6d..ab644679 100644 --- a/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py +++ b/apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py @@ -7,7 +7,7 @@ """ import datetime from alembic import op -from sqlalchemy import Column, Unicode, DateTime, func +from sqlalchemy import Column, Unicode, DateTime, Integer, func import sqlalchemy as sa @@ -21,25 +21,26 @@ def upgrade(): op.create_table( "t_meta_taxref", - Column("taxref_version", Unicode, primary_key=True), - Column("taxref_update_date", DateTime, server_default=func.now()), + Column("referencial_name", Unicode, primary_key=True), + Column("version", Integer, primary_key=True), + Column("update_date", DateTime, server_default=func.now()), schema="taxonomie", ) op.execute( """ WITH meta_taxref AS ( - SELECT 1019039 as max_cd_nom, 'TAXREF v16' AS taxref_version + SELECT 1019039 as max_cd_nom, 16 AS taxref_version UNION - SELECT 1002708 as max_cd_nom, 'TAXREF v15' AS taxref_version + SELECT 1002708 as max_cd_nom, 15 AS taxref_version UNION - SELECT 972486 as max_cd_nom, 'TAXREF v14' AS taxref_version + SELECT 972486 as max_cd_nom, 14 AS taxref_version UNION - SELECT 935095 as max_cd_nom, 'TAXREF v13' AS taxref_version + SELECT 935095 as max_cd_nom, 13 AS taxref_version UNION - SELECT 887126 as max_cd_nom, 'TAXREF v11' AS taxref_version + SELECT 887126 as max_cd_nom, 11 AS taxref_version ) - INSERT INTO taxonomie.t_meta_taxref (taxref_version) - SELECT taxref_version + INSERT INTO taxonomie.t_meta_taxref (referencial_name, version) + SELECT 'taxref', taxref_version FROM taxonomie.taxref AS t JOIN meta_taxref m ON t.cd_nom = max_cd_nom diff --git a/apptax/taxonomie/commands/migrate_taxref/commands_v15.py b/apptax/taxonomie/commands/migrate_taxref/commands_v15.py index 04811a2f..e88c096b 100644 --- a/apptax/taxonomie/commands/migrate_taxref/commands_v15.py +++ b/apptax/taxonomie/commands/migrate_taxref/commands_v15.py @@ -137,7 +137,7 @@ def apply_changes( logger.info("Refresh materialized views…") refresh_taxref_vm() - insert_taxref_numversion("15") + insert_taxref_numversion(15) db.session.commit() diff --git a/apptax/taxonomie/commands/migrate_taxref/commands_v16.py b/apptax/taxonomie/commands/migrate_taxref/commands_v16.py index dbce52e0..c64b7524 100644 --- a/apptax/taxonomie/commands/migrate_taxref/commands_v16.py +++ b/apptax/taxonomie/commands/migrate_taxref/commands_v16.py @@ -137,7 +137,7 @@ def apply_changes( logger.info("Refresh materialized views…") refresh_taxref_vm() - insert_taxref_numversion("16") + insert_taxref_numversion(16) db.session.commit() diff --git a/apptax/taxonomie/commands/utils.py b/apptax/taxonomie/commands/utils.py index fbaf04fc..5e42cc5d 100644 --- a/apptax/taxonomie/commands/utils.py +++ b/apptax/taxonomie/commands/utils.py @@ -300,5 +300,5 @@ def copy_from_csv( def insert_taxref_numversion(num_version): - taxref_version = TMetaTaxref(taxref_version=f"TAXREF v{num_version}") + taxref_version = TMetaTaxref(referencial_name="Taxref", version=num_version) db.session.add(taxref_version) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index e4350979..f3a6667a 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -450,5 +450,6 @@ class VBdcStatus(db.Model): class TMetaTaxref(db.Model): __tablename__ = "t_meta_taxref" __table_args__ = {"schema": "taxonomie"} - taxref_version = db.Column(db.Unicode, primary_key=True) - taxref_update_date = db.Column(db.DateTime, default=db.func.now(), nullable=False) + referencial_name = db.Column(db.Integer, primary_key=True) + version = db.Column(db.Integer) + update_date = db.Column(db.DateTime, default=db.func.now(), nullable=False) diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index b2dcc248..c8442ff9 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -43,9 +43,11 @@ def getTaxrefList(): @json_resp def getTaxrefVersion(): """ - Retourne la version de Taxref ainsi que sa date de dernière mise à jour + La table TMetaTaxref contient la liste des référentiels contenu dans la table taxref + Cette route renvoie le dernier référentiel qui a été MAJ + (utilisé pour le mobile pour retélécharger le référentiel lorsque celui ci à changé ou en MAJ) """ - taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.taxref_update_date.desc()).scalar() + taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.update_date.desc()).first() if not taxref_version: return {"msg": "Table t_meta_taxref non peuplée"}, 500 return taxref_version.as_dict() diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py index 390b8d0f..5d551db3 100644 --- a/apptax/tests/test_taxref.py +++ b/apptax/tests/test_taxref.py @@ -107,4 +107,4 @@ def test_bib_routes(self): def test_taxrefversion_routes(self): response = self.client.get(url_for("taxref.getTaxrefVersion")) assert response.status_code == 200 - assert json.loads(response.data)["taxref_version"] == "TAXREF v16" + assert json.loads(response.data)["version"] == 16 diff --git a/apptax/tests/test_taxref_last_version.py b/apptax/tests/test_taxref_last_version.py index b694f0e3..91581989 100644 --- a/apptax/tests/test_taxref_last_version.py +++ b/apptax/tests/test_taxref_last_version.py @@ -41,5 +41,5 @@ def test_enable_bdc_statut(self): assert nb_bdc_texts == 194 def test_taxref_version(self): - taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.taxref_update_date.desc()).scalar() - assert taxref_version.taxref_version == "TAXREF v16" + taxref_version = TMetaTaxref.query.order_by(TMetaTaxref.update_date.desc()).scalar() + assert taxref_version.version == 16