Bug #2926
export json des formdata plus cohérent
100%
Description
Actuellement l'export JSON des formdata passe par des "get_view_value" et autres machineries, et uniquement pour les fields, donc pas pour workflow_data. Au final on se retrouve par exemple avec des "true" (en bon json), mais aussi des "Yes" ou des "True" (sous forme de string)... Ca va pas.
Je propose que l'objet JSON à exporter ne soit pas modifié autrement que par un JSONEncoder appelé lors du json.dumps. Il traitera uniquement les types de données que le module json ne sait pas gérer nativement. Les valeurs dans les fields ou dans le workflow_data seront ainsi traitées "sur un pied d'égalité".
C'est plus cohérent, notamment pour #2895.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Thomas Noël il y a presque 11 ans
- Fichier wcs-better-json.patch wcs-better-json.patch ajouté
Première proposition de patch.
Ce qui manque / reste à faire :- la fonction JSONEncoder doit être testée sur l'ensemble des types de champs.
- on pourra peut-être prévoir un fields.get_json_value(value) à appeler, s'il existe, dans les champs formdata.export_to_json
- voir ce qui peut être factorisé avec le submit_form de wf/form.py
Mis à jour par Frédéric Péters il y a presque 11 ans
- Statut changé de Nouveau à En cours
- Assigné à mis à Thomas Noël
L'idée me convient bien.
+ return time.strftime('%Y-%m-%dT%H:%M:%SZ', obj)
Sans le Z, dans la mesure où on ne connait pas le décalage.
- value = unicode(value, get_publisher().site_charset)
et
- display_value = unicode(display_value, get_publisher().site_charset)
La partie encodage dans le charset du site a été perdue.
Mis à jour par Thomas Noël il y a presque 11 ans
- Fichier wcs-better-json-try2.patch wcs-better-json-try2.patch ajouté
- création d'un get_json_dict(fields,data) qui renvoie un dictionnaire "prévu pour JSON", en appelant field.get_json_value pour les champs où la fonction existe (FileField pour l'instant)
- utilisation de cette fonction pour produire l'export JSON, mais aussi pour l'enregistrement des donnés de formulaires de workflow dans workflow_data
- get_dict_with_varnames revu pour prendre en compte field.store_display_value (au lieu de l'ancienne bidouille "value = display_value or raw_value")
- encodeur JSON appelé avec le charset du site (non testé, mais ça devrait marcher, on y croit)
Mis à jour par Frédéric Péters il y a presque 11 ans
Je viens de mater le code du module json, pour le paramètre encoding ça a l'air bien ce qu'il faut; là-dessus le code est ok, il reste un qommon.strftime.strftime qui a été remplacé par time.strftime, bien que ça n'arrivera pas sur le cas précis du receipt_time, on était passé sur "notre" module strftime à cause de données genre dates de naissance, trop anciennes pour time.strftime. Je me dis que ça ne coûte rien de le laisser ainsi.
Mis à jour par Thomas Noël il y a presque 11 ans
Effectivement j'ai élagué un peu violemment... Ci-joint un troisième tir. J'ai testé (à la main) avec tous les types de champs (wcs+auquo) et tout passe.
Mis à jour par Thomas Noël il y a presque 11 ans
- Fichier wcs-better-json-try3.patch wcs-better-json-try3.patch ajouté
Mis à jour par Thomas Noël il y a presque 11 ans
Oups... dans ce patch y'a un "len(label_value or '')" que j'ai ajouté suite à un crash de l'affichage d'un champ liste non obligatoire, avec data_source jsonp, et pour laquelle aucune donnée n'avait été soumise, et donc label_value==None)
Mis à jour par Frédéric Péters il y a presque 11 ans
T'en feras un patch séparé (git add -p), hein :) À part ça je dirais que ça me va. Tu as vérifié que le résultat correspondait encore à ce qui se trouve dans la doc (api-get.page) ?
Mis à jour par Thomas Noël il y a presque 11 ans
Frédéric Péters a écrit :
T'en feras un patch séparé (git add -p), hein :)
Oui chef.
À part ça je dirais que ça me va. Tu as vérifié que le résultat correspondait encore à ce qui se trouve dans la doc (api-get.page) ?
It does.
Mis à jour par Thomas Noël il y a presque 11 ans
- Statut changé de En cours à Résolu (à déployer)
- % réalisé changé de 0 à 100
Appliqué par commit 7a6247ed6d110437ed1f5c16cb6a9a71647ba98d.
Mis à jour par Thomas Noël il y a presque 11 ans
- Statut changé de Résolu (à déployer) à Rejeté
résolu autrement dans #2926
formdata: better JSON export (fix #2926)