[Zope-CVS] CVS: Packages3/workflow/stateful - exportimport.py:1.1 definition.py:1.2 instance.py:1.2
Ulrich Eck
ueck@net-labs.de
Wed, 5 Feb 2003 20:10:04 -0500
Update of /cvs-repository/Packages3/workflow/stateful
In directory cvs.zope.org:/tmp/cvs-serv29874/stateful
Modified Files:
definition.py instance.py
Added Files:
exportimport.py
Log Message:
- new ProcessDefinitionElementContainer
- extended tests
- Stateful ProcessDefinition/Instance:
+ basic functionality for Instance (getOutgoingTransitions/fireTransition)
- no relevant-data, conditions yet
- Added views for basic TTW interaction
=== Added File Packages3/workflow/stateful/exportimport.py ===
##############################################################################
#
# Copyright (c) 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Stateful workflow process XML Import/Export.
$Id: exportimport.py,v 1.1 2003/02/06 01:09:31 jack-e Exp $
"""
=== Packages3/workflow/stateful/definition.py 1.1 => 1.2 ===
--- Packages3/workflow/stateful/definition.py:1.1 Tue Feb 4 16:42:18 2003
+++ Packages3/workflow/stateful/definition.py Wed Feb 5 20:09:31 2003
@@ -25,10 +25,13 @@
from zope.proxy.context import getWrapperData
from zope.app.interfaces.workflow import IProcessDefinition
-from zope.app.interfaces.workflow.stateful \
- import IStatefulProcessDefinition, IState, ITransition
+from zope.app.interfaces.workflow.stateful import IStatefulProcessDefinition
+from zope.app.interfaces.workflow.stateful import IState, ITransition
+from zope.app.interfaces.workflow.stateful import IStatefulStatesContainer
+from zope.app.interfaces.workflow.stateful import IStatefulTransitionsContainer
from zope.app.workflow.definition import ProcessDefinition
+from zope.app.workflow.definition import ProcessDefinitionElementContainer
from zope.app.workflow.stateful.instance import StatefulProcessInstance
@@ -39,6 +42,11 @@
__implements__ = IState
+class StatesContainer(ProcessDefinitionElementContainer):
+ """Container that stores States.
+ """
+ __implements__ = IStatefulStatesContainer
+
class Transition:
@@ -48,16 +56,21 @@
def __init__(self, source, destination, condition):
super(Transition, self).__init__()
- self._source = source
- self._destination = destination
- self._condition = condition
+ self.__source = source
+ self.__destination = destination
+ self.__condition = condition
+
+ sourceState = property(lambda self: self.__source)
- sourceState = property(lambda self: self._source)
+ destinationState = property(lambda self: self.__destination)
- destinationState = property(lambda self: self._destination)
+ condition = property(lambda self: self.__condition)
- condition = property(lambda self: self._condition)
+class TransitionsContainer(ProcessDefinitionElementContainer):
+ """Container that stores Transitions.
+ """
+ __implements__ = IStatefulTransitionsContainer
@@ -69,55 +82,61 @@
def __init__(self):
super(StatefulProcessDefinition, self).__init__()
- self.__states = PersistentDict()
+ self.__states = StatesContainer()
initial = State()
- self.__states[self.getInitialStateName()] = initial
- self.__transitions = PersistentDict()
+ self.__states.setObject(self.getInitialStateName(), initial)
+ self.__transitions = TransitionsContainer()
+
############################################################
# Implementation methods for interface
# zope.app.interfaces.workflow.stateful.IStatefulProcessDefinition
+ states = property(lambda self: ContextWrapper(self.__states, self))
+
+ transitions = property(lambda self: ContextWrapper(self.__transitions,
+ self))
+
def addState(self, name, state):
- if name in self.__states:
+ if name in self.states:
raise KeyError, name
- self.__states[name] = state
-
+ self.states.setObject(name, state)
+
def getState(self, name):
- return ContextWrapper(self.__states[name], self)
+ return self.states[name]
getState = ContextMethod(getState)
-
+
def removeState(self, name):
- del self.__states[name]
-
+ del self.states[name]
+
def getStateNames(self):
- return self.__states.keys()
-
+ return self.states.keys()
+
def getInitialStateName(self):
return 'INITIAL'
-
+
def addTransition(self, name, transition):
- if name in self.__transitions:
+ if name in self.transitions:
raise KeyError, name
- self.__transitions[name] = transition
-
+ self.transitions.setObject(name, transition)
+
def getTransition(self, name):
- return ContextWrapper(self.__transitions[name], self)
+ return self.transitions[name]
getTransition = ContextMethod(getTransition)
-
+
def removeTransition(self, name):
- del self.__transitions[name]
-
+ del self.transitions[name]
+
def getTransitionNames(self):
- return self.__transitions.keys()
-
+ return self.transitions.keys()
+
# IProcessDefinition
def createProcessInstance(self):
pd_name = getWrapperData(self)['name']
- initial_state = self.getInitialState()
- pi_obj = StatefulProcessInstance(pd_name, initial_state)
+ pi_obj = StatefulProcessInstance(pd_name)
+ ContextWrapper(pi_obj, self).initialize()
return pi_obj
createProcessInstance = ContextMethod(createProcessInstance)
=== Packages3/workflow/stateful/instance.py 1.1 => 1.2 ===
--- Packages3/workflow/stateful/instance.py:1.1 Tue Feb 4 16:42:18 2003
+++ Packages3/workflow/stateful/instance.py Wed Feb 5 20:09:31 2003
@@ -23,6 +23,7 @@
from persistence import Persistent
from zope.component import getService
+from zope.proxy.context import ContextMethod
from zope.app.interfaces.workflow.stateful import IStatefulProcessInstance
from zope.app.workflow.instance import ProcessInstance
@@ -34,19 +35,38 @@
__implements__ = IStatefulProcessInstance
- def __init__(self, pd_name, initial_state):
- super(StatefulProcessInstance, self).__init__(pd_name, initial_state)
-
############################################################
# Implementation methods for interface
# zope.app.interfaces.workflow.IStatefulProcessInstance
+ def initialize(self):
+ pd = self._getProcessDefinition()
+ self._status = pd.getInitialStateName()
+ # create relevant-data, schema and permissions here
+ initialize = ContextMethod(initialize)
+
+
def getOutgoingTransitions(self):
- pass
+ ret = []
+ pd = self._getProcessDefinition()
+ for name, trans in pd.transitions.items():
+ if self.status == trans.sourceState:
+ # evaluate trans.condition
+ # and check permission
+ if 1:
+ ret.append(name)
+ return ret
+ getOutgoingTransitions = ContextMethod(getOutgoingTransitions)
def fireTransition(self, id):
- pass
+ pd = self._getProcessDefinition()
+ if not id in self.getOutgoingTransitions():
+ raise KeyError, 'Invalid Transition Id: %s' % id
+ trans = pd.transitions[id]
+ # modify relevant-data if needed
+ self._status = trans.destinationState
+ fireTransition = ContextMethod(fireTransition)
#
############################################################
@@ -54,8 +74,7 @@
def _getProcessDefinition(self):
"""Get the ProcessDefinition object from WorkflowService.
-
- only call from within a ContextWrapped Method.
"""
svc = getService(self, "Workflows")
- return svc.getProcessDefinition(self.processDefinition)
+ return svc.getProcessDefinition(self.processDefinitionName)
+ _getProcessDefinition = ContextMethod(_getProcessDefinition)