diff --git a/README.txt b/README.txt index d279e54..045d1d3 100755 --- a/README.txt +++ b/README.txt @@ -275,6 +275,22 @@ target may be moved or renamed without any problems.) >>> ztapi.provideAdapter(INode, INodeConfigSchema, NodeConfigAdapter) >>> nodeConfig = INodeConfigSchema(m111) + >>> nodeConfig.targetUri + u'.loops/concepts/cc2' + >>> nodeConfig.title = u'New title for m111' + >>> nodeConfig.title + u'New title for m111' + >>> m111.title + u'New title for m111' + >>> nodeConfig.targetUri = '.loops/resources/doc1' + >>> nodeConfig.title = 'New title for m111' + >>> m111.target is doc1 + True + >>> nodeConfig.targetType + 'loops.resource.Document' + >>> m111 in doc1.getClients() + True + It is also possible to edit a target's attributes directly in an edit form provided by the node: diff --git a/browser/configure.zcml b/browser/configure.zcml index 7b49850..db1171b 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -272,8 +272,8 @@ label="Add Node" name="AddLoopsNode.html" content_factory="loops.view.Node" - schema="loops.interfaces.INode" - fields="title description nodeType body" + schema="loops.interfaces.INodeConfigSchema" + fields="title description nodeType targetType targetUri createTarget" permission="zope.ManageContent"> @@ -304,6 +304,21 @@ + + + + + + + - + diff --git a/interfaces.py b/interfaces.py index 1823cea..5b4e84d 100644 --- a/interfaces.py +++ b/interfaces.py @@ -290,8 +290,8 @@ class ITargetProperties(Interface): targetType = schema.Choice( title=_(u'Target Type'), description=_(u'Type of the target'), - values=('', 'resource.Document', 'resource.MediaAsset'), - default='', + values=('loops.resource.Document', 'loops.resource.MediaAsset'), + default=None, required=False) targetUri = schema.TextLine( diff --git a/view.py b/view.py index 23966c9..ca63d9e 100644 --- a/view.py +++ b/view.py @@ -28,8 +28,10 @@ from zope.app.container.contained import Contained from zope.app.container.ordered import OrderedContainer from zope.app.container.traversal import ContainerTraverser, ItemTraverser from zope.app.container.traversal import ContainerTraversable +from zope.cachedescriptors.property import Lazy from zope.component import adapts from zope.interface import implements +from zope.security.proxy import removeSecurityProxy from persistent import Persistent from cybertools.relation import DyadicRelation from cybertools.relation.registry import IRelationsRegistry, getRelations @@ -155,7 +157,6 @@ class NodeTraverser(ItemTraverser): adapts(INode) def publishTraverse(self, request, name): - print name if name == '.loops': return self.context.getLoopsRoot() return super(NodeTraverser, self).publishTraverse(request, name) @@ -164,8 +165,52 @@ class NodeTraverser(ItemTraverser): class NodeConfigAdapter(object): def __init__(self, context): - self.context = context + self.context = removeSecurityProxy(context) + #self.context = context implements(INodeConfigSchema) adapts(INode) + # provide access to fields of the Node class: + + def getTitle(self): return self.context.title + def setTitle(self, title): self.context.title = title + title = property(getTitle, setTitle) + + def getDescription(self): return self.context.description + def setDescription(self, description): self.context.description = description + description = property(getDescription, setDescription) + + def getNodeType(self): return self.context.nodeType + def setNodeType(self, nodeType): self.context.nodeType = nodeType + nodeType = property(getNodeType, setNodeType) + + # the real config stuff: + + @Lazy + def loopsRoot(self): return self.context.getLoopsRoot() + + def getTargetUri(self): + rootPath = zapi.getPath(self.loopsRoot) + if self.context.target is not None: + path = zapi.getPath(self.context.target)[len(rootPath):] + return '.loops' + path + else: + return '' + + def setTargetUri(self, uri): + names = uri.split('/') + if names[0] == '.loops': + path = '/'.join(names[1:]) + self.context.target = zapi.traverse(self.loopsRoot, path) + + targetUri = property(getTargetUri, setTargetUri) + + def getTargetType(self): + target = self.context.target + return '%s.%s' % (target.__module__, target.__class__.__name__) + def setTargetType(self, tt): + pass + targetType = property(getTargetType, setTargetType) + +