versioning: add handler for IObjectRemovedEvent to clean up versions upon deletion of a versioned object

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1720 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-05-05 17:32:01 +00:00
parent 1aebfb18a4
commit 15f1c76496
4 changed files with 50 additions and 1 deletions

View file

@ -133,6 +133,24 @@ In addition it is possible to explicitly retrieve a certain version:
'1.1' '1.1'
Deleting Versioned Resources
============================
When a version object is deleted the reference to it on the corresponding
master object is removed.
>>> del resources['d001_1.2.txt']
>>> sorted(IVersionable(d001).versions)
['1.1', '2.1', '2.2']
When the master object of a versioned resource is deleted all version objects
derived from it are deleted as well.
>>> del resources['d001.txt']
>>> sorted(resources)
[u'd002.txt', u'd003.txt']
Fin de partie Fin de partie
============= =============

View file

@ -16,6 +16,12 @@
set_schema="loops.versioning.interfaces.IVersionable" /> set_schema="loops.versioning.interfaces.IVersionable" />
</zope:class> </zope:class>
<zope:subscriber
for="loops.interfaces.IResource
zope.app.container.interfaces.IObjectRemovedEvent"
handler="loops.versioning.versionable.cleanupVersions"
/>
<!-- user interface --> <!-- user interface -->
<browser:page <browser:page

View file

@ -9,6 +9,7 @@ from zope.app.catalog.catalog import Catalog
from zope.app.catalog.interfaces import ICatalog from zope.app.catalog.interfaces import ICatalog
from zope.app.catalog.field import FieldIndex from zope.app.catalog.field import FieldIndex
from zope.app.catalog.text import TextIndex from zope.app.catalog.text import TextIndex
from zope.app.container.interfaces import IObjectRemovedEvent
from cybertools.relation.tests import IntIdsStub from cybertools.relation.tests import IntIdsStub
from cybertools.relation.registry import RelationRegistry from cybertools.relation.registry import RelationRegistry
@ -18,7 +19,7 @@ from cybertools.typology.interfaces import IType
from loops import Loops from loops import Loops
from loops import util from loops import util
from loops.interfaces import IIndexAttributes from loops.interfaces import IResource, IIndexAttributes
from loops.concept import Concept from loops.concept import Concept
from loops.concept import IndexAttributes as ConceptIndexAttributes from loops.concept import IndexAttributes as ConceptIndexAttributes
from loops.resource import Resource from loops.resource import Resource
@ -26,6 +27,7 @@ from loops.resource import IndexAttributes as ResourceIndexAttributes
from loops.knowledge.setup import SetupManager as KnowledgeSetupManager from loops.knowledge.setup import SetupManager as KnowledgeSetupManager
from loops.setup import SetupManager, addObject from loops.setup import SetupManager, addObject
from loops.type import ConceptType, ResourceType, TypeConcept from loops.type import ConceptType, ResourceType, TypeConcept
from loops.versioning.versionable import cleanupVersions
class TestSite(object): class TestSite(object):
@ -53,6 +55,9 @@ class TestSite(object):
catalog['loops_text'] = TextIndex('text', IIndexAttributes, True) catalog['loops_text'] = TextIndex('text', IIndexAttributes, True)
catalog['loops_type'] = FieldIndex('tokenForSearch', IType, False) catalog['loops_type'] = FieldIndex('tokenForSearch', IType, False)
component.getSiteManager().registerHandler(cleanupVersions,
(IResource, IObjectRemovedEvent))
loopsRoot = site['loops'] = Loops() loopsRoot = site['loops'] = Loops()
component.provideAdapter(KnowledgeSetupManager, name='knowledge') component.provideAdapter(KnowledgeSetupManager, name='knowledge')

View file

@ -163,3 +163,23 @@ class VersionableResource(object):
name = name[:-4] name = name[:-4]
return name + '_' + versionId + ext return name + '_' + versionId + ext
def cleanupVersions(context, event):
""" Called upon deletion of a resource.
"""
#print 'cleaning up'
vContext = IVersionable(context, None)
if vContext is None:
return
rm = context.getLoopsRoot().getResourceManager()
if context == vContext.master:
toBeDeleted = []
for v in vContext.versions.values():
if v != context:
toBeDeleted.append(getName(v))
for name in toBeDeleted:
del rm[name]
else:
vId = vContext.versionId
vMaster = IVersionable(vContext.master)
del vMaster.versions[vId]