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:
parent
0a691deed0
commit
95f2b55de1
4 changed files with 58 additions and 25 deletions
|
@ -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.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
17
view.py
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue