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')