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:
helmutm 2008-04-27 14:28:03 +00:00
parent 54d238afe9
commit 883656bd1e
5 changed files with 63 additions and 12 deletions

View file

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

View file

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

View file

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

View file

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

View file

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