work in progressL: classification quality workflow

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2532 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-04-20 11:12:06 +00:00
parent fd4be51425
commit cbe2d994c5
3 changed files with 96 additions and 4 deletions

View file

@ -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

View file

@ -5,6 +5,8 @@
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="loops">
<!-- stateful definitions and corresponding adapters -->
<zope:utility
factory="cybertools.stateful.publishing.simplePublishing"
name="loops.simple_publishing" />
@ -19,4 +21,23 @@
set_schema="cybertools.stateful.interfaces.IStateful" />
</zope:class>
<zope:utility
factory="loops.organize.stateful.quality.classificationQuality"
name="loops.classification_quality" />
<zope:adapter
factory="loops.organize.stateful.quality.ClassificationQualityCheckable"
name="loops.classification_quality" trusted="True" />
<zope:class class="loops.organize.stateful.quality.ClassificationQualityCheckable">
<require permission="zope.View"
interface="cybertools.stateful.interfaces.IStateful" />
<require permission="zope.ManageContent"
set_schema="cybertools.stateful.interfaces.IStateful" />
</zope:class>
<!-- event handlers -->
<zope:subscriber handler="loops.organize.stateful.quality.assign" />
<zope:subscriber handler="loops.organize.stateful.quality.deassign" />
</configure>

View file

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