prepare NodeAdapter stuff; refactor version as preparation for i18n-aware resources

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2245 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-12-14 15:14:15 +00:00
parent 0a691deed0
commit 95f2b55de1
4 changed files with 58 additions and 25 deletions

View file

@ -419,14 +419,7 @@ class IBaseNode(IOrderedContainer):
"""
class INode(IView, IBaseNode):
""" A node is a view that may contain other views, thus building a
menu or folder hierarchy.
A node may be a content object on its own; for this reason it
has a body attribute that may be shown e.g. on web pages.
"""
contains(IView)
class INodeSchema(IView):
nodeType = schema.Choice(
title=_(u'Node Type'),
@ -449,6 +442,16 @@ class INode(IView, IBaseNode):
contentType = Attribute(_(u'Content type (format) of the body'))
class INode(INodeSchema, IBaseNode):
""" A node is a view that may contain other views, thus building a
menu or folder hierarchy.
A node may be a content object on its own; for this reason it
has a body attribute that may be shown e.g. on web pages.
"""
contains(IView)
def getParentNode(nodeTypes=None):
""" Return the next node up the node hierarchy. If the nodeTypes
parameter is given, search for the next node that has one of
@ -488,6 +491,12 @@ class INode(IView, IBaseNode):
"""
class INodeAdapter(Interface):
""" Base interface for adapters that provide nodes with additional
capabilities.
"""
class IViewManager(ILoopsObject, IBaseNode):
""" A manager/container for views.
"""

View file

@ -42,6 +42,8 @@ from loops.resource import IndexAttributes as ResourceIndexAttributes
from loops.schema import ResourceSchemaFactory, FileSchemaFactory, NoteSchemaFactory
from loops.setup import SetupManager, addObject
from loops.type import LoopsType, ConceptType, ResourceType, TypeConcept
from loops.view import NodeAdapter
class ClientIdManager(object):
""" dummy, for testing only """
@ -78,6 +80,7 @@ class TestSite(object):
component.provideAdapter(TypeConcept)
component.provideAdapter(FileAdapter, provides=IFile)
component.provideAdapter(TextDocumentAdapter, provides=ITextDocument)
component.provideAdapter(NodeAdapter)
component.provideAdapter(NameChooser)
component.provideAdapter(Instance)
component.provideAdapter(Editor, name='editor')

View file

@ -112,24 +112,17 @@ class VersionableResource(object):
m = self.versionableMaster
return self.versionableMaster.getVersioningAttribute('releasedVersion', None)
def createVersion(self, level=1, comment=u''):
context = self.context
def createVersionObject(self, versionNumbers, variantIds, comment=u''):
versionableMaster = self.versionableMaster
# get the new version numbers
vn = list(IVersionable(self.currentVersion).versionNumbers)
while len(vn) <= level:
vn.append(1)
vn[level] += 1
for l in range(level+1, len(vn)):
# reset lower levels
vn[l] = 1
# create new object
versionableMaster.initVersions()
context = self.context
# create object
cls = context.__class__
obj = cls()
# set versioning attributes of new object
versionableObj = IVersionable(obj)
versionableObj.setVersioningAttribute('versionNumbers', tuple(vn))
versionableObj.setVersioningAttribute('variantIds', self.variantIds)
versionableObj.setVersioningAttribute('versionNumbers', tuple(versionNumbers))
versionableObj.setVersioningAttribute('variantIds', variantIds)
versionableObj.setVersioningAttribute('master', self.master)
versionableObj.setVersioningAttribute('parent', context)
versionableObj.setVersioningAttribute('comment', comment)
@ -139,6 +132,8 @@ class VersionableResource(object):
extensions.get(context.contentType, ''),
versionId)
getParent(context)[name] = obj
# record version on master
self.versions[versionableObj.versionId] = obj
# set resource attributes
ti = IType(context).typeInterface
attrs = set((ti and list(ti) or [])
@ -147,10 +142,21 @@ class VersionableResource(object):
adaptedObj = ti and ti(obj) or obj
for attr in attrs:
setattr(adaptedObj, attr, getattr(adaptedContext, attr))
return obj
def createVersion(self, level=1, comment=u''):
# get the new version numbers
vn = list(IVersionable(self.currentVersion).versionNumbers)
while len(vn) <= level:
vn.append(1)
vn[level] += 1
for l in range(level+1, len(vn)):
# reset lower levels
vn[l] = 1
# create new object
obj = self.createVersionObject(vn, self.variantIds, comment)
# set attributes of the master version
versionableMaster.setVersioningAttribute('currentVersion', obj)
versionableMaster.initVersions()
self.versions[versionId] = obj
self.versionableMaster.setVersioningAttribute('currentVersion', obj)
return obj
def generateName(self, name, ext, versionId):

17
view.py
View file

@ -42,7 +42,8 @@ from cybertools.relation.interfaces import IRelationRegistry, IRelatable
from cybertools.util.jeep import Jeep
from loops.base import ParentInfo
from loops.interfaces import IView, INode
from loops.common import AdapterBase
from loops.interfaces import IView, INode, INodeSchema, INodeAdapter
from loops.interfaces import IViewManager, INodeContained
from loops.interfaces import ILoopsContained
from loops.interfaces import ITargetRelation
@ -196,6 +197,20 @@ class TargetRelation(DyadicRelation):
# adapters
class NodeAdapter(AdapterBase):
""" Allows nodes to be adapted like concepts and resources, e.g.
for i18n (needs derivation from I18NAdapterBase),
specific capabilities or dynamic attributes.
"""
implements(INodeAdapter)
adapts(INode)
_contextAttributes = ('title', 'description', 'body',)
# traveral adapter
class NodeTraverser(ItemTraverser):
adapts(INode)