Projet

Général

Profil

Bug #43242

jump vers un saut précédent : crash si le statut n'existe plus

Ajouté par Thomas Noël il y a presque 4 ans. Mis à jour il y a presque 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
24 mai 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Si un statut d'un workflow a été supprimé alors que des demandes ont ce statut enregistré comme "marqueur précédent", on a un KeyError dans pop_previous_marked_status :

    def pop_previous_marked_status(self):
        if not self.workflow_data or not '_markers_stack' in self.workflow_data:
            return None
        try:
            marker_data = self.workflow_data['_markers_stack'].pop()
            status_id = marker_data['status_id']
        except IndexError:
            return None
        return self.formdef.workflow.get_status(status_id)       <---- KeyError, le statut n'existe plus

Un petit test qui montre le soucis :

diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py
index d4921da6..a8eb586a 100644
--- a/tests/test_backoffice_pages.py
+++ b/tests/test_backoffice_pages.py
@@ -5247,6 +5247,25 @@ def test_workflow_jump_previous_auto(pub):
     assert formdata.status == 'wf-south'
     assert formdata.workflow_data['_markers_stack'] == [{'status_id': 'north'}]

+    # no marker (workflow inconsistency)
+    formdata.workflow_data['_markers_stack'] = []
+    formdata.store()
+    resp = app.get('/backoffice/management/form-title/%s/' % formdata.id)
+    resp = resp.form.submit('button_back')
+    resp = resp.follow()
+    formdata = formdef.data_class().get(formdata.id)
+    assert formdata.status == 'wf-south'
+    assert not formdata.workflow_data['_markers_stack']
+
+    # unknown marker (workflow inconsistency)
+    formdata.workflow_data['_markers_stack'] = [{'status_id': 'unknown_status'}]
+    formdata.store()
+    resp = app.get('/backoffice/management/form-title/%s/' % formdata.id)
+    resp = resp.form.submit('button_back')
+    resp = resp.follow()
+    formdata = formdef.data_class().get(formdata.id)
+    assert formdata.status == 'wf-south'
+

Le premier test sans aucun marqueur passe, mais pas le second où le statut pointé par le marqueur n'existe pas.

(À noter qu'à ma connaissance ça n'est jamais arrivé en vrai, j'ai juste repéré le truc suite à la relecture de #42854)


Fichiers

Révisions associées

Révision a5dde9f9 (diff)
Ajouté par Lauréline Guérin il y a presque 4 ans

workflow: fix auto jump to unknown status (#43242)

Historique

#1

Mis à jour par Lauréline Guérin il y a presque 4 ans

  • Assigné à mis à Lauréline Guérin
#2

Mis à jour par Lauréline Guérin il y a presque 4 ans

#3

Mis à jour par Frédéric Péters il y a presque 4 ans

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

Mis à jour par Lauréline Guérin il y a presque 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit a5dde9f9c9c596b9f54f925beb3a90343fe5bf89
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Mon Jun 22 14:38:44 2020 +0200

    workflow: fix auto jump to unknown status (#43242)
#5

Mis à jour par Frédéric Péters il y a presque 4 ans

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

Formats disponibles : Atom PDF