def completeWorkitem(self, instance_id, workitem_id, REQUEST=None):
     """ declares the completion of the specified workitem of the given instance """
     instance, workitem, process, activity = self.getEnvironment(instance_id, workitem_id)
     if REQUEST:
         actor = REQUEST.AUTHENTICATED_USER.getUserName()
     else:
         actor = 'Engine'
     if REQUEST:
         if not actor == workitem.actor:
             raise "WorkitemActionError","Invalid Workflow Actor"
     if instance.isActiveOrRunning():
         workitem_return_id = None
         if workitem.status in ('active', 'fallout'):
             workitem.setStatus('complete', actor=actor)
             if instance.getActiveWorkitems() == 0 and instance.status!='running':
                 instance.setStatus(status='running', actor=actor)
             if self.isEnd(workitem.process_id, workitem.activity_id):
                 subflow_workitem_id = self.getSubflowWorkitem(instance_id, workitem_id, workitem.process_id)
                 if subflow_workitem_id:
                     self.completeSubflow(instance_id, subflow_workitem_id)
                 else:
                     instance.setStatus(status='complete', actor=actor)
         if activity.isAutoFinish() and not process.end == activity.id and \
            not (activity.kind=='dummy' or activity.kind=='subflow'):
             self.forwardWorkitem(instance_id, workitem_id)
         if REQUEST is not None: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
     else:
         raise "WorkitemActionError","Wrong workitem enviroment"
 def terminateInstance(self, instance_id=None, REQUEST=None):
     """ terminate a specified instance """
     instance = getattr(self, instance_id)
     if instance.status != 'complete':
         if REQUEST:
             actor=REQUEST.AUTHENTICATED_USER.getUserName()
         else:
             actor='Engine'
         instance.setStatus(status='terminated', actor=actor)
     else:
         raise "InstanceActionError","Instance in wrong status"
     if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
 def resumeInstance(self, instance_id=None, REQUEST=None):
     """ suspend a specified instance """
     instance = getattr(self, instance_id)
     if instance.status == 'suspended':
         if REQUEST:
             actor=REQUEST.AUTHENTICATED_USER.getUserName()
         else:
             actor='Engine'
         instance.setStatus(status=instance.old_status, actor=actor)
         instance.old_status = ''
     else:
         raise "InstanceActionError","Instance in wrong status"
     if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
 def suspendWorkitem(self, instance_id, workitem_id, REQUEST=None):
     """ declares the suspension of the specified workitem of the given instance """
     instance = getattr(self, instance_id)
     workitem = getattr(instance, str(workitem_id))
     if REQUEST:
         actor = REQUEST.AUTHENTICATED_USER.getUserName()
     else:
         actor = 'Engine'
     if REQUEST:
         if  workitem.actor and workitem.actor != actor:
             raise "Invalid Workflow Actor: %s"%actor
     if instance.isActiveOrRunning() and workitem.status == 'inactive' and not workitem.blocked:
         workitem.setStatus('suspended', actor=actor)
         if instance.getActiveWorkitems() == 0 and not instance.status=='running':
             instance.setStatus(status='running', actor=actor)
     else:
         raise "WorkitemActionError","Wrong workitem enviroment"
     if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
 def startInstance(self, instance_id, REQUEST=None):
     """ Starts the flowing of the process instance inside the process definition """
     instance = getattr(self, instance_id)
     if instance.status == 'initiated':
         if REQUEST:
             actor=REQUEST.AUTHENTICATED_USER.getUserName()
         else:
             actor='Engine'
         instance.setStatus(status='running', actor=actor)
         process_id = instance.begin_process_id
         activity_id = instance.begin_activity_id
         push_roles = getattr(getattr(self,process_id),activity_id).getPushRoles()
         pull_roles = getattr(getattr(self,process_id),activity_id).getPullRoles()
         w = instance.addWorkitem(process_id, activity_id, 0, push_roles, pull_roles)
         self.manageWorkitemCreation(instance_id, w.id)
         if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
     else:
         raise "InstanceActionError","Instance in wrong status"
 def inactivateWorkitem(self, instance_id, workitem_id, REQUEST=None):
     """ declares the inactivation of the specified workitem of the given instance """
     instance = getattr(self, instance_id)
     workitem = getattr(instance, str(workitem_id))
     if REQUEST:
         actor=REQUEST.AUTHENTICATED_USER.getUserName()
     else:
         actor='Engine'
     if REQUEST:
         if not (actor == workitem.actor or \
            REQUEST.AUTHENTICATED_USER.has_permission('Manage OpenFlow', self)):
             raise "WorkitemActionError","Invalid actor"
     if instance.isActiveOrRunning() and workitem.status == 'active' and not workitem.blocked:
         workitem.setStatus('inactive', actor=actor)
         if instance.getActiveWorkitems() == 0 and instance.status!='running':
             instance.setStatus(status='running', actor=actor)
     else:
         raise "WorkitemActionError","Wrong workitem enviroment"
     if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)
 def activateWorkitem(self, instance_id, workitem_id, actor=None, REQUEST=None):
     """ declares the activation of the specified workitem of the given instance """
     instance = getattr(self, instance_id)
     workitem = getattr(instance, str(workitem_id))
     if REQUEST:
         action_actor=REQUEST.AUTHENTICATED_USER.getUserName()
         if not [r for r in REQUEST.AUTHENTICATED_USER.getRolesInContext(self) if r in workitem.pull_roles]:
             raise "PermissionError","User don't have pull role"
     else:
         action_actor='Engine'
     if instance.isActiveOrRunning() and workitem.status == 'inactive' and not workitem.blocked:
         if actor is not None and workitem.actor == '':
             self.assignWorkitem(instance_id, workitem_id, actor)
         workitem.setStatus('active', actor=action_actor)
         if instance.status!='active':
           instance.setStatus(status='active', actor=action_actor)
     else:
         raise "WorkitemActionError","Wrong workitem enviroment"
     if REQUEST: REQUEST.RESPONSE.redirect(REQUEST.HTTP_REFERER)