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'
|
'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
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Add table
Reference in a new issue