Project

General

Profile

Développement #63559

Filtres supplémentaires pour envoyer un champ liste à choix multiple par WS

Added by Valentin Deniaud over 2 years ago. Updated over 2 years ago.

Status:
Fermé
Priority:
Normal
Target version:
-
Start date:
05 April 2022
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

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"}, ...].

Pour cela on aurait besoin de deux filtres :
  • |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

Related to Chrono - Développement #64423: Permettre de configurer un agenda de garde partagée par APIFermé21 April 2022

Actions

Associated revisions

Revision 204d1765 (diff)
Added by Valentin Deniaud over 2 years ago

templatetags: add |getlistdict filter (#63559)

History

#1

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)

#3

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.

#4

Updated by Valentin Deniaud over 2 years ago

#5

Updated by Valentin Deniaud over 2 years ago

Au final je rajoute une méthode getlistdict partout où il y a une méthode getlist.

#6

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.

#8

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.

#9

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 ?

#10

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.

#11

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'
#12

Updated by Valentin Deniaud over 2 years ago

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.

#13

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.

#15

Updated by Thomas Noël (congés → 5 décembre) over 2 years ago

  • Status changed from Solution proposée to Solution validée
#16

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)
#17

Updated by Transition automatique over 2 years ago

  • Status changed from Résolu (à déployer) to Solution déployée
#18

Updated by Transition automatique over 2 years ago

Automatic expiration

Also available in: Atom PDF