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:
parent
1aebfb18a4
commit
15f1c76496
4 changed files with 50 additions and 1 deletions
|
@ -133,6 +133,24 @@ In addition it is possible to explicitly retrieve a certain version:
|
|||
'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
|
||||
=============
|
||||
|
||||
|
|
|
@ -16,6 +16,12 @@
|
|||
set_schema="loops.versioning.interfaces.IVersionable" />
|
||||
</zope:class>
|
||||
|
||||
<zope:subscriber
|
||||
for="loops.interfaces.IResource
|
||||
zope.app.container.interfaces.IObjectRemovedEvent"
|
||||
handler="loops.versioning.versionable.cleanupVersions"
|
||||
/>
|
||||
|
||||
<!-- user interface -->
|
||||
|
||||
<browser:page
|
||||
|
|
|
@ -9,6 +9,7 @@ from zope.app.catalog.catalog import Catalog
|
|||
from zope.app.catalog.interfaces import ICatalog
|
||||
from zope.app.catalog.field import FieldIndex
|
||||
from zope.app.catalog.text import TextIndex
|
||||
from zope.app.container.interfaces import IObjectRemovedEvent
|
||||
|
||||
from cybertools.relation.tests import IntIdsStub
|
||||
from cybertools.relation.registry import RelationRegistry
|
||||
|
@ -18,7 +19,7 @@ from cybertools.typology.interfaces import IType
|
|||
|
||||
from loops import Loops
|
||||
from loops import util
|
||||
from loops.interfaces import IIndexAttributes
|
||||
from loops.interfaces import IResource, IIndexAttributes
|
||||
from loops.concept import Concept
|
||||
from loops.concept import IndexAttributes as ConceptIndexAttributes
|
||||
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.setup import SetupManager, addObject
|
||||
from loops.type import ConceptType, ResourceType, TypeConcept
|
||||
from loops.versioning.versionable import cleanupVersions
|
||||
|
||||
|
||||
class TestSite(object):
|
||||
|
@ -53,6 +55,9 @@ class TestSite(object):
|
|||
catalog['loops_text'] = TextIndex('text', IIndexAttributes, True)
|
||||
catalog['loops_type'] = FieldIndex('tokenForSearch', IType, False)
|
||||
|
||||
component.getSiteManager().registerHandler(cleanupVersions,
|
||||
(IResource, IObjectRemovedEvent))
|
||||
|
||||
loopsRoot = site['loops'] = Loops()
|
||||
|
||||
component.provideAdapter(KnowledgeSetupManager, name='knowledge')
|
||||
|
|
|
@ -163,3 +163,23 @@ class VersionableResource(object):
|
|||
name = name[:-4]
|
||||
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]
|
||||
|
|
Loading…
Add table
Reference in a new issue