provide separate notify() method for stateful objects to control notification by subclasses

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2563 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-04-28 07:58:08 +00:00
parent 592058cfc5
commit b9a0105604
2 changed files with 12 additions and 8 deletions

View file

@ -28,7 +28,6 @@ state.
We can now execute the `finish` Transition.
>>> demo.doTransition('finish')
'finish'
>>> demo.getState()
'finished'

View file

@ -53,14 +53,17 @@ class Stateful(object):
def doTransition(self, transition, historyInfo=None):
sd = self.getStatesDefinition()
previousState = self.getState()
if isinstance(transition, basestring):
sd.doTransitionFor(self, transition)
return transition
self.notify(transition, previousState)
return
available = [t.name for t in sd.getAvailableTransitionsFor(self)]
for tr in transition:
if tr in available:
sd.doTransitionFor(self, tr)
return tr
self.notify(tr, previousState)
return
raise ValueError("None of the transitions '%s' is available for state '%s'."
% (repr(transition), self.getState()))
@ -74,6 +77,10 @@ class Stateful(object):
def getStatesDefinition(self):
return statesDefinitions.get(self.statesDefinition, None)
def notify(self, transition, previousState):
""" To be implemented by subclass.
"""
class StatefulAdapter(Stateful):
""" An adapter for persistent objects to make them stateful.
@ -98,11 +105,9 @@ 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))
def notify(self, transition, previousState):
transObject = self.getStatesDefinition().transitions[transition]
notify(TransitionEvent(self.context, transObject, previousState))
class IndexInfo(object):