# HG changeset patch # User Alexandre Fayolle # Date 1296133844 -3600 # Node ID f07dc0e8948d56781100a42599bba73b1d60ac65 # Parent 449e5b46ed3defd9f1ad9fd11c5b37591bcab164 fix #1452413 : is_in_state selector does not match initial state of an entity diff -r 449e5b46ed3d -r f07dc0e8948d selectors.py --- a/selectors.py Thu Jan 27 13:43:49 2011 +0100 +++ b/selectors.py Thu Jan 27 14:10:44 2011 +0100 @@ -1186,11 +1186,13 @@ """ def __init__(self, *states): def score(entity, states=set(states)): - trinfo = entity.cw_adapt_to('IWorkflowable').latest_trinfo() - try: - return trinfo.new_state.name in states - except AttributeError: - return None + adapted = entity.cw_adapt_to('IWorkflowable') + trinfo = adapted.latest_trinfo() + if trinfo is None: # entity is probably in it's initial state + statename = adapted.state + else: + statename = trinfo.new_state.name + return statename in states super(is_in_state, self).__init__(score) diff -r 449e5b46ed3d -r f07dc0e8948d test/data/schema.py --- a/test/data/schema.py Thu Jan 27 13:43:49 2011 +0100 +++ b/test/data/schema.py Thu Jan 27 14:10:44 2011 +0100 @@ -19,7 +19,9 @@ """ -from yams.buildobjs import EntityType, String, SubjectRelation, RelationDefinition +from yams.buildobjs import (EntityType, String, SubjectRelation, + RelationDefinition) +from cubicweb.schema import WorkflowableEntityType class Personne(EntityType): nom = String(required=True) @@ -48,3 +50,8 @@ class evaluee(RelationDefinition): subject = 'CWUser' object = 'Note' + +class StateFull(WorkflowableEntityType): + name = String() + + diff -r 449e5b46ed3d -r f07dc0e8948d test/unittest_selectors.py --- a/test/unittest_selectors.py Thu Jan 27 13:43:49 2011 +0100 +++ b/test/unittest_selectors.py Thu Jan 27 14:10:44 2011 +0100 @@ -24,9 +24,10 @@ from cubicweb.devtools.testlib import CubicWebTC from cubicweb.appobject import Selector, AndSelector, OrSelector from cubicweb.selectors import (is_instance, adaptable, match_user_groups, - multi_lines_rset, score_entity) + multi_lines_rset, score_entity, is_in_state) from cubicweb.interfaces import IDownloadable from cubicweb.web import action +from cubicweb.server.migractions import ServerMigrationHelper class _1_(Selector): def __call__(self, *args, **kwargs): @@ -137,6 +138,37 @@ selector |= _0_() self.assertEqual(selector(None), 0) +class IsInStateSelectorTC(CubicWebTC): + def setup_database(self): + mh = ServerMigrationHelper(self.repo.config, None, + repo=self.repo, cnx=self.cnx, + interactive=False) + wf = mh.cmd_add_workflow('testwf', 'StateFull', default=True) + initial = wf.add_state(u'initial', initial=True) + final = wf.add_state(u'final') + wf.add_transition(u'forward', (initial,), final) + + def test_initial_state(self): + req = self.request() + entity = req.create_entity('StateFull') + selector = is_in_state(u'initial') + self.commit() + score = selector(entity.__class__, None, entity=entity) + self.assertEqual(score, 1) + + def test_final_state(self): + req = self.request() + entity = req.create_entity('StateFull') + selector = is_in_state(u'initial') + self.commit() + entity.cw_adapt_to('IWorkflowable').fire_transition(u'forward') + self.commit() + score = selector(entity.__class__, None, entity=entity) + self.assertEqual(score, 0) + selector = is_in_state(u'final') + score = selector(entity.__class__, None, entity=entity) + self.assertEqual(score, 1) + class ImplementsSelectorTC(CubicWebTC): def test_etype_priority(self):