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 |   >>> from loops.organize.stateful.quality import ClassificationQualityCheckable | ||||||
|   >>> component.provideAdapter(ClassificationQualityCheckable, |   >>> component.provideAdapter(ClassificationQualityCheckable, | ||||||
|   ...                          name='loops.classification_quality') |   ...                          name='loops.classification_quality') | ||||||
|  |   >>> from loops.organize.stateful.quality import assign, deassign | ||||||
|  |   >>> component.provideHandler(assign) | ||||||
|  |   >>> component.provideHandler(deassign) | ||||||
| 
 | 
 | ||||||
|   >>> qcheckedDoc01 = component.getAdapter(doc01, IStateful, |   >>> qcheckedDoc01 = component.getAdapter(doc01, IStateful, | ||||||
|   ...                                      name='loops.classification_quality') |   ...                                      name='loops.classification_quality') | ||||||
|   >>> qcheckedDoc01.state |   >>> qcheckedDoc01.state | ||||||
|   'unclassified' |   '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 | Fin de partie | ||||||
|  |  | ||||||
|  | @ -5,6 +5,8 @@ | ||||||
|    xmlns:browser="http://namespaces.zope.org/browser" |    xmlns:browser="http://namespaces.zope.org/browser" | ||||||
|    i18n_domain="loops"> |    i18n_domain="loops"> | ||||||
| 
 | 
 | ||||||
|  |   <!-- stateful definitions and corresponding adapters --> | ||||||
|  | 
 | ||||||
|   <zope:utility |   <zope:utility | ||||||
|         factory="cybertools.stateful.publishing.simplePublishing" |         factory="cybertools.stateful.publishing.simplePublishing" | ||||||
|         name="loops.simple_publishing" /> |         name="loops.simple_publishing" /> | ||||||
|  | @ -19,4 +21,23 @@ | ||||||
|              set_schema="cybertools.stateful.interfaces.IStateful" /> |              set_schema="cybertools.stateful.interfaces.IStateful" /> | ||||||
|   </zope:class> |   </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> | </configure> | ||||||
|  |  | ||||||
|  | @ -22,12 +22,17 @@ Basic implementations for stateful objects and adapters. | ||||||
| $Id$ | $Id$ | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  | from zope import component | ||||||
|  | from zope.component import adapter | ||||||
| from zope.interface import implementer | from zope.interface import implementer | ||||||
|  | from zope.traversing.api import getName | ||||||
| 
 | 
 | ||||||
| from cybertools.stateful.definition import registerStatesDefinition | from cybertools.stateful.definition import registerStatesDefinition | ||||||
| from cybertools.stateful.definition import StatesDefinition | from cybertools.stateful.definition import StatesDefinition | ||||||
| from cybertools.stateful.definition import State, Transition | 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 | from loops.organize.stateful.base import StatefulLoopsObject | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -35,11 +40,12 @@ from loops.organize.stateful.base import StatefulLoopsObject | ||||||
| def classificationQuality(): | def classificationQuality(): | ||||||
|     return StatesDefinition('classificationQuality', |     return StatesDefinition('classificationQuality', | ||||||
|         State('unclassified', 'unclassified', ('classify',)), |         State('unclassified', 'unclassified', ('classify',)), | ||||||
|         State('classified', 'classified', ('check',)), |         State('classified', 'classified', | ||||||
|         State('checked', 'checked', |               ('verify', 'change_classification', 'remove_classification')), | ||||||
|  |         State('verified', 'verified', | ||||||
|               ('change_classification', 'remove_classification')), |               ('change_classification', 'remove_classification')), | ||||||
|         Transition('classify', 'classify', 'classified'), |         Transition('classify', 'classify', 'classified'), | ||||||
|         Transition('check', 'check', 'checked'), |         Transition('verify', 'verify', 'verified'), | ||||||
|         Transition('change_classification', 'change classification', 'classified'), |         Transition('change_classification', 'change classification', 'classified'), | ||||||
|         Transition('remove_classification', 'remove classification', 'unclassified'), |         Transition('remove_classification', 'remove classification', 'unclassified'), | ||||||
|         initialState='unclassified') |         initialState='unclassified') | ||||||
|  | @ -48,3 +54,36 @@ def classificationQuality(): | ||||||
| class ClassificationQualityCheckable(StatefulLoopsObject): | class ClassificationQualityCheckable(StatefulLoopsObject): | ||||||
| 
 | 
 | ||||||
|     statesDefinition = 'loops.classification_quality' |     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
	
	 helmutm
						helmutm