Skip to content

Commit

Permalink
Merge pull request #411 from PnX-SI/develop
Browse files Browse the repository at this point in the history
Develop > Master / Release 1.12.0
  • Loading branch information
camillemonchicourt authored Jul 11, 2023
2 parents 18786e6 + 1f9b70b commit 368fc1f
Show file tree
Hide file tree
Showing 21 changed files with 239 additions and 65 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.11.3
1.12.0
54 changes: 54 additions & 0 deletions apptax/migrations/versions/32c5ed42bdbd_add_table_t_meta_taxref.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""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, Integer, 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("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, 16 AS taxref_version
UNION
SELECT 1002708 as max_cd_nom, 15 AS taxref_version
UNION
SELECT 972486 as max_cd_nom, 14 AS taxref_version
UNION
SELECT 935095 as max_cd_nom, 13 AS taxref_version
UNION
SELECT 887126 as max_cd_nom, 11 AS 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
ORDER BY cd_nom DESC
LIMIT 1;
"""
)


def downgrade():
op.drop_table(table_name="t_meta_taxref", schema="taxonomie")
8 changes: 7 additions & 1 deletion apptax/taxonomie/commands/migrate_taxref/commands_v15.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -132,6 +137,7 @@ def apply_changes(
logger.info("Refresh materialized views…")
refresh_taxref_vm()

insert_taxref_numversion(15)
db.session.commit()


Expand Down
8 changes: 7 additions & 1 deletion apptax/taxonomie/commands/migrate_taxref/commands_v16.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -132,6 +137,7 @@ def apply_changes(
logger.info("Refresh materialized views…")
refresh_taxref_vm()

insert_taxref_numversion(16)
db.session.commit()


Expand Down
8 changes: 7 additions & 1 deletion apptax/taxonomie/commands/taxref.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down
5 changes: 4 additions & 1 deletion apptax/taxonomie/commands/taxref_v15_v16.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/"
Expand Down Expand Up @@ -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()
Expand Down
6 changes: 6 additions & 0 deletions apptax/taxonomie/commands/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -331,3 +332,8 @@ def copy_from_csv(
"""
)
table.drop(bind=db.session.connection())


def insert_taxref_numversion(num_version):
taxref_version = TMetaTaxref(referencial_name="Taxref", version=num_version)
db.session.add(taxref_version)
9 changes: 9 additions & 0 deletions apptax/taxonomie/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,3 +444,12 @@ 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"}
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)
23 changes: 22 additions & 1 deletion apptax/taxonomie/routesbiblistes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from flask import Blueprint, request, current_app
from sqlalchemy import func, or_
from sqlalchemy.orm import joinedload

from pypnusershub import routes as fnauth

Expand Down Expand Up @@ -161,7 +162,6 @@ def getNoms_bibtaxons(idliste):
q = q.filter(or_(Taxref.group2_inpn == group2_inpn))

subq = db.session.query(CorNomListe.id_nom).filter(CorNomListe.id_liste == idliste).subquery()

if parameters.get("existing"):
q = q.join(subq, subq.c.id_nom == BibNoms.id_nom)
else:
Expand Down Expand Up @@ -223,6 +223,27 @@ def getNoms_bibtaxons(idliste):
}


@adresses.route("/cor_nom_liste", methods=["GET"])
@json_resp
def get_cor_nom_liste():
limit = request.args.get("limit", 20, int)
page = request.args.get("page", 1, int)
q = CorNomListe.query.options(joinedload("bib_nom"))
total = q.count()
results = q.paginate(page=page, per_page=limit, error_out=False)
items = []
for r in results.items:
cor_nom_list_dict = r.as_dict(relationships=("bib_nom",), exclude=("id_nom",))
bib_nom = cor_nom_list_dict.pop("bib_nom")
items.append(dict(cor_nom_list_dict, cd_nom=bib_nom["cd_nom"]))
return {
"items": items,
"total": total,
"limit": limit,
"page": page,
}


# POST - Ajouter les noms à une liste
@adresses.route("/addnoms/<int:idliste>", methods=["POST"])
@json_resp
Expand Down
41 changes: 28 additions & 13 deletions apptax/taxonomie/routestaxref.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
BibTaxrefHabitats,
CorNomListe,
BibListes,
TMetaTaxref,
)

from .repositories import BdcStatusRepository
Expand All @@ -38,6 +39,20 @@ def getTaxrefList():
return genericTaxrefList(False, request.args)


@adresses.route("/version", methods=["GET"])
@json_resp
def getTaxrefVersion():
"""
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.update_date.desc()).first()
if not taxref_version:
return {"msg": "Table t_meta_taxref non peuplée"}, 500
return taxref_version.as_dict()


@adresses.route("/bibnoms/", methods=["GET"])
@json_resp
def getTaxrefBibtaxonList():
Expand All @@ -49,11 +64,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".
Expand Down Expand Up @@ -295,8 +310,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 = (
Expand All @@ -322,16 +337,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
Expand All @@ -350,7 +365,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 = (
Expand Down Expand Up @@ -386,7 +401,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)

Expand Down
27 changes: 27 additions & 0 deletions apptax/tests/test_biblistes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import pytest

from flask import url_for

from .fixtures import *
from schema import Schema, Optional, Or


@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,
}
)

def test_cor_nom_liste(self, noms_example):
response = self.client.get(
url_for("bib_listes.get_cor_nom_liste"),
)
assert response.status_code == 200
data = response.json
assert len(data["items"]) > 0
self.schema_cor_nom_liste.validate(data)
6 changes: 6 additions & 0 deletions apptax/tests/test_taxref.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
import json

from flask import url_for
from schema import Schema, Optional, Or
Expand Down Expand Up @@ -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)["version"] == 16
10 changes: 4 additions & 6 deletions apptax/tests/test_taxref_last_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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.update_date.desc()).scalar()
assert taxref_version.version == 16
Loading

0 comments on commit 368fc1f

Please sign in to comment.