Development #50795
Accès structuré aux données des formulaires de workflow
0%
Description
Remonté par Toulouse et reproduit sur notre démo de production.
Lorsqu'on renseigne un formulaire de workfow qui comporte un bloc de champ, les données liées à ce bloc de champ ne sont pas accessible via leur identifiant avec index (comme pour les blocs de champs d'un formulaire frontoffice).
Les identifiants sont remplacés par un identifiant technique.
piece_jointe_var_thebloc vic 2020 (test), vic 2020 (test) piece_jointe_var_thebloc_raw_data [{'bf83c17d0c-53c2-4505-8505-2a0bda08a0b1': 'ghgh', 'bfaf2ff13e-bd62-49e0-9687-febd4925653f': 'ghfh', 'bf2a8e9e03-734f-484a-aeb7-d3bab166c2bd': <PicklableUpload at 7f4de99f5ac8: satisfaction.png>}, {'bf83c17d0c-53c2-4505-8505-2a0bda08a0b1': 'ghfgh', 'bfaf2ff13e-bd62-49e0-9687-febd4925653f': 'dghgh', 'bf2a8e9e03-734f-484a-aeb7-d3bab166c2bd': <PicklableUpload at 7f4de99f52b0: justificatif_pdf.pdf>}] (<class 'list'>) piece_jointe_var_thebloc_raw_schema bf2a8e9e03-734f-484a-aeb7-d3bab166c2bd file piece_jointe_var_thebloc_raw_schema_bf83c17d0c-53c2-4505-8505-2a0bda08a0b1 string piece_jointe_var_thebloc_raw_schema_bfaf2ff13e-bd62-49e0-9687-febd4925653f string
formulaire de test : https://demarches-publik.entrouvert.com/backoffice/forms/410/
workflow de test : https://demarches-publik.entrouvert.com/backoffice/workflows/154/
bloc de champs : https://demarches-publik.entrouvert.com/backoffice/forms/blocks/1/
demande : https://demarches-publik.entrouvert.com/backoffice/management/vic-2021/25/inspect
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a environ 3 ans
Oui les données de formulaires de workflows sont stockées en vrac, il n'y a pas de lien du tout avec le fait que ça vienne de blocs ou d'autres champs. Il ne faut pas imaginer voir ça changer.
Mis à jour par Frédéric Péters il y a environ 3 ans
- Tracker changé de Bug à Development
- Sujet changé de Accès aux données d'un bloc de champ saisie depuis un formulaire de workflow à Accès structuré aux données des formulaires de workflow
Le développement que ça demanderait, c'est l'ajout d'un traitement particulier pour les formulaires de workflow, qu'ils enregistrent leurs données dans un objet dans le journal de la demande (formdata.evolutions); de là serait formalisé l'accès à ces données, par exemple via form_workflow_form_<identifiant>_var_etc. (il y aurait bien sûr en parallèle à conserver le stockage en vrac actuel pour la compatibilité)
Je renomme le ticket (car ça concerne tous les types de champs) et marque ça comme étant un développement.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Dupliqué par Development #58314: Source de données utilisateurs en dans un formulaire de wf : Impossible d'accéder aux attributs de l'utilisateur ajouté
Mis à jour par Mikaël Ates il y a plus de 2 ans
- Lié à Bug #49085: Dans un champs commentaire d'un formulaire de WF, impossible d'afficher une fiche d'une source de donnée de fiche filtrée sur une autre fiche de ce même formulaire. ajouté
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Lié à Bug #49085: Dans un champs commentaire d'un formulaire de WF, impossible d'afficher une fiche d'une source de donnée de fiche filtrée sur une autre fiche de ce même formulaire. supprimé
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Fichier 0001-workflows-store-workflow-form-data-for-structured-ac.patch 0001-workflows-store-workflow-form-data-for-structured-ac.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Voilà, pour des données accessibles sous form_workflow_form_<slug (action varname)> <index>_var_whatever…
ex: form_workflow_form_blah_0_var_fooblock_var_test (champ "test" d'un bloc "fooblock" d'une action formulaire nommée "blah").
l'index peut être zappé pour accéder au premier enregistrement du formulaire de workflow (qui sera régulièrement le seul), ex: form_workflow_form_blah_var_fooblock_var_test.
Il y a également un accès direct au dernier enregistrement, en utilisant "latest", ex: form_workflow_form_blah_latest_var_fooblock_var_test.
Côté code ça ajoute un objet WorkflowFormEvolutionPart dans l'historique et l'accès se fait via un LazyFormDataWorkflowForms, c'est assez proche de ce qui est fait pour les liens sur la création d'une demande ou fiche (LazyFormDataLinks etc.). La même approche sera reprise, avec peut-être du code à partager/généraliser pour le stockage des retours d'appels webservice hors formdata.workflow_data (ainsi que pour les appels webservices trigger).
Un truc à noter est que le schéma du formulaire est enregistré à côté des données, ça permet d'éviter des problèmes en tout sens si le formulaire de workflow est modifié. (mais ça a comme inconvénient qu'y modifier un identifiant de champ n'aura pas d'impact sur les demandes déjà existantes).
J'ai ajouté une option de site "disable-workflow-form-to-workflow-data" pour ne pas enregistrer les données du tout dans workflow_data (plutôt que les avoir en double, aplaties dans workflow_data + structurées sous form_workflow_form), c'est quelque chose que je poserais assez rapidement/volontiers sur les nouveaux tenants, pour forcer l'accès via les nouveaux noms.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Fichier 0001-workflows-store-workflow-form-data-for-structured-ac.patch 0001-workflows-store-workflow-form-data-for-structured-ac.patch ajouté
Nouvelle version qui met à jour le nettoyage des fichiers inutilisés pour prendre en compte les fichiers qui peuvent désormais être stockés via l'action.
Mis à jour par Lauréline Guérin il y a plus de 2 ans
(lu, compris à part le morceau dans evaluate_live_form
; ok pour moi, mais je laisse une personne plus aguerrie valider :) )
Mis à jour par Thomas Noël il y a plus de 2 ans
Sur l'usage, je trouve d'imposer l'utilisation de "latest" pour avoir les dernières données reçues, car ça me semble le cas d'usage le plus fréquent (et c'est ce qui se passe actuellement avec le workflow_data.update).
On a actuellement :
assert substvars['form_workflow_form_blah_var_fooblock_var_test'] == 'ABC' assert substvars['form_workflow_form_blah_0_var_fooblock_var_test'] == 'ABC' assert substvars['form_workflow_form_blah_1_var_fooblock_var_test'] == 'XYZ' assert substvars['form_workflow_form_blah_latest_var_fooblock_var_test'] == 'XYZ'
On pourrait faire que par défaut (..._blah_var_...) c'est le dernier contenu qui est retourné. On aurait juste "var" (le dernier), 0_var (le premier), 1_var, ..., n_var :
assert substvars['form_workflow_form_blah_var_fooblock_var_test'] == 'XYZC' assert substvars['form_workflow_form_blah_0_var_fooblock_var_test'] == 'ABC' assert substvars['form_workflow_form_blah_1_var_fooblock_var_test'] == 'XYZ'
Pour le reste, ça me parait tout bien.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Fichier 0001-workflows-store-workflow-form-data-for-structured-ac.patch 0001-workflows-store-workflow-form-data-for-structured-ac.patch ajouté
Voilà une version qui met le dernier par défaut et sinon un accès par index.
Mis à jour par Thomas Noël il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 4cdf244b29d437a79eb195de6dd36f1ee007d84d Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sun Nov 28 17:50:05 2021 +0100 workflows: store workflow form data for structured access (#50795)
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
workflows: store workflow form data for structured access (#50795)