Projet

Général

Profil

Bug #18482

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Voir #17447, je recopie ici le déroulé pour reproduire:

# Par exemple : faites une mise à jour d’adresse
# Sur la dernière page du formulaire : vous cliquez sur valider, et là, vous vous rendez compte que, ô malheur, vous avez fait une erreur lors de votre saisie !
Cliquer rapidement sur précédent (flèche du navigateur) avant que le formulaire soit définitivement validé (IE. pendant le chargement de la page)
# En étant suffisamment réactif, vous avez réussi à revenir à la page 2 du formulaire d’adresse
# Sur la page (faites éventuellement une modif), cliquer sur suivant et là vous atterrissez sur le FO !
# Pour un retour normal : précédent (flèche du navigateur), puis cliquer sur portail agent et si vous aviez fait une modif à l’étape 3, il faudra recommencer.

C'est fait sur un formulaire backoffice mais je suppose qu'on doit avoir le même problème avec un formulaire frontoffice.

Ce serait du à cette ligne je pense:
<pre>
wcs/forms/root.py:1024 session.remove_magictoken(get_request().form.get('magictoken'))
</pre>

Je ne comprends pas tout au fonctionnement du magictoken mais je suppute que c'est un moyen de conserver les données du formulaire en session jusqu'à la soumission de celui-ci.

Et donc sur un back le magictoken est reposté, sauf qu'il ne correspond plus à rien. Il faudrait idéalement qu'on conserve à la place de la donnée du formulaire une valeur sentinelle par exemple la référence du formulaire qui vient d'être soumis, si on trouve ça au lieu du magictoken normal alors on renvoie vers le formulaire soumis en BO ou FO (ça dépend d'où on part).

Ça ne va pas corriger absolument le problème vu que tout ça n'est pas transactionnel, le pire qu'on pourra avoir vu l'ordre[1] des actions c'est un formulaire créé sans que le magictoken ait été nettoyé/mis à jour (mais je pense que ça dépend surtout du comportement de uwsgi/gunicorn en cas de fermeture de la connexion par le navigateur suite à l'appui sur Back)

fn1. <pre>
1022 filled.store()
1023 self.set_tracking_code(filled)
1024 session.remove_magictoken(get_request().form.get('magictoken'))
</pre>

je remplacerais remplacerait donc

<pre>
session.remove_magictoken(get_request().form.get('magictoken'))
</pre>

par


<pre>
mt = session.get_by_magictoken(get_request().form.get('magictoken'))
mt['new_formdata_url'] = filled.get_url(get_request().is_in_backoffice())
</pre>

et quelque part en début de traitement de la vue des formulaires il faut mettre un truc du genre:

<pre>
if session.get_by_magictoken(magictoken, {}).get('new_formdata_url'):
return redirect(session.get_by_magictoken(magictoken, {})['new_formdata_url'])
</pre>

Il est aussi fortement probable que je ne comprenne pas du tout le vrai problème.

Retour