diff --git a/organize/stateful/README.txt b/organize/stateful/README.txt index cca4427..a84f0ba 100644 --- a/organize/stateful/README.txt +++ b/organize/stateful/README.txt @@ -70,12 +70,44 @@ Controlling classification quality >>> from loops.organize.stateful.quality import ClassificationQualityCheckable >>> component.provideAdapter(ClassificationQualityCheckable, ... name='loops.classification_quality') + >>> from loops.organize.stateful.quality import assign, deassign + >>> component.provideHandler(assign) + >>> component.provideHandler(deassign) >>> qcheckedDoc01 = component.getAdapter(doc01, IStateful, ... name='loops.classification_quality') >>> qcheckedDoc01.state 'unclassified' + >>> tCustomer = concepts['customer'] + >>> from loops.concept import Concept + >>> from loops.setup import addAndConfigureObject + >>> c01 = addAndConfigureObject(concepts, Concept, 'c01', conceptType=tCustomer, + ... title='im publishing') + >>> c02 = addAndConfigureObject(concepts, Concept, 'c02', conceptType=tCustomer, + ... title='DocFive') + + >>> c01.assignResource(doc01) + >>> qcheckedDoc01 = component.getAdapter(doc01, IStateful, + ... name='loops.classification_quality') + >>> qcheckedDoc01.state + 'classified' + + >>> c02.assignResource(doc01) + >>> qcheckedDoc01.state + 'classified' + + >>> qcheckedDoc01.doTransition('verify') + >>> qcheckedDoc01.state + 'verified' + + >>> c02.deassignResource(doc01) + >>> qcheckedDoc01.state + 'classified' + + >>> c01.deassignResource(doc01) + >>> qcheckedDoc01.state + 'unclassified' Fin de partie diff --git a/organize/stateful/configure.zcml b/organize/stateful/configure.zcml index f7732d6..64cf820 100644 --- a/organize/stateful/configure.zcml +++ b/organize/stateful/configure.zcml @@ -5,6 +5,8 @@ xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="loops"> + + @@ -19,4 +21,23 @@ set_schema="cybertools.stateful.interfaces.IStateful" /> + + + + + + + + + + + + + diff --git a/organize/stateful/quality.py b/organize/stateful/quality.py index c9a56b4..7513eef 100644 --- a/organize/stateful/quality.py +++ b/organize/stateful/quality.py @@ -22,12 +22,17 @@ Basic implementations for stateful objects and adapters. $Id$ """ +from zope import component +from zope.component import adapter from zope.interface import implementer +from zope.traversing.api import getName from cybertools.stateful.definition import registerStatesDefinition from cybertools.stateful.definition import StatesDefinition from cybertools.stateful.definition import State, Transition -from cybertools.stateful.interfaces import IStatesDefinition +from cybertools.stateful.interfaces import IStatesDefinition, IStateful +from loops.interfaces import IAssignmentEvent, IDeassignmentEvent +from loops.interfaces import ILoopsObject, IResource from loops.organize.stateful.base import StatefulLoopsObject @@ -35,11 +40,12 @@ from loops.organize.stateful.base import StatefulLoopsObject def classificationQuality(): return StatesDefinition('classificationQuality', State('unclassified', 'unclassified', ('classify',)), - State('classified', 'classified', ('check',)), - State('checked', 'checked', + State('classified', 'classified', + ('verify', 'change_classification', 'remove_classification')), + State('verified', 'verified', ('change_classification', 'remove_classification')), Transition('classify', 'classify', 'classified'), - Transition('check', 'check', 'checked'), + Transition('verify', 'verify', 'verified'), Transition('change_classification', 'change classification', 'classified'), Transition('remove_classification', 'remove classification', 'unclassified'), initialState='unclassified') @@ -48,3 +54,36 @@ def classificationQuality(): class ClassificationQualityCheckable(StatefulLoopsObject): statesDefinition = 'loops.classification_quality' + + +# event handlers + +@adapter(ILoopsObject, IAssignmentEvent) +def assign(obj, event): + target = event.relation.second + if not IResource.providedBy(target): + return + pred = event.relation.predicate + if getName(pred) == 'hasType': + return + stf = component.getAdapter(target, IStateful, name='loops.classification_quality') + if stf.state == 'unclassified': + stf.doTransition('classify') + else: + stf.doTransition('change_classification') + +@adapter(ILoopsObject, IDeassignmentEvent) +def deassign(obj, event): + target = event.relation.second + if not IResource.providedBy(target): + return + pred = event.relation.predicate + if getName(pred) == 'hasType': + return + stf = component.getAdapter(target, IStateful, name='loops.classification_quality') + if stf.state in ('classified', 'verified'): + old = target.getParentRelations() + if len(old) > 2: # the hasType relation always remains + stf.doTransition('change_classification') + else: + stf.doTransition('remove_classification')