Projet

Général

Profil

Development #63559

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

Ajouté par Valentin Deniaud il y a environ 2 ans. Mis à jour il y a presque 2 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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.

Fichiers


Demandes liées

Lié à Chrono - Development #64423: Permettre de configurer un agenda de garde partagée par APIFermé21 avril 2022

Actions

Révisions associées

Révision 204d1765 (diff)
Ajouté par Valentin Deniaud il y a presque 2 ans

templatetags: add |getlistdict filter (#63559)

Historique

#1

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)

#3

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.

#4

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é
#5

Mis à jour par Valentin Deniaud il y a environ 2 ans

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

#6

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.

#8

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.

#9

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 ?

#10

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.

#11

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

Mis à jour par Valentin Deniaud il y a presque 2 ans

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

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.

#15

Mis à jour par Thomas Noël il y a presque 2 ans

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

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

Mis à jour par Transition automatique il y a presque 2 ans

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

Mis à jour par Transition automatique il y a presque 2 ans

Automatic expiration

Formats disponibles : Atom PDF