Projet

Général

Profil

Bug #52763

L'utilisation de filtre de requête sur form_number ne marche pas

Ajouté par Marie Kuntz il y a environ 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
06 avril 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Si je veux tester l'existence d'une démarche par son numéro form_number avec un filtre de requête :

{{form_objects|filter_by:"form_number"|filter_value:"11"|count}}

Ca ne marche pas, ni avec :
{{form_objects|filter_by:"form_number"|filter_value:"139-11"|count}}

J'ai toujours 0 en résultat dans l'inspect


Fichiers

Révisions associées

Révision 75000798 (diff)
Ajouté par Frédéric Péters il y a environ 3 ans

general: add queryset filter on form_number (#52763)

(and fallbacks so |filter_by can be used with specialized filters)

Historique

#3

Mis à jour par Frédéric Péters il y a environ 3 ans

Oui filter_by c'est pour les données; comme on a |filter_by_user ou |filter_by_status, on pourrait avoir un nouveau filtre dédié mais quel serait l'objectif réel ? question parce que si ce qui est souhaité est obtenir une demande particulière, je serais plutôt pour permettre form_objects|get:... plutôt qu'à passer par une liste terminée par |first pour obtenir l'élément concerné.

#4

Mis à jour par Marie Kuntz il y a environ 3 ans

Frédéric Péters a écrit :

Oui filter_by c'est pour les données;

ok, merci, je m'en doutais.

question parce que si ce qui est souhaité est obtenir une demande particulière,

Oui

je serais plutôt pour permettre form_objects|get:... plutôt qu'à passer par une liste terminée par |first pour obtenir l'élément concerné.

je ne comprends pas ce que tu dis.

#5

Mis à jour par Frédéric Péters il y a environ 3 ans

Ma question sur l'objectif c'est que je vois une utilité à pouvoir récupérer une demande/fiche par son identifiant, pour faire quelque chose du genre :

{% with demande=form_objects|TODO %}
  La demande a le numéro {{demande|get:"form_number"}}
{% endwith %}

Avec pour expliciter les deux options sur l'idée de requête filtrée, on ferait :

{% with demande=form_objects|filter_by_number:"12"|first %}

et sur l'idée du |get, on ferait :

{% with demande=form_objects|get:"12" %}

Dans ce contexte je trouve plus de sens à avoir la forme en |get.

#6

Mis à jour par Marie Kuntz il y a environ 3 ans

Le cas d'usage est de demander dans une démarche à l'usager le numéro d'une autre démarche qu'il a faite pour s'y référer (cette autre démarche doit exister pour pouvoir faire la nouvelle démarche).

#7

Mis à jour par Pierre Cros il y a environ 3 ans

Frédéric Péters a écrit :

Oui filter_by c'est pour les données; comme on a |filter_by_user ou |filter_by_status, on pourrait avoir un nouveau filtre dédié mais quel serait l'objectif réel ? question parce que si ce qui est souhaité est obtenir une demande particulière, je serais plutôt pour permettre form_objects|get:... plutôt qu'à passer par une liste terminée par |first pour obtenir l'élément concerné.

Évidemment ce que tu proposes sans passer par |first est plus simple mais ça m'ennuie un peu de ne pas utiliser la logique filter_by* qui est maintenant connue par les CPF et quelques clients.

#8

Mis à jour par Frédéric Péters il y a environ 3 ans

Voilà un |filter_by_form_number, avec un bonus aussi un comportement ajusté pour le |filter_by, si jamais on y passe "form_number" ça fait le transfert automatique vers le bon filtre. (et pareil pour form_status/form_user (et status et user pour la peine)).

#9

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Assigné à mis à Frédéric Péters
#10

Mis à jour par Thomas Noël il y a environ 3 ans

Ca va être des discussions sans fin mais j'aimerai qu'on tente de rester un peu dans des rails : les form_number qu'on connait ont la forme "xx-yy". Et ça va pas marcher là, on cherche en faire le number_raw ou le internal_id.

Je concois que filter_by_form_number_raw ou filter_by_internal_id c'est un peu longuet, mais c'est tout de même ainsi que ça devrait être écrit.

(Mais passons, je sais que je vais pas gagner, les gens aiment le perl et le php "je vais tenter cette syntaxe, ça finira bien par marcher"... tant pis pour notre cellule support)

En tout cas je ne suis pas d'accord avec le sucre filter_by:"form_number" : ça devrait être filter_by:"number". Pas chaud non plus pour accepter filter_by:"form_user" ou filter_by:"form_status". En effet filter_by c'est un filtrage selon les identifiants des champs, donc sans le prefixe "form" ou "form_var". (mais on peut aussi imaginer un plan où on finirait, lassés, par accepter filter_by:form_var_foo et filter_by:var_foo, et je pourrais tout à faire être d'accord avec ça)

#11

Mis à jour par Pierre Cros il y a environ 3 ans

Pour éviter de désigner par form_number ce qui est un internal_id, on peut pas juste rester sur le truc évoqué au départ filter_by_number ? Correctement documenté en expliquant que c'est le internal_id qui est concerné.

Concernant la possibilité d'utiliser une autre syntaxe filter_by:"form_status" ou filter_by:"status" , j'y vois toujours plutôt une source de confusion qu'une opportunité mais c'est mon côté nazi. Je ne documenterai que filter_by_* si ça vous va.

#12

Mis à jour par Frédéric Péters il y a environ 3 ans

les form_number qu'on connait ont la forme "xx-yy". Et ça va pas marcher là, on cherche en faire le number_raw ou le internal_id

? On cherche bien sur le id_display,

+        return self._clone(self._criterias + [Equal('id_display', str(value))])

Je concois que filter_by_form_number_raw ou filter_by_internal_id c'est un peu longuet, mais c'est tout de même ainsi que ça devrait être écrit.

Sauf qu'en fait tu voudrais qu'on puisse plutôt chercher sur les autres ?

Le truc est pour moi de garder la cohérence entre le nom du filtre et la variable cherchée. i.e. si on cherche form_number, ça doit être filter_by_form_number; si on voulait chercher form_number_raw, ça serait filter_by_form_number_raw. Le patch ici ne propose rien de magique qui viendrait regarder le format et s'il n'y pas de tiret alors chercher ailleurs, etc.

Pour éviter de désigner par form_number ce qui est un internal_id,

form_number n'est pas internal_id.

~~

En pratique, on est quand même plutôt passé par 1/ essai avec |filter_by, 2/ ticket pour dire que ça ne marche pas, 3/ explication pour dire que |filter_by c'est pour les données uniquements, 4/ ajout d'un nouveau filtre avec nouveau nom; et ça me va très bien, au moment d'ajouter |filter_by_status j'écrivais :

(on pourrait se dire que c'est plutôt à intégrer dans |filter_by:... mais je préférerais conserver celui-ci pour les champs, parce qu'une fois ouvert au-delà des champs ça ne finira pas).

Bref, patch réduit pour juste avoir |filter_by_form_number, qui prend en paramètre ce que form_number donne, et cherche sur la colonne appropriée (i.e. id_display).

#13

Mis à jour par Frédéric Péters il y a environ 3 ans

si on cherche form_number, ça doit être filter_by_form_number; si on voulait chercher form_number_raw, ça serait filter_by_form_number_raw.

Et je vois que j'ai écrit ça sans faire gaffe à la partie "form" du milieu, qu'on n'a pas sur filter_by_status (qui attend un form_status en paramètre), ou sur filter_by_user (qui attend un form_user); bref je m'accorde plus logique sur ce qui était dans un de mes premiers commentaires, filter_by_number.

#14

Mis à jour par Thomas Noël il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée

Ca me va. Et très bien pour le retrait de la magie.

Dans la doc il faudra bien préciser que le numéro recherché est bien form_number, donc de la forme xx-yy (et non pas le seul numéro de la demande).

#15

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)

Pour le coup j'ai oublié de retirer la seconde partie du message de commit; tant pis.

commit 750007984a8b818b4de149cde2dec67ce7a50a24
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Apr 12 15:57:59 2021 +0200

    general: add queryset filter on form_number (#52763)

    (and fallbacks so |filter_by can be used with specialized filters)
#16

Mis à jour par Thomas Noël il y a environ 3 ans

Frédéric Péters a écrit :

Pour le coup j'ai oublié de retirer la seconde partie du message de commit; tant pis.

T'as rien oublié : la faute sur le relecteur.

#17

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF