Bug #7258
Documents attachés absent lors du lancement du workflow
0%
Description
Suite à l'application (sur une plateforme de dev) de #7254 je constate que l'appel à value.get_file_pointer().read() renvoie une chaine vide lors du premier lancement du workflow.
Il faudrait sans doute s'assurer de l'enregistrement complet de la demande (i.e. y compris des fichiers attachés) avant de lancer le workflow.
(Je met le ticket "haut" parce que c'est vraiment urgent pour le webservice Maarch qui envoie les demandes directement, sans aucune validation)
Fichiers
Demandes liées
Historique
Mis à jour par Thomas Noël il y a presque 9 ans
en première lecture, ça pourrait être lié au fait que wcs (quixote?) ne ferme pas le fichier après l'avoir écrit, donc quand on fait un read, on n'est pas au début.
Sans doute faut-il faire ceci :
fp = value.get_file_pointer() fp.seek(0) content = base64.b64encode(fp.read())
Testé, ça fonctionne. Mais je n'aime pas vraiment (thread-safe et autres considérations). Il y aurait une autre (meilleure) méthode ?...
Mis à jour par Frédéric Péters il y a presque 9 ans
Une autre correction pourrait être, avant d'exécuter le workflow, de charger l'objet formdata depuis sa représentation (disque/db), plutôt qu'utiliser la version construite à partir des données du submit http; quelque chose genre :
--- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -806,6 +806,7 @@ class FormPage(Directory): get_logger().info('form %s - done (id: %s)' % (self.formdef.name, filled.id)) url = None if existing_formdata is None: + filled = filled.get(filled.id) url = filled.perform_workflow() if not filled.user_id:
Mis à jour par Thomas Noël il y a presque 9 ans
Pas certain que ça corrige à coup sûr. Le problème c'est qu'en faisant dans le reste du code des accès genre "fp = value.get_file_pointer(); content = fp.read()", il faudrait être sûr qu'un seul appel de ce genre est fait, sinon le premier read pose le file_pointer en fin de fichier, et la seconde passe renverra du vide.
On pourrait penser à ajouter dans qommon.forms.PicklableUpload un explicite "value.get_content()" -- ou éventuellement un value.get_new_file_pointer() sachant ça sera toujours pour faire un read+close avec...
Mis à jour par Thomas Noël il y a presque 9 ans
- Bloque Development #7254: export json intégrant les fichiers joints ajouté
Mis à jour par Thomas Noël il y a presque 9 ans
- Fichier 0001-add-PicklableUpload-get_content-method-7258.patch 0001-add-PicklableUpload-get_content-method-7258.patch ajouté
- Patch proposed changé de Non à Oui
Proposition de get_content
Mis à jour par Frédéric Péters il y a presque 9 ans
- Statut changé de Nouveau à Résolu (à déployer)
Intégré dans #7254.