mark states of previous work items on close
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3170 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									295b168215
								
							
						
					
					
						commit
						57f943707c
					
				
					 2 changed files with 47 additions and 13 deletions
				
			
		| 
						 | 
					@ -42,7 +42,7 @@ _not_found = object()
 | 
				
			||||||
def workItemStates():
 | 
					def workItemStates():
 | 
				
			||||||
    return StatesDefinition('workItemStates',
 | 
					    return StatesDefinition('workItemStates',
 | 
				
			||||||
        State('new', 'new',
 | 
					        State('new', 'new',
 | 
				
			||||||
              ('plan', 'accept', 'start', 'work', 'finish', 'modify', 'delegate'),
 | 
					              ('plan', 'accept', 'start', 'work', 'finish', 'delegate'),
 | 
				
			||||||
              color='red'),
 | 
					              color='red'),
 | 
				
			||||||
        State('planned', 'planned',
 | 
					        State('planned', 'planned',
 | 
				
			||||||
              ('plan', 'accept', 'start', 'work', 'finish', 'cancel', 'modify'),
 | 
					              ('plan', 'accept', 'start', 'work', 'finish', 'cancel', 'modify'),
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,14 @@ def workItemStates():
 | 
				
			||||||
              ('plan', 'accept', 'start', 'work', 'modify', 'close'),
 | 
					              ('plan', 'accept', 'start', 'work', 'modify', 'close'),
 | 
				
			||||||
              color='grey'),
 | 
					              color='grey'),
 | 
				
			||||||
        State('closed', 'closed', (), color='lightblue'),
 | 
					        State('closed', 'closed', (), color='lightblue'),
 | 
				
			||||||
 | 
					        # not directly reachable states:
 | 
				
			||||||
 | 
					        State('delegated', 'delegated', (), color='purple'),
 | 
				
			||||||
 | 
					        State('delegated_x', 'delegated', (), color='purple'),
 | 
				
			||||||
        State('replaced', 'replaced', (), color='grey'),
 | 
					        State('replaced', 'replaced', (), color='grey'),
 | 
				
			||||||
 | 
					        State('planned_x', 'planned', (), color='red'),
 | 
				
			||||||
 | 
					        State('accepted_x', 'accepted', (), color='yellow'),
 | 
				
			||||||
 | 
					        State('done_x', 'done', (), color='lightgreen'),
 | 
				
			||||||
 | 
					        # transitions:
 | 
				
			||||||
        Transition('plan', 'plan', 'planned'),
 | 
					        Transition('plan', 'plan', 'planned'),
 | 
				
			||||||
        Transition('accept', 'accept', 'accepted'),
 | 
					        Transition('accept', 'accept', 'accepted'),
 | 
				
			||||||
        Transition('start', 'start working', 'running'),
 | 
					        Transition('start', 'start working', 'running'),
 | 
				
			||||||
| 
						 | 
					@ -151,15 +158,18 @@ class WorkItem(Stateful, Track):
 | 
				
			||||||
            raise AttributeError(attr)
 | 
					            raise AttributeError(attr)
 | 
				
			||||||
        return self.data.get(attr)
 | 
					        return self.data.get(attr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def currentWorkItems(self):
 | 
				
			||||||
 | 
					        return list(getParent(self).query(runId=self.runId))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def doAction(self, action, userName, **kw):
 | 
					    def doAction(self, action, userName, **kw):
 | 
				
			||||||
        currentWorkItems = list(getParent(self).query(runId=self.runId))
 | 
					        if self != self.currentWorkItems[-1]:
 | 
				
			||||||
        if self != currentWorkItems[-1]:
 | 
					 | 
				
			||||||
            raise ValueError("Actions are only allowed on the last item of a run.")
 | 
					            raise ValueError("Actions are only allowed on the last item of a run.")
 | 
				
			||||||
        if action in self.specialActions:
 | 
					 | 
				
			||||||
            return self.specialActions[action](self, userName, **kw)
 | 
					 | 
				
			||||||
        if action not in [t.name for t in self.getAvailableTransitions()]:
 | 
					        if action not in [t.name for t in self.getAvailableTransitions()]:
 | 
				
			||||||
            raise ValueError("Action '%s' not allowed in state '%s'" %
 | 
					            raise ValueError("Action '%s' not allowed in state '%s'" %
 | 
				
			||||||
                             (action, self.state))
 | 
					                             (action, self.state))
 | 
				
			||||||
 | 
					        if action in self.specialActions:
 | 
				
			||||||
 | 
					            return self.specialActions[action](self, userName, **kw)
 | 
				
			||||||
        if self.state == 'new':
 | 
					        if self.state == 'new':
 | 
				
			||||||
            self.setData(**kw)
 | 
					            self.setData(**kw)
 | 
				
			||||||
            self.doTransition(action)
 | 
					            self.doTransition(action)
 | 
				
			||||||
| 
						 | 
					@ -168,6 +178,9 @@ class WorkItem(Stateful, Track):
 | 
				
			||||||
        new = self.createNew(action, userName, **kw)
 | 
					        new = self.createNew(action, userName, **kw)
 | 
				
			||||||
        if self.state == 'running':
 | 
					        if self.state == 'running':
 | 
				
			||||||
            new.replace(self)
 | 
					            new.replace(self)
 | 
				
			||||||
 | 
					        elif self.state in ('planned', 'accepted', 'done'):
 | 
				
			||||||
 | 
					            self.state = self.state + '_x'
 | 
				
			||||||
 | 
					            self.reindex('state')
 | 
				
			||||||
        new.doTransition(action)
 | 
					        new.doTransition(action)
 | 
				
			||||||
        new.reindex('state')
 | 
					        new.reindex('state')
 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
| 
						 | 
					@ -181,12 +194,15 @@ class WorkItem(Stateful, Track):
 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def delegate(self, userName, **kw):
 | 
					    def delegate(self, userName, **kw):
 | 
				
			||||||
        new = self.createNew('delegate', userName, **kw)
 | 
					        if self.state == 'new':
 | 
				
			||||||
 | 
					            delegated = self
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            delegated = self.createNew('delegate', self.userName, **kw)
 | 
				
			||||||
 | 
					        delegated.state = 'delegated'
 | 
				
			||||||
 | 
					        delegated.reindex('state')
 | 
				
			||||||
 | 
					        new = delegated.createNew('plan', userName, **kw)
 | 
				
			||||||
        new.doTransition('plan')
 | 
					        new.doTransition('plan')
 | 
				
			||||||
        new.reindex('state')
 | 
					        new.reindex('state')
 | 
				
			||||||
        if self.state == 'new':
 | 
					 | 
				
			||||||
            self.doTransition('plan')
 | 
					 | 
				
			||||||
            self.reindex('state')
 | 
					 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def close(self, userName, **kw):
 | 
					    def close(self, userName, **kw):
 | 
				
			||||||
| 
						 | 
					@ -194,6 +210,10 @@ class WorkItem(Stateful, Track):
 | 
				
			||||||
        new.state = 'closed'
 | 
					        new.state = 'closed'
 | 
				
			||||||
        new.reindex('state')
 | 
					        new.reindex('state')
 | 
				
			||||||
        getParent(self).stopRun(runId=self.runId, finish=True)
 | 
					        getParent(self).stopRun(runId=self.runId, finish=True)
 | 
				
			||||||
 | 
					        for item in self.currentWorkItems:
 | 
				
			||||||
 | 
					            if item.state in ('planned', 'accepted', 'done',  'delegated'):
 | 
				
			||||||
 | 
					                item.state = item.state + '_x'
 | 
				
			||||||
 | 
					                item.reindex('state')
 | 
				
			||||||
        return new
 | 
					        return new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    specialActions = dict(modify=modify, delegate=delegate, close=close)
 | 
					    specialActions = dict(modify=modify, delegate=delegate, close=close)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,11 +75,13 @@ the effort is taken from the duration if not set explicitly.
 | 
				
			||||||
Change work item state
 | 
					Change work item state
 | 
				
			||||||
----------------------
 | 
					----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Now Jim accepts the work item, i.e. he wants to work on it.
 | 
					Now Jim accepts the work item, i.e. he wants to work on it. The previous
 | 
				
			||||||
 | 
					record keeps its state but it is marked by a "_x" suffix so that it may
 | 
				
			||||||
 | 
					be excluded from queries.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  >>> wi02 = wi01.doAction('accept', 'jim')
 | 
					  >>> wi02 = wi01.doAction('accept', 'jim')
 | 
				
			||||||
  >>> wi01.state
 | 
					  >>> wi01.state
 | 
				
			||||||
  'planned'
 | 
					  'planned_x'
 | 
				
			||||||
  >>> wi02
 | 
					  >>> wi02
 | 
				
			||||||
  <WorkItem ['001', 1, 'jim', '2008-12-22 14:22', 'accepted']:
 | 
					  <WorkItem ['001', 1, 'jim', '2008-12-22 14:22', 'accepted']:
 | 
				
			||||||
   {'duration': 700, 'start': 1229955772, 'created': ...,
 | 
					   {'duration': 700, 'start': 1229955772, 'created': ...,
 | 
				
			||||||
| 
						 | 
					@ -148,13 +150,14 @@ Delegation of Work Items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A user may delegate a newly created work item to another party. This
 | 
					A user may delegate a newly created work item to another party. This
 | 
				
			||||||
will create a new work item even if the initial one is still in state "new".
 | 
					will create a new work item even if the initial one is still in state "new".
 | 
				
			||||||
Both work items are now in "planned" state.
 | 
					The new work item is now in "planned" state, its predecessor is market as
 | 
				
			||||||
 | 
					delegated so that it may be selected by queries.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  >>> wi07 = workItems.add('001', 'john', start=1229970800)
 | 
					  >>> wi07 = workItems.add('001', 'john', start=1229970800)
 | 
				
			||||||
  >>> wi08 = wi07.doAction('delegate', 'john', party='annie')
 | 
					  >>> wi08 = wi07.doAction('delegate', 'john', party='annie')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  >>> wi07
 | 
					  >>> wi07
 | 
				
			||||||
  <WorkItem ['001', 2, 'john', '2008-12-22 18:33', 'planned']:
 | 
					  <WorkItem ['001', 2, 'john', '2008-12-22 18:33', 'delegated']:
 | 
				
			||||||
   {'start': 1229970800, 'created': ..., 'creator': 'john'}>
 | 
					   {'start': 1229970800, 'created': ..., 'creator': 'john'}>
 | 
				
			||||||
  >>> wi08
 | 
					  >>> wi08
 | 
				
			||||||
  <WorkItem ['001', 2, 'annie', '2008-12-22 18:33', 'planned']:
 | 
					  <WorkItem ['001', 2, 'annie', '2008-12-22 18:33', 'planned']:
 | 
				
			||||||
| 
						 | 
					@ -194,3 +197,14 @@ Runs
 | 
				
			||||||
  >>> list(tracks.finishedRuns)
 | 
					  >>> list(tracks.finishedRuns)
 | 
				
			||||||
  [1]
 | 
					  [1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Some Special Cases
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Close a run with some delegated items.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  >>> wi10 = wi09.doAction('finish', 'annie')
 | 
				
			||||||
 | 
					  >>> wi11 = wi10.doAction('close', 'john')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  >>> wi07.state
 | 
				
			||||||
 | 
					  'delegated_x'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue