From 592058cfc5f75812ff5c36e70aec63ca34d1fc6d Mon Sep 17 00:00:00 2001 From: helmutm Date: Sun, 27 Apr 2008 20:57:32 +0000 Subject: [PATCH] fix bug in state event notification - moved notify() call to StatefulAdapter git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2562 fd906abe-77d9-0310-91a1-e0d9ade77398 --- stateful/README.txt | 1 + stateful/base.py | 28 +++++++++++++++++++++++++--- stateful/definition.py | 20 +------------------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/stateful/README.txt b/stateful/README.txt index ef27cdb..4179269 100644 --- a/stateful/README.txt +++ b/stateful/README.txt @@ -28,6 +28,7 @@ state. We can now execute the `finish` Transition. >>> demo.doTransition('finish') + 'finish' >>> demo.getState() 'finished' diff --git a/stateful/base.py b/stateful/base.py index cbbb304..9107dab 100644 --- a/stateful/base.py +++ b/stateful/base.py @@ -26,10 +26,13 @@ from persistent.interfaces import IPersistent from persistent.mapping import PersistentMapping from zope import component from zope.component import adapts +from zope.component.interfaces import ObjectEvent +from zope.event import notify from zope.interface import implements -from cybertools.stateful.interfaces import IStateful, IStatefulIndexInfo from cybertools.stateful.definition import statesDefinitions +from cybertools.stateful.interfaces import IStateful, IStatefulIndexInfo +from cybertools.stateful.interfaces import ITransitionEvent class Stateful(object): @@ -52,12 +55,12 @@ class Stateful(object): sd = self.getStatesDefinition() if isinstance(transition, basestring): sd.doTransitionFor(self, transition) - return + return transition available = [t.name for t in sd.getAvailableTransitionsFor(self)] for tr in transition: if tr in available: sd.doTransitionFor(self, tr) - return + return tr raise ValueError("None of the transitions '%s' is available for state '%s'." % (repr(transition), self.getState())) @@ -95,6 +98,12 @@ class StatefulAdapter(Stateful): statesAttr[self.statesDefinition] = value state = property(getState, setState) + def doTransition(self, transition, historyInfo=None): + previousState = self.getState() + transition = super(StatefulAdapter, self).doTransition(transition, historyInfo) + transition = self.getStatesDefinition().transitions[transition] + notify(TransitionEvent(self.context, transition, previousState)) + class IndexInfo(object): @@ -111,3 +120,16 @@ class IndexInfo(object): stf = component.getAdapter(self.context, IStateful, name=std) yield ':'.join((std, stf.state)) + +# event + +class TransitionEvent(ObjectEvent): + + implements(ITransitionEvent) + + def __init__(self, obj, transition, previousState): + super(TransitionEvent, self).__init__(obj) + self.transition = transition + self.previousState = previousState + + diff --git a/stateful/definition.py b/stateful/definition.py index c6f6027..a7708ae 100644 --- a/stateful/definition.py +++ b/stateful/definition.py @@ -22,14 +22,11 @@ State definition implementation. $Id$ """ -from zope.component.interfaces import ObjectEvent -from zope.event import notify from zope.interface import implements from cybertools.util.jeep import Jeep from cybertools.stateful.interfaces import IState, ITransition from cybertools.stateful.interfaces import IStatesDefinition -from cybertools.stateful.interfaces import ITransitionEvent class State(object): @@ -86,28 +83,13 @@ class StatesDefinition(object): if transition not in [t.name for t in self.getAvailableTransitionsFor(obj)]: raise ValueError("Transition '%s' is not reachable from state '%s'." % (transition, obj.getState())) - transObject = self.transitions[transition] - previousState = obj.state - obj.state = transObject.targetState - notify(TransitionEvent(obj, transObject, previousState)) + obj.state = self.transitions[transition].targetState def getAvailableTransitionsFor(self, obj): state = obj.getState() return [self.transitions[t] for t in self.states[state].transitions] -# event - -class TransitionEvent(ObjectEvent): - - implements(ITransitionEvent) - - def __init__(self, obj, transition, previousState): - super(TransitionEvent, self).__init__(obj) - self.transition = transition - self.previousState = previousState - - # dummy default states definition defaultSD = StatesDefinition('default',