Développement #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.
Files
Related issues
Associated revisions
History
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
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)
Updated by Valentin Deniaud over 2 years ago
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.
Updated by Valentin Deniaud over 2 years ago
- Related to Développement #64423: Permettre de configurer un agenda de garde partagée par API added
Updated by Valentin Deniaud over 2 years ago
- File 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch added
- Status changed from Nouveau to Solution proposée
- Patch proposed changed from No to Yes
Au final je rajoute une méthode getlistdict partout où il y a une méthode getlist.
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
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.
Updated by Valentin Deniaud over 2 years ago
- File 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch added
Yep, remarques prises en compte.
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
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.
Updated by Valentin Deniaud over 2 years ago
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 ?
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
- Status changed from Solution proposée to 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.
Updated by Frédéric Péters over 2 years ago
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'
Updated by Valentin Deniaud over 2 years ago
- File 0001-templatetags-add-getlistdict-filter-63559.patch 0001-templatetags-add-getlistdict-filter-63559.patch added
- Status changed from En cours to 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.
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
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.
Updated by Thomas Noël (congés → 5 décembre) over 2 years ago
- Status changed from Solution proposée to Solution validée
Updated by Valentin Deniaud over 2 years ago
- Status changed from Solution validée to 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)
Updated by Transition automatique over 2 years ago
- Status changed from Résolu (à déployer) to Solution déployée
templatetags: add |getlistdict filter (#63559)