From d4021d2f9a81fb2c330bc848eb156d98192bcc52 Mon Sep 17 00:00:00 2001 From: amandine-sahl Date: Thu, 9 Nov 2023 18:02:50 +0100 Subject: [PATCH] Use taxref as main table for /names --- apptax/taxonomie/models.py | 2 -- apptax/taxonomie/routestaxref.py | 33 ++++++++---------------------- apptax/tests/test_taxref.py | 35 +++++++++++++++++++------------- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index 3cb4ae0f..a95c89c8 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -242,8 +242,6 @@ class VMTaxrefListForautocomplete(db.Model): group2_inpn = db.Column(db.Unicode) group3_inpn = db.Column(db.Unicode) - taxon = db.relationship("Taxref") - def __repr__(self): return "" % self.search_name diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index 8176ceb9..86610d19 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -458,11 +458,9 @@ def get_bib_hab(): @json_resp def get_names(): """ - Route utilisée pour retourner les résultats de taxref avec autocompletes + Route utilisée pour retourner les résultats de taxref params GET (facultatifs): - - search_name : nom recherché. Recherche basée sur la fonction - ilike de SQL avec un remplacement des espaces par % - fields : liste des champs à retourner (liste des champs de VMTaxrefListForautocomplete + lists) - id_liste : filtre sur une ou des listes associées à un taxon - limit: nombre de résultats @@ -472,49 +470,36 @@ def get_names(): limit = request.args.get("limit", 20, int) page = request.args.get("page", 1, int) - q = VMTaxrefListForautocomplete.query.join(Taxref).outerjoin(BibNoms).outerjoin(CorNomListe) + q = Taxref.query.outerjoin(BibNoms).outerjoin(CorNomListe) id_liste = request.args.getlist("id_liste", None) if id_liste and not id_liste == -1: q = q.filter(CorNomListe.id_liste.in_(tuple(id_liste))) - # filtre sur search_name - search_name = request.args.get("search_name") - if search_name: - search_name = search_name.replace(" ", "%") - q = q.filter( - VMTaxrefListForautocomplete.unaccent_search_name.ilike( - func.unaccent("%" + search_name + "%") - ) - ) - q = q.order_by( - desc(VMTaxrefListForautocomplete.cd_nom == VMTaxrefListForautocomplete.cd_ref) - ) - - # Filtrer champs retourner par la requête + # Filtrer champs demandés par la requête fields = request.args.get("fields", type=str, default=[]) if fields: fields = fields.split(",") fields_to_filter = None if fields: - fields_to_filter = [f for f in fields if getattr(VMTaxrefListForautocomplete, f, None)] + fields_to_filter = [f for f in fields if getattr(Taxref, f, None)] # Ajout disctinct pour ne pas avoir de doublons for field in [ - getattr(VMTaxrefListForautocomplete, f, None) + getattr(Taxref, f, None) for f in fields - if getattr(VMTaxrefListForautocomplete, f, None) + if getattr(Taxref, f, None) ]: q = q.distinct(field) results = q.paginate(page=page, per_page=limit, error_out=False) items = [] for r in results.items: - data = r.as_dict(fields=fields_to_filter, exclude=["unaccent_search_name"]) + data = r.as_dict(fields=fields_to_filter) if not fields or "lists" in fields: id_listes = [] - if r.taxon.bib_nom: - id_listes = [l.id_liste for l in r.taxon.bib_nom[0].listes] + if r.bib_nom: + id_listes = [l.id_liste for l in r.bib_nom[0].listes] items.append(dict(data, lists=id_listes)) else: items.append(data) diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py index 1ab0d4f1..15975fca 100644 --- a/apptax/tests/test_taxref.py +++ b/apptax/tests/test_taxref.py @@ -26,16 +26,31 @@ class TestAPITaxref: schema_names = Schema( [ { - "gid": int, "cd_nom": int, + "id_statut": str, + "id_habitat": int, + "id_rang": str, + "phylum": str, + "classe": Or(None, str), + "regne": str, + "ordre": str, + "famille": str, + "sous_famille": Or(None, str), + "tribu": Or(None, str), + "cd_taxsup": Or(None, int), + "cd_sup": Or(None, int), "cd_ref": int, - "search_name": str, - "nom_valide": str, - "nom_vern": Or(None, str), "lb_nom": str, - "regne": str, + "lb_auteur": str, + "nom_complet": str, + "nom_complet_html": str, + "nom_vern": Or(None, str), + "nom_valide": str, + "nom_vern_eng": Or(None, str), + "group1_inpn": str, "group2_inpn": str, "group3_inpn": str, + "url": Or(None, str), "lists": [int], } ] @@ -120,14 +135,6 @@ def test_get_names_routes(self): if data: assert self.schema_names.is_valid(data) - def test_get_names_routes_without_list_filter_search_name(self): - query_string = {"limit": 10, "search_name": "poa"} - response = self.client.get(url_for("taxref.get_names"), query_string=query_string) - assert response.status_code == 200 - data = response.json - if data: - assert self.schema_names.is_valid(data) - def test_get_names_routes_limit_fields(self): query_string = {"limit": 10, "fields": "cd_nom,cd_ref,lists"} response = self.client.get(url_for("taxref.get_names"), query_string=query_string) @@ -139,7 +146,7 @@ def test_get_names_routes_limit_fields(self): assert current_schema.is_valid(data) def test_get_names_routes_limit_filter_id_liste(self): - query_string = {"limit": 10, "id_liste": "100", "fields": "cd_nom"} + query_string = {"id_liste": "100", "fields": "cd_nom"} response = self.client.get(url_for("taxref.get_names"), query_string=query_string) current_schema = Schema([{"cd_nom": int}]) assert response.status_code == 200