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): class INodeSchema(IView):
""" 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)
nodeType = schema.Choice( nodeType = schema.Choice(
title=_(u'Node Type'), title=_(u'Node Type'),
@ -449,6 +442,16 @@ class INode(IView, IBaseNode):
contentType = Attribute(_(u'Content type (format) of the body')) 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): def getParentNode(nodeTypes=None):
""" Return the next node up the node hierarchy. If the nodeTypes """ Return the next node up the node hierarchy. If the nodeTypes
parameter is given, search for the next node that has one of 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): class IViewManager(ILoopsObject, IBaseNode):
""" A manager/container for views. """ 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.schema import ResourceSchemaFactory, FileSchemaFactory, NoteSchemaFactory
from loops.setup import SetupManager, addObject from loops.setup import SetupManager, addObject
from loops.type import LoopsType, ConceptType, ResourceType, TypeConcept from loops.type import LoopsType, ConceptType, ResourceType, TypeConcept
from loops.view import NodeAdapter
class ClientIdManager(object): class ClientIdManager(object):
""" dummy, for testing only """ """ dummy, for testing only """
@ -78,6 +80,7 @@ class TestSite(object):
component.provideAdapter(TypeConcept) component.provideAdapter(TypeConcept)
component.provideAdapter(FileAdapter, provides=IFile) component.provideAdapter(FileAdapter, provides=IFile)
component.provideAdapter(TextDocumentAdapter, provides=ITextDocument) component.provideAdapter(TextDocumentAdapter, provides=ITextDocument)
component.provideAdapter(NodeAdapter)
component.provideAdapter(NameChooser) component.provideAdapter(NameChooser)
component.provideAdapter(Instance) component.provideAdapter(Instance)
component.provideAdapter(Editor, name='editor') component.provideAdapter(Editor, name='editor')

View file

@ -112,24 +112,17 @@ class VersionableResource(object):
m = self.versionableMaster m = self.versionableMaster
return self.versionableMaster.getVersioningAttribute('releasedVersion', None) return self.versionableMaster.getVersioningAttribute('releasedVersion', None)
def createVersion(self, level=1, comment=u''): def createVersionObject(self, versionNumbers, variantIds, comment=u''):
context = self.context
versionableMaster = self.versionableMaster versionableMaster = self.versionableMaster
# get the new version numbers versionableMaster.initVersions()
vn = list(IVersionable(self.currentVersion).versionNumbers) context = self.context
while len(vn) <= level: # create object
vn.append(1)
vn[level] += 1
for l in range(level+1, len(vn)):
# reset lower levels
vn[l] = 1
# create new object
cls = context.__class__ cls = context.__class__
obj = cls() obj = cls()
# set versioning attributes of new object # set versioning attributes of new object
versionableObj = IVersionable(obj) versionableObj = IVersionable(obj)
versionableObj.setVersioningAttribute('versionNumbers', tuple(vn)) versionableObj.setVersioningAttribute('versionNumbers', tuple(versionNumbers))
versionableObj.setVersioningAttribute('variantIds', self.variantIds) versionableObj.setVersioningAttribute('variantIds', variantIds)
versionableObj.setVersioningAttribute('master', self.master) versionableObj.setVersioningAttribute('master', self.master)
versionableObj.setVersioningAttribute('parent', context) versionableObj.setVersioningAttribute('parent', context)
versionableObj.setVersioningAttribute('comment', comment) versionableObj.setVersioningAttribute('comment', comment)
@ -139,6 +132,8 @@ class VersionableResource(object):
extensions.get(context.contentType, ''), extensions.get(context.contentType, ''),
versionId) versionId)
getParent(context)[name] = obj getParent(context)[name] = obj
# record version on master
self.versions[versionableObj.versionId] = obj
# set resource attributes # set resource attributes
ti = IType(context).typeInterface ti = IType(context).typeInterface
attrs = set((ti and list(ti) or []) attrs = set((ti and list(ti) or [])
@ -147,10 +142,21 @@ class VersionableResource(object):
adaptedObj = ti and ti(obj) or obj adaptedObj = ti and ti(obj) or obj
for attr in attrs: for attr in attrs:
setattr(adaptedObj, attr, getattr(adaptedContext, attr)) 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 # set attributes of the master version
versionableMaster.setVersioningAttribute('currentVersion', obj) self.versionableMaster.setVersioningAttribute('currentVersion', obj)
versionableMaster.initVersions()
self.versions[versionId] = obj
return obj return obj
def generateName(self, name, ext, versionId): 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 cybertools.util.jeep import Jeep
from loops.base import ParentInfo 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 IViewManager, INodeContained
from loops.interfaces import ILoopsContained from loops.interfaces import ILoopsContained
from loops.interfaces import ITargetRelation from loops.interfaces import ITargetRelation
@ -196,6 +197,20 @@ class TargetRelation(DyadicRelation):
# adapters # 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): class NodeTraverser(ItemTraverser):
adapts(INode) adapts(INode)