Development #63559
Filtres supplémentaires pour envoyer un champ liste à choix multiple par WS
0%
Description
Cas d'usage : on a un champ liste à choix multiple form_var_enfants, sourcé depuis un modèle de fiche où on aurait les champs form_var_prenom, for_var_nom.
On veut envoyer la liste des enfants à chrono, qui attend genre [{"first_name": "xxx", "last_name": "yyy", "user_external_id": "123"}, ...]
.
- |getlistdict qui permettrait d'écrire {{ form_var_enfants|getlistdict:"prenom,nom,id" }} pour obtenir
[{"prenom": "xxx", "nom": "yyy", "id": "123"}, ...]
. - |rename_key, on ferait alors |rename_key:"prenom:first_name"|rename_key:"nom:last_name"|rename_key:"id:user_external_id" pour avoir le résultat voulu.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Thomas Noël il y a environ 2 ans
Voire même en un seul coup :
|getlistdict:"prenom:first_name, nom:last_name, id:user_external_id"
(idéalement faire fonctionner aussi ce filtre sur des queryset, des blocs, des listes à choix multiple qui sont pas des fiches... ok là j'ai pas d'usage mais je les imagine arriver par la fenêtre)
Mis à jour par Valentin Deniaud il y a environ 2 ans
Oui pour supporter également queryset et liste à choix multiple obtenue depuis un JSON quelconque, par contre les blocs je ne vois pas vraiment ce qui serait attendu donc je vais passer.
Voire même en un seul coup :
J'ai pas d'avis donc je vais faire comme tu dis, on attendra un autre cas d'usage pour ajouter |rename_key.
Mis à jour par Valentin Deniaud il y a environ 2 ans
- Lié à Development #64423: Permettre de configurer un agenda de garde partagée par API ajouté
Mis à jour par Valentin Deniaud il y a environ 2 ans
- Fichier 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Au final je rajoute une méthode getlistdict partout où il y a une méthode getlist.
Mis à jour par Thomas Noël il y a environ 2 ans
Il faudrait striper après name, new_name = key.strip().split(':', 1)
pour gérer "toto: tata".
Il faut aussi gérer le cas où unlazy(keys) va être vide, parce que split(',') va renvoyer [''] et non pas une liste vide.
Pour le cas d'un attribut inconnu le comportement n'est pas identique :- on va renvoyer une chaine vide pour LazyFieldVarItems. Je comprends que c'est pour ressembler à getlist, mais on n'est pas dans le même usage, je pense qu'on devrait plutôt ne rien renvoyer dans le dico (oublier l'attribut)
- on va déclencher une AttributeError sur un block, là encore imitation de getlist mais là aussi, on devrait juste ne rien renvoyer, sans planter.
- idem sur LazyFormDefObjectsManager, ne pas renvoyer None, mais rien du tout.
Si le code devient sale à cause de ça, on peut décider de renvoyer attr:None, mais je préfère que attr ne fasse pas partie de la réponse, ça sera le signe que cet attribut n'existe pas dans l'objet.
Mis à jour par Valentin Deniaud il y a environ 2 ans
- Fichier 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch ajouté
Yep, remarques prises en compte.
Mis à jour par Thomas Noël il y a environ 2 ans
La partie :
value = lazy_formdata.get(key) if value is None: continue
m'ennuie, si l'identifiant existe bien dans le formdata mais que la valeur est effectivement None, ça serait mieux de le voir en None plutôt que pas du tout... Mais je ne vois pas trop comment faire dans le cadre d'un LazyFormdata, donc...
... rien qu'à cause de ça, je me demande s'il ne faudrait pas changer le patch d'épaule, et donc revenir un peu en arrière, ie renvoyer clé:None quand la clé ne "semble" pas exister.
C'est vraiment un détail, désolé Valentin.
Mis à jour par Valentin Deniaud il y a environ 2 ans
Ce qui nous empêche de différencier une valeur à None d'une valeur qui n'existe pas c'est le return compat_dict.get(key)
de la méthode get... On peut peut-être envisager d'ajouter un paramètre raise_if_not_found, ou une nouvelle méthode contains qui fasse ce qu'on veut ?
Mis à jour par Thomas Noël il y a environ 2 ans
- Statut changé de Solution proposée à En cours
Valentin Deniaud a écrit :
Ce qui nous empêche de différencier une valeur à None d'une valeur qui n'existe pas c'est le
return compat_dict.get(key)
de la méthode get... On peut peut-être envisager d'ajouter un paramètre raise_if_not_found, ou une nouvelle méthode contains qui fasse ce qu'on veut ?
Je suis pas super à l'aise avec l'ensemble des codes en jeu pour voir si c'est bien le seul cas (et notamment sur CompatibilityNamesDict), mais pourquoi pas tenter cette modification, effectivement.
Mis à jour par Frédéric Péters il y a environ 2 ans
Ce qui nous empêche de différencier une valeur à None d'une valeur qui n'existe pas c'est le return compat_dict.get(key) de la méthode get... On peut peut-être envisager d'ajouter un paramètre raise_if_not_found, ou une nouvelle méthode contains qui fasse ce qu'on veut ?
Je rate peut-être quelque chose dans le contexte précis de ce ticket mais ce compact_dict.get() avec raise_if_not_found évoqué, ça ne serait pas déjà simplement compat_dict[key] ?
(Pdb) p type(substvars) <class 'wcs.qommon.substitution.CompatibilityNamesDict'> (Pdb) substvars['form_var_plop'] <wcs.variables.LazyFieldVar object at 0x7f7cdaa7b790> (Pdb) substvars['form_var_plop2'] *** KeyError: 'form_var_plop2'
Mis à jour par Valentin Deniaud il y a presque 2 ans
- Fichier 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch ajouté
- Statut changé de En cours à Solution proposée
Vu avec Fred sur jabber, ne pas complexifier en essayant de différencier clé manquante de valeur nulle. À la place,
Thomas Noël a écrit :
donc revenir un peu en arrière, ie renvoyer clé:None quand la clé ne "semble" pas exister.
patch pour ça.
Mis à jour par Thomas Noël il y a presque 2 ans
Sur :
for key in unlazy(keys).split(','): if not key: continue
ça serait plutôt « if not key.strip(): » pour gérer le cas getlistdict:"key1, ,key2"
Ca me semble ma dernière remarque.
Mis à jour par Valentin Deniaud il y a presque 2 ans
Mis à jour par Thomas Noël il y a presque 2 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Valentin Deniaud il y a presque 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 8c44f8f403b0024a37068f8a83b2dabc1b085412 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Apr 21 16:41:26 2022 +0200 templatetags: add |getlistdict filter (#63559)
Mis à jour par Transition automatique il y a presque 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
templatetags: add |getlistdict filter (#63559)