From bd41185a1fb647f1ef88557336d6cdc552c64d39 Mon Sep 17 00:00:00 2001 From: Amandine Date: Fri, 6 Dec 2024 11:39:03 +0100 Subject: [PATCH] Route taxref : filtre cd_nom valeur multiple (#590) * Route taxref : filtre cd_nom valeur multiple --- apptax/taxonomie/models.py | 9 ++++++++- apptax/taxonomie/routestaxref.py | 12 ++++++++++-- apptax/tests/test_taxref.py | 24 ++++++++++++++++++++++++ docs/developpement.md | 3 ++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/apptax/taxonomie/models.py b/apptax/taxonomie/models.py index df62c506..d0b244d5 100644 --- a/apptax/taxonomie/models.py +++ b/apptax/taxonomie/models.py @@ -216,7 +216,14 @@ def where_id_liste(cls, id_liste, *, query): def where_params(cls, filters=None, *, query): for filter in filters: - if hasattr(Taxref, filter) and filters[filter] != "": + # Test empty values + if not filters[filter]: + continue + + if hasattr(Taxref, filter) and isinstance(filters[filter], list): + col = getattr(Taxref, filter) + query = query.filter(col.in_(tuple(filters[filter]))) + elif hasattr(Taxref, filter) and filters[filter] != "": col = getattr(Taxref, filter) query = query.filter(col == filters[filter]) elif filter == "is_ref" and filters[filter] == "true": diff --git a/apptax/taxonomie/routestaxref.py b/apptax/taxonomie/routestaxref.py index 8a46e45a..a31088c3 100644 --- a/apptax/taxonomie/routestaxref.py +++ b/apptax/taxonomie/routestaxref.py @@ -162,10 +162,18 @@ def get_taxref_list(): limit = request.values.get("limit", 20, int) page = request.values.get("page", 1, int) id_liste = None + cd_nom = None + if "id_liste" in request.values: - id_liste = request.values.get("id_liste").split(",") + id_liste = ( + request.values.get("id_liste").split(",") if request.values.get("id_liste") else None + ) + if "cd_nom" in request.values: + cd_nom = request.values.get("cd_nom").split(",") if request.values.get("cd_nom") else None + fields = request.values.get("fields", type=str, default=[]) parameters = request.values.to_dict() + parameters["cd_nom"] = cd_nom dump_options = {} if fields: @@ -178,10 +186,10 @@ def get_taxref_list(): joinedload_when_attributs = get_joinedload_when_attributs(fields=fields) query = Taxref.joined_load(fields).options(*joinedload_when_attributs) + query = Taxref.where_params(parameters, query=query) if id_liste and "-1" not in id_liste: query = Taxref.where_id_liste(id_liste, query=query) - count_filter = db.session.scalar( db.select(func.count()).select_from( Taxref.where_params(parameters, query=query), diff --git a/apptax/tests/test_taxref.py b/apptax/tests/test_taxref.py index 7b4b8c16..fe78249d 100644 --- a/apptax/tests/test_taxref.py +++ b/apptax/tests/test_taxref.py @@ -305,3 +305,27 @@ def test_get_taxref_list(self, liste_with_names): assert response.status_code == 200 response_json = response.json assert len(response_json["items"]) == limit + + def test_get_taxref_list_filters_cd_noms(self): + # Test de la route taxref avec des filtres sur le cd_nom + # 1 cd_nom + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": 103536}, + ) + assert response.status_code == 200 + assert len(response.json["items"]) == 1 + + # Plusieurs cd_nom + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": "103536, 461885,2891"}, + ) + assert len(response.json["items"]) == 3 + + # Valeur vide + response = self.client.get( + url_for("taxref.get_taxref_list"), + query_string={"cd_nom": ""}, + ) + assert response.status_code == 200 diff --git a/docs/developpement.md b/docs/developpement.md index d840a501..eecaa88e 100644 --- a/docs/developpement.md +++ b/docs/developpement.md @@ -8,7 +8,8 @@ - limit (defaut = 50) : nombre d'éléments à retourner - page (defaut = 0) : page à retourner - is_ref (default = false) : ne retourne que les noms valides (cd_nom = cd_ref) - - id_liste + - id_liste : liste d'identifiant des listes + - cd_nom : liste de cd_nom - fields (permet de spécifier les champs renvoyés). Permet aussi de récupérer les données secondaires non renvoyées par défaut, en les spécifiant explicitement (`fields=status,rang,medias,attributs,synonymes,listes`) - nomColonne : Permet de filtrer