[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)