Repository: PnX-SI/TaxHub (language: python)

Issue:
/allnamebylist/ attend un code_liste mais Occtax passe un id_liste...
Depuis la version 1.8.0 de TaxHub, un ``code_liste`` a été ajouté à la table ``taxonomie.bib_listes`` : https://github.com/PnX-SI/TaxHub/blob/master/data/update1.7.3to1.8.0.sql

En même temps la route ``/allnamebylist/`` a été modifiée pour prendre le ``code_liste`` en paramètre au lieu du ``id_liste`` (https://github.com/PnX-SI/TaxHub/pull/223).

Mais Occtax, ou même Occtax-mobile continue à interroger un ``id_liste`` quand il appellent cette liste.

Cela peut causer des soucis si l'administrateur créé une nouvelle liste et lui attribue un code différent de l'ID, ce qui est censé être le cas avec 100% des listes nouvellement créées vu que l'on demande un code_liste à l'utilisateur et que la liste n'a pas encore d'ID_liste.

Jusqu'à présent ce n'est pas remonté car lors de l'ajout du champs ``code_liste`` celui-ci a été rempli avec les ``id_liste`` existants : https://github.com/PnX-SI/TaxHub/blob/master/data/update1.7.3to1.8.0.sql#L7

Exemple d'un retour d'un utilisateur qui a créé une liste de taxons en lui attribuant le code "orchids", mais quand Occtax interroge l'API de TaxHub il tape sur ``taxhub/api/taxref/allnamebylist/101?search_name=orchis&limit=20`` qui renvoie logiquement une erreur 400, car il n'existe pas de liste de taxon avec le ``code_liste`` égal à 101.

On pourrait envisager que Occtax et Occtax-mobile appellent le ``code_liste`` plutôt que le ``id_liste``, mais ça serait un peu tordu, et cela nécessiterait de stocker le ``code_liste`` au niveau de Occtax (dans la conf pour la liste globale ou dans la BDD pour les listes par JDD). 

Il semble plutôt souhaitable de garder par défaut une interrogation par ``id_liste`` et d'avoir une option pour interroger par ``code_liste``, non ?


Discussion / hints:
Salut Camille,
Je tombe sur cette issue qui semble en lien avec celle ci : https://github.com/PnX-SI/GeoNature-citizen/issues/327, où tu proposes : 

> qu'il ne devrait pas y avoir de route /allnamebylist/ comme actuellement.
Selon moi il devrait juste y avoir une route /names/ plus générique filtrable par id_liste, code_liste, rang taxonomique, cd_ref, etc...

Penses-tu que cela répondrait aussi à la problématique de cette issue ? 
Actuellement, il n'y a pas de soucis pour utiliser la route ``/allnamebylist/`` au niveau de GeoNature-citizen et de la filtrer par ``code_liste``, pour pouvoir y proposer des programmes avec des listes de taxons auto-complétées, non limitées à 100 taxons.

Mais en passant, je faisais une remarque plus générale et prospective pour indiquer que selon moi, on devrait avoir une liste générique ``names`` au niveau de TaxHub, plutôt qu'une liste spécifique ``/allnamebylist/``.
Mais cela me semble pas forcément conditionné.

Fix patch:
diff --git a/docs/changelog.md b/docs/changelog.md
index e467d03a..3762c932 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -6,6 +6,7 @@
 
 * Ajout de la colonne `group3_inpn` à la table taxref et à la réponse de la route `getTaxonDetail` (#447)
 * Ajout d'une route listant les group3 `/groupe3_inpn` (#447)
+* Route `allnamebylist` prend comme paramètre `id_liste` et non plus le `code_liste` (qui peut toujours être utilisé en tant que paramètre get) (#346)
 
 1.13.0 (2023-10-25)
 ===================


Test patch:
diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py
index b1ce1c66..d36e8b4d 100644
--- a/apptax/taxonomie/routestaxref.py
+++ b/apptax/taxonomie/routestaxref.py
@@ -345,18 +345,19 @@ def get_group3_inpn_taxref():
     return [d[0] for d in data]
 
 
-@adresses.route("/allnamebylist/<string:code_liste>", methods=["GET"])
+@adresses.route("/allnamebylist/<int(signed=True):id_liste>", methods=["GET"])
 @adresses.route("/allnamebylist", methods=["GET"])
 @json_resp
-def get_AllTaxrefNameByListe(code_liste=None):
+def get_AllTaxrefNameByListe(id_liste=None):
     """
     Route utilisée pour les autocompletes
     Si le paramètre search_name est passé, la requête SQL utilise l'algorithme
     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)
+        - id_liste : identifiant de la liste (si id_liste est null ou = à -1 on ne prend pas de liste)
     params GET (facultatifs):
+        - code_liste : code de la liste à filtrer, n'est pris en compte que si aucune liste est spécifiée
         - 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
@@ -365,40 +366,22 @@ def get_AllTaxrefNameByListe(code_liste=None):
         - offset: numéro de la page
     """
     # Traitement des cas ou code_liste = -1
-    id_liste = None
-    try:
-        if code_liste:
-            code_liste_to_int = int(code_liste)
-            if code_liste_to_int == -1:
-                id_liste = -1
-        else:
-            id_liste = -1
-    except ValueError:
-        # le code liste n'est pas un entier
-        #   mais une chaine de caractère c-a-d bien un code
-        pass
-
-    # Get id_liste
-    try:
-        # S'il y a un id_liste elle a forcement la valeur -1
-        #   c-a-d pas de liste
-        if not id_liste:
-            q = (
-                db.session.query(BibListes.id_liste).filter(BibListes.code_liste == code_liste)
-            ).one()
-            id_liste = q[0]
-    except NoResultFound:
-        return (
-            {"success": False, "message": "Code liste '{}' inexistant".format(code_liste)},
-            400,
-        )
+    if id_liste == -1:
+        id_liste = None
 
     q = db.session.query(VMTaxrefListForautocomplete)
-    if id_liste and id_liste != -1:
+    if id_liste:
         q = q.join(BibNoms, BibNoms.cd_nom == VMTaxrefListForautocomplete.cd_nom).join(
             CorNomListe,
             and_(CorNomListe.id_nom == BibNoms.id_nom, CorNomListe.id_liste == id_liste),
         )
+    elif request.args.get("code_liste"):
+        q = (
+            db.session.query(BibListes.id_liste).filter(
+                BibListes.code_liste == request.args.get("code_liste")
+            )
+        ).one()
+        id_liste = q[0]
 
     search_name = request.args.get("search_name")
     if search_name:
diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py
index c1a46e7b..b7fbdd50 100644
--- a/apptax/tests/test_taxref.py
+++ b/apptax/tests/test_taxref.py
@@ -58,7 +58,7 @@ class TestAPITaxref:
     def test_get_allnamebyListe_routes(self):
         query_string = {"limit": 10}
         response = self.client.get(
-            url_for("taxref.get_AllTaxrefNameByListe", code_liste="100"), query_string=query_string
+            url_for("taxref.get_AllTaxrefNameByListe", id_liste=100), query_string=query_string
         )
         assert response.status_code == 200
         data = response.json
@@ -73,7 +73,17 @@ def test_get_allnamebyListe_routes_without_list(self):
             "group2_inpn": "Angiospermes",
         }
         response = self.client.get(
-            url_for("taxref.get_AllTaxrefNameByListe", code_liste=-1), query_string=query_string
+            url_for("taxref.get_AllTaxrefNameByListe", id_liste=-1), query_string=query_string
+        )
+        assert response.status_code == 200
+        data = response.json
+        if data:
+            assert self.schema_allnamebyListe.is_valid(data)
+
+    def test_get_allnamebyListe_routes_with_code(self):
+        query_string = {"limit": 10, "code_list": "100"}
+        response = self.client.get(
+            url_for("taxref.get_AllTaxrefNameByListe", id_liste=None), query_string=query_string
         )
         assert response.status_code == 200
         data = response.json
@@ -89,7 +99,7 @@ def test_get_allnamebyListe_routes_without_list_filter_group3(self):
             "group3_inpn": "Autres",
         }
         response = self.client.get(
-            url_for("taxref.get_AllTaxrefNameByListe", code_liste=-1), query_string=query_string
+            url_for("taxref.get_AllTaxrefNameByListe", id_liste=-1), query_string=query_string
         )
         assert response.status_code == 200
         data = response.json