add transition event, automatic indexing of states
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2560 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
54d238afe9
commit
883656bd1e
5 changed files with 63 additions and 12 deletions
|
@ -230,8 +230,8 @@ class Concept(Contained, Persistent):
|
|||
registry = component.getUtility(IRelationRegistry)
|
||||
for rel in self.getChildRelations(predicates, child):
|
||||
if order is None or rel.order == order:
|
||||
notify(DeassignmentEvent(self, rel))
|
||||
registry.unregister(rel)
|
||||
notify(DeassignmentEvent(self, rel))
|
||||
|
||||
def deassignParent(self, parent, predicates=None):
|
||||
parent.deassignChild(self, predicates)
|
||||
|
@ -269,8 +269,8 @@ class Concept(Contained, Persistent):
|
|||
registry = component.getUtility(IRelationRegistry)
|
||||
for rel in self.getResourceRelations(predicates, resource):
|
||||
if order is None or rel.order == order:
|
||||
notify(DeassignmentEvent(self, rel))
|
||||
registry.unregister(rel)
|
||||
notify(DeassignmentEvent(self, rel))
|
||||
|
||||
# combined children+resources query
|
||||
|
||||
|
|
|
@ -22,13 +22,16 @@ Basic implementations for stateful objects and adapters.
|
|||
$Id$
|
||||
"""
|
||||
|
||||
from zope.app.catalog.interfaces import ICatalog
|
||||
from zope import component
|
||||
from zope.component import adapts
|
||||
from zope.component import adapts, adapter
|
||||
|
||||
from cybertools.meta.interfaces import IOptions
|
||||
from cybertools.stateful.base import Stateful as BaseStateful
|
||||
from cybertools.stateful.base import StatefulAdapter
|
||||
from cybertools.stateful.interfaces import IStatesDefinition
|
||||
from loops.interfaces import ILoopsObject
|
||||
from cybertools.stateful.base import StatefulAdapter, IndexInfo
|
||||
from cybertools.stateful.interfaces import IStatesDefinition, ITransitionEvent
|
||||
from loops.interfaces import ILoopsObject, IResource
|
||||
from loops import util
|
||||
|
||||
|
||||
class Stateful(BaseStateful):
|
||||
|
@ -46,3 +49,21 @@ class SimplePublishable(StatefulLoopsObject):
|
|||
|
||||
statesDefinition = 'loops.simple_publishing'
|
||||
|
||||
|
||||
class StatefulResourceIndexInfo(IndexInfo):
|
||||
|
||||
adapts(IResource)
|
||||
|
||||
@property
|
||||
def availableStatesDefinitions(self):
|
||||
options = IOptions(self.context.getLoopsRoot())
|
||||
return options('organize.stateful.resource', ())
|
||||
|
||||
|
||||
@adapter(IResource, ITransitionEvent)
|
||||
def handleTransition(self, obj, event):
|
||||
previous = event.previousState
|
||||
next = event.transition.targetState
|
||||
if next != previous:
|
||||
cat = getUtility(ICatalog)
|
||||
cat.index_doc(int(util.getUidForObject(obj)), obj)
|
||||
|
|
|
@ -5,6 +5,13 @@
|
|||
xmlns:browser="http://namespaces.zope.org/browser"
|
||||
i18n_domain="loops">
|
||||
|
||||
<zope:adapter
|
||||
factory="loops.organize.stateful.base.StatefulResourceIndexInfo"
|
||||
trusted="True" />
|
||||
<zope:class class="loops.organize.stateful.base.StatefulResourceIndexInfo">
|
||||
<allow interface="cybertools.stateful.interfaces.IStatefulIndexInfo" />
|
||||
</zope:class>
|
||||
|
||||
<!-- stateful definitions and corresponding adapters -->
|
||||
|
||||
<zope:utility
|
||||
|
@ -37,6 +44,7 @@
|
|||
|
||||
<!-- event handlers -->
|
||||
|
||||
<zope:subscriber handler="loops.organize.stateful.base.handleTransition" />
|
||||
<zope:subscriber handler="loops.organize.stateful.quality.assign" />
|
||||
<zope:subscriber handler="loops.organize.stateful.quality.deassign" />
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ 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.versioning.interfaces import IVersionable
|
||||
|
||||
|
||||
@implementer(IStatesDefinition)
|
||||
|
@ -70,20 +71,35 @@ class ClassificationQualityCheckable(StatefulLoopsObject):
|
|||
def assign(self, relation):
|
||||
if not self.isRelevant(relation):
|
||||
return
|
||||
versionable = IVersionable(self.context, None)
|
||||
if self.state in ('new', 'unclassified'):
|
||||
self.doTransition('classify')
|
||||
self.doTransitionWithVersions('classify', versionable)
|
||||
else:
|
||||
self.doTransition('change_classification')
|
||||
self.doTransitionWithVersions('change_classification', versionable)
|
||||
|
||||
def deassign(self, relation):
|
||||
if not self.isRelevant(relation):
|
||||
return
|
||||
versionable = IVersionable(self.context, None)
|
||||
if self.state in ('new', 'classified', 'verified'):
|
||||
old = self.context.getParentRelations()
|
||||
if len(old) > 2: # the hasType relation always remains
|
||||
self.doTransition('change_classification')
|
||||
parents = self.context.getParentRelations()
|
||||
if len(parents) > 1: # the hasType relation always remains
|
||||
self.doTransitionWithVersions('change_classification', versionable)
|
||||
else:
|
||||
self.doTransition('remove_classification')
|
||||
self.doTransitionWithVersions('remove_classification', versionable)
|
||||
|
||||
def doTransitionWithVersions(self, transition, versionable):
|
||||
self.doTransition(transition)
|
||||
if versionable is None:
|
||||
return
|
||||
for v in versionable.versions.values():
|
||||
if v != self.context:
|
||||
stf = component.getAdapter(v, IStateful, name=self.statesDefinition)
|
||||
available = [t.name for t in stf.getAvailableTransitions()]
|
||||
if transition in available:
|
||||
stf.doTransition(transition)
|
||||
#else:
|
||||
# print '***', v.__name__, stf.state, transition, available
|
||||
|
||||
def isRelevant(self, relation):
|
||||
""" Return True if the relation given is relevant for changing
|
||||
|
|
|
@ -28,6 +28,7 @@ from zope.publisher.interfaces.browser import IBrowserRequest, IBrowserView
|
|||
from zope.security.checker import Checker, defineChecker
|
||||
|
||||
from cybertools.browser.controller import Controller
|
||||
from cybertools.catalog.keyword import KeywordIndex
|
||||
from cybertools.composer.schema.factory import SchemaFactory
|
||||
from cybertools.composer.schema.field import FieldInstance, NumberFieldInstance
|
||||
from cybertools.composer.schema.field import DateFieldInstance, BooleanFieldInstance
|
||||
|
@ -39,6 +40,7 @@ from cybertools.relation.interfaces import IRelation, IRelationRegistry
|
|||
from cybertools.relation.interfaces import IRelationInvalidatedEvent
|
||||
from cybertools.relation.registry import IndexableRelationAdapter
|
||||
from cybertools.relation.registry import invalidateRelations, removeRelation
|
||||
from cybertools.stateful.interfaces import IStatefulIndexInfo
|
||||
from cybertools.typology.interfaces import IType
|
||||
|
||||
from loops.base import Loops
|
||||
|
@ -51,6 +53,7 @@ from loops.config.base import GlobalOptions, LoopsOptions
|
|||
from loops.interfaces import ILoopsObject, IIndexAttributes
|
||||
from loops.interfaces import IDocument, IFile, ITextDocument
|
||||
from loops.organize.memberinfo import MemberInfoProvider
|
||||
from loops.organize.stateful.base import StatefulResourceIndexInfo, handleTransition
|
||||
from loops.query import QueryConcept
|
||||
from loops.query import QueryConcept
|
||||
from loops.resource import Resource, FileAdapter, TextDocumentAdapter
|
||||
|
@ -150,8 +153,11 @@ class TestSite(object):
|
|||
catalog['loops_title'] = TextIndex('title', IIndexAttributes, True)
|
||||
catalog['loops_text'] = TextIndex('text', IIndexAttributes, True)
|
||||
catalog['loops_type'] = FieldIndex('tokenForSearch', IType, False)
|
||||
catalog['loops_state'] = KeywordIndex('tokens', IStatefulIndexInfo, False)
|
||||
component.provideAdapter(ConceptIndexAttributes)
|
||||
component.provideAdapter(ResourceIndexAttributes)
|
||||
component.provideAdapter(StatefulResourceIndexInfo)
|
||||
component.provideHandler(handleTransition)
|
||||
|
||||
loopsRoot = site['loops'] = Loops()
|
||||
setup = SetupManager(loopsRoot)
|
||||
|
|
Loading…
Add table
Reference in a new issue