summaryrefslogtreecommitdiff
path: root/src/mailman/workflows/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/workflows/base.py')
-rw-r--r--src/mailman/workflows/base.py22
1 files changed, 7 insertions, 15 deletions
diff --git a/src/mailman/workflows/base.py b/src/mailman/workflows/base.py
index e374d58b4..8153bf77d 100644
--- a/src/mailman/workflows/base.py
+++ b/src/mailman/workflows/base.py
@@ -70,7 +70,7 @@ class Workflow:
self._next.append(step)
def _pop(self):
- name = self._next.popleft()
+ name = self._next.pop()
step = getattr(self, '_step_{}'.format(name))
self._count += 1
if self.debug: # pragma: nocover
@@ -114,20 +114,12 @@ class Workflow:
assert self.token, 'Workflow token must be set'
state_manager = getUtility(IWorkflowStateManager)
data = {attr: getattr(self, attr) for attr in self.save_attributes}
- # Note: only the next step is saved, not the whole stack. This is not
- # an issue in practice, since there's never more than a single step in
- # the queue anyway. If we want to support more than a single step in
- # the queue *and* want to support state saving/restoring, change this
- # method and the restore() method.
+ # Save the workflow stack.
if len(self._next) == 0:
- step = None
- elif len(self._next) == 1:
- step = self._next[0]
+ steps = '[]'
else:
- raise AssertionError(
- "Can't save a workflow state with more than one step "
- "in the queue")
- state_manager.save(self.token, step, json.dumps(data))
+ steps = json.dumps(list(self._next))
+ state_manager.save(self.token, steps, json.dumps(data))
def restore(self):
"""See `IWorkflow`."""
@@ -137,8 +129,8 @@ class Workflow:
# The token doesn't exist in the database.
raise LookupError(self.token)
self._next.clear()
- if state.step:
- self._next.append(state.step)
+ if state.steps:
+ self._next.extend(json.loads(state.steps))
data = json.loads(state.data)
for attr in self.save_attributes:
try: