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:
parent
fd4be51425
commit
cbe2d994c5
3 changed files with 96 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Add table
Reference in a new issue