# HG changeset patch # User Sylvain Thénault # Date 1269856306 -7200 # Node ID 5de07c77d73fd15fa61e764c5877dab64f8cb694 # Parent 14906474c55d18dc2c009e2a792c2c4f962849bd [workflow] support for automatic transition starting from the initial state diff -r 14906474c55d -r 5de07c77d73f entities/test/unittest_wfobjs.py --- a/entities/test/unittest_wfobjs.py Mon Mar 29 11:51:02 2010 +0200 +++ b/entities/test/unittest_wfobjs.py Mon Mar 29 11:51:46 2010 +0200 @@ -443,19 +443,21 @@ class AutoTransitionTC(CubicWebTC): - def setup_database(self): - self.wf = add_wf(self, 'CWUser') - asleep = self.wf.add_state('asleep', initial=True) - dead = self.wf.add_state('dead') - self.wf.add_transition('rest', asleep, asleep) - self.wf.add_transition('sick', asleep, dead, type=u'auto', - conditions=({'expr': u'U surname "toto"', - 'mainvars': u'U'},)) + def setup_custom_wf(self): + wf = add_wf(self, 'CWUser') + asleep = wf.add_state('asleep', initial=True) + dead = wf.add_state('dead') + wf.add_transition('rest', asleep, asleep) + wf.add_transition('sick', asleep, dead, type=u'auto', + conditions=({'expr': u'X surname "toto"', + 'mainvars': u'X'},)) + return wf def test_auto_transition_fired(self): + wf = self.setup_custom_wf() user = self.create_user('member') self.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s', - {'wf': self.wf.eid, 'x': user.eid}) + {'wf': wf.eid, 'x': user.eid}) self.commit() user.clear_all_caches() self.assertEquals(user.state, 'asleep') @@ -469,7 +471,7 @@ ['rest']) self.assertEquals(parse_hist(user.workflow_history), [('asleep', 'asleep', 'rest', None)]) - self.request().user.set_attributes(surname=u'toto') # fulfill condition + user.set_attributes(surname=u'toto') # fulfill condition self.commit() user.fire_transition('rest') self.commit() @@ -480,6 +482,26 @@ ('asleep', 'asleep', 'rest', None), ('asleep', 'dead', 'sick', None),]) + def test_auto_transition_custom_initial_state_fired(self): + wf = self.setup_custom_wf() + user = self.create_user('member', surname=u'toto') + self.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s', + {'wf': wf.eid, 'x': user.eid}) + self.commit() + self.assertEquals(user.state, 'dead') + + def test_auto_transition_initial_state_fired(self): + wf = self.execute('Any WF WHERE ET default_workflow WF, ' + 'ET name %(et)s', {'et': 'CWUser'}).get_entity(0, 0) + dead = wf.add_state('dead') + wf.add_transition('sick', wf.state_by_name('activated'), dead, + type=u'auto', conditions=({'expr': u'X surname "toto"', + 'mainvars': u'X'},)) + self.commit() + user = self.create_user('member', surname=u'toto') + self.commit() + self.assertEquals(user.state, 'dead') + class WorkflowHooksTC(CubicWebTC): diff -r 14906474c55d -r 5de07c77d73f hooks/workflow.py --- a/hooks/workflow.py Mon Mar 29 11:51:02 2010 +0200 +++ b/hooks/workflow.py Mon Mar 29 11:51:46 2010 +0200 @@ -45,7 +45,7 @@ state = entity.current_workflow.initial if state: session.add_relation(entity.eid, 'in_state', state.eid) - + _FireAutotransitionOp(session, entity=entity) class _FireAutotransitionOp(hook.Operation): """try to fire auto transition after state changes""" @@ -86,6 +86,7 @@ if entity.current_state.eid != deststate.eid: _change_state(session, entity.eid, entity.current_state.eid, deststate.eid) + _FireAutotransitionOp(session, entity=entity) return msg = session._('workflow changed to "%s"') msg %= session._(mainwf.name)