[Checkins] SVN: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/ zope.wfmc finishWorkitem temporary fix

Adam Groszer adamg at fw.hu
Thu Sep 21 05:12:07 EDT 2006


Log message for revision 70280:
  zope.wfmc finishWorkitem temporary fix
  read ExtendedAttributes from xpdl

Changed:
  U   z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/interfaces.py
  U   z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/process.py
  D   z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/wfmcpersistent-configure.zcml
  U   z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/xpdl.py
  A   z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/z3c.wfmcpersistent-configure.zcml

-=-
Modified: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/interfaces.py
===================================================================
--- z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/interfaces.py	2006-09-21 05:36:16 UTC (rev 70279)
+++ z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/interfaces.py	2006-09-21 09:12:04 UTC (rev 70280)
@@ -20,25 +20,30 @@
 from zope import interface
 
 class IProcessDefinitionRegistry(interface.Interface):
-	"""Process definition registry."""
+    """Process definition registry."""
 
-	def addProcessDefinition(processDefinition):
-		"""Add a new process definition.
-		the ID will be the processDefinition.id"""
+    def addProcessDefinition(processDefinition):
+        """Add a new process definition.
+        the ID will be the processDefinition.id"""
 
-	def getProcessDefinition(id):
-		"""Returns a definition given its ID.
-		
-		Raise a KeyError if no process definition is available.
-		"""
+    def getProcessDefinition(id):
+        """Returns a definition given its ID.
+        
+        Raise a KeyError if no process definition is available.
+        """
 
-	def getProcessDefinitions():
-		"""Returns all process definitions."""
+    def getProcessDefinitions():
+        """Returns all process definitions."""
 
-	def getProcessDefinitionIDs():
-		"""Returns all process definition IDs."""
-		
-	def delProcessDefinition(id):
-		"""Del a process definition given its ID."""
-	
-
+    def getProcessDefinitionIDs():
+        """Returns all process definition IDs."""
+        
+    def delProcessDefinition(id):
+        """Del a process definition given its ID."""
+    
+class IExtendedAttribute(interface.Interface):
+    """Extended XPDL attributes."""
+    
+    __name__ = interface.Attribute("Name of the extended attribute")
+    value = interface.Attribute("Value of the extended attribute")
+    content = interface.Attribute("XML content, long value of the extended attribute")
\ No newline at end of file

Modified: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/process.py
===================================================================
--- z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/process.py	2006-09-21 05:36:16 UTC (rev 70279)
+++ z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/process.py	2006-09-21 09:12:04 UTC (rev 70280)
@@ -30,7 +30,8 @@
     name = u''
 
     def __repr__(self):
-        return "TransitionDefinitionPersistent(from=%r, to=%r)" %(self.from_, self.to)
+        return "TransitionDefinitionPersistent(from=%r, to=%r)" %(self.from_,
+                                                                  self.to)
 
 
 class ProcessDefinition(zope.wfmc.process.ProcessDefinition, Persistent):
@@ -68,10 +69,66 @@
             self.process_definition_identifier)
     
     definition = property(definition)
+    
+    #Activity is buggy in zope.wfmc, until it's solved here is patched
+    def transition(self, activity, transitions):
+        if transitions:
+            definition = self.definition
 
+            for transition in transitions:
+                activity_definition = definition.activities[transition.to]
+                next = None
+                if activity_definition.andJoinSetting:
+                    # If it's an and-join, we want only one.
+                    for i, a in self.activities.items():
+                        if a.activity_definition_identifier == transition.to:
+                            # we already have the activity -- use it
+                            next = a
+                            break
+
+                if next is None:
+                    next = Activity(self, activity_definition)
+                    self.nextActivityId += 1
+                    next.id = self.nextActivityId
+
+                zope.event.notify(zope.wfmc.process.Transition(activity, next))
+                self.activities[next.id] = next
+                next.start(transition)
+
+        if activity is not None:
+            del self.activities[activity.id]
+            if not self.activities:
+                self._finish()
+
+        self._p_changed = True
+    #Activity is buggy in zope.wfmc, until it's solved here is patched
+
     def __repr__(self):
         return "ProcessPersistent(%r)" % self.process_definition_identifier
 
+class Activity(zope.wfmc.process.Activity):
+    #Activity is buggy in zope.wfmc, until it's solved here is patched
+    def finish(self):
+        zope.event.notify(zope.wfmc.process.ActivityFinished(self))
+
+        definition = self.definition
+
+        transitions = []
+        for transition in definition.outgoing:
+            if transition.condition(self.process.workflowRelevantData):
+                transitions.append(transition)
+                if not definition.andSplitSetting:
+                    break # xor split, want first one
+        
+        #THIS is the difference
+        if not transitions and definition.outgoing:
+            raise zope.wfmc.interfaces.ProcessError(
+                    "No valid transitions found")
+        #THIS is the difference
+        
+        self.process.transition(self, transitions)
+    #Activity is buggy in zope.wfmc, until it's solved here is patched
+
 class Application(zope.wfmc.process.Application, Persistent):
 
     def __repr__(self):
@@ -79,7 +136,8 @@
                            if param.input == True])
         output = u', '.join([param.__name__ for param in self.parameters
                            if param.output == True])        
-        return "<ApplicationPersistent %r: (%s) --> (%s)>" %(self.__name__, input, output)
+        return "<ApplicationPersistent %r: (%s) --> (%s)>" %(self.__name__,
+                                                             input, output)
         
 
 class Participant(zope.wfmc.process.Participant, Persistent):

Deleted: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/wfmcpersistent-configure.zcml
===================================================================
--- z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/wfmcpersistent-configure.zcml	2006-09-21 05:36:16 UTC (rev 70279)
+++ z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/wfmcpersistent-configure.zcml	2006-09-21 09:12:04 UTC (rev 70280)
@@ -1 +0,0 @@
-<include package="z3c.wfmcpersistent"/>

Modified: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/xpdl.py
===================================================================
--- z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/xpdl.py	2006-09-21 05:36:16 UTC (rev 70279)
+++ z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/xpdl.py	2006-09-21 09:12:04 UTC (rev 70280)
@@ -20,8 +20,13 @@
 import xml.sax.xmlreader
 import xml.sax.handler
 
+from persistent.dict import PersistentDict
+
+from zope.interface import implements
+
 import zope.wfmc.xpdl
 
+from z3c.wfmcpersistent.interfaces import IExtendedAttribute
 import z3c.wfmcpersistent.process
 
 class XPDLHandler(zope.wfmc.xpdl.XPDLHandler):
@@ -32,6 +37,36 @@
     ActivityDefinitionFactory = z3c.wfmcpersistent.process.ActivityDefinition
     TransitionDefinitionFactory = z3c.wfmcpersistent.process.TransitionDefinition
     
+    def __init__(self, package):
+        zope.wfmc.xpdl.XPDLHandler.__init__(self, package)
+        self.start_handlers[(zope.wfmc.xpdl.xpdlns,
+                             'ExtendedAttribute')] = \
+                             XPDLHandler.ExtendedAttributeHnd
+        self.end_handlers[(zope.wfmc.xpdl.xpdlns,
+                           'ExtendedAttribute')] = \
+                           XPDLHandler.extendedattributeHnd
+        
+    def ExtendedAttributeHnd(self, attrs):
+        name = attrs.get((None, 'Name'))
+        value = attrs.get((None, 'Value'))
+        return ExtendedAttribute(name, value)
+    
+    def extendedattributeHnd(self, eattribute):
+        obj = self.stack[-1]
+        if not hasattr(obj, 'ExtendedAttributes'):
+            obj.ExtendedAttributes = PersistentDict()
+        complex = self.text.strip()
+        eattribute.content = complex
+        obj.ExtendedAttributes[eattribute.__name__]=eattribute
+
+class ExtendedAttribute(object):
+    implements(IExtendedAttribute)
+    
+    def __init__(self, name, value=None):
+        self.__name__ = name
+        self.value = value
+        self.content = None
+
 def read(file):
     src = xml.sax.xmlreader.InputSource(getattr(file, 'name', '<string>'))
     src.setByteStream(file)

Copied: z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/z3c.wfmcpersistent-configure.zcml (from rev 70096, z3c.wfmcpersistent/trunk/src/z3c/wfmcpersistent/wfmcpersistent-configure.zcml)



More information about the Checkins mailing list