Skip to content

Commit

Permalink
Use taxref as main table for /names
Browse files Browse the repository at this point in the history
  • Loading branch information
amandine-sahl committed Nov 9, 2023
1 parent e5715be commit d4021d2
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 40 deletions.
2 changes: 0 additions & 2 deletions apptax/taxonomie/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 "<VMTaxrefListForautocomplete %r>" % self.search_name

Expand Down
33 changes: 9 additions & 24 deletions apptax/taxonomie/routestaxref.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down
35 changes: 21 additions & 14 deletions apptax/tests/test_taxref.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
}
]
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down

0 comments on commit d4021d2

Please sign in to comment.