Dolmen应用程序的容器工具
项目描述
dolmen.app.container 是用于在Dolmen应用程序中处理容器的工具集合。
入门指南
我们导入Grok、请求和认证工具,以便在测试中使用它们
>>> from grok import testing >>> from zope.component import getMultiAdapter >>> from zope.publisher.browser import TestRequest >>> from zope.security.testing import Principal, Participation >>> from zope.security.management import newInteraction, endInteraction
名称选择器
为了获得有关容器键的一致策略,dolmen.app.container 为 dolmen.content.IContainer 对象提供了一个 INameChooser 适配器。
我们创建我们的容器类型
>>> import dolmen.content >>> class Folder(dolmen.content.Container): ... dolmen.content.name('a folderish content') ... dolmen.content.require('dolmen.content.Add') >>> testing.grok_component('folder', Folder) True >>> root = getSite() >>> folder = Folder() >>> root['folder'] = folder
我们现在创建一个简单的内容类型
>>> from zope.interface import Interface, implements >>> class IDocument(Interface): ... pass >>> class Document(dolmen.content.Content): ... dolmen.content.name('a document') ... implements(IDocument) >>> testing.grok_component('doc', Document) True >>> manfred = Document() >>> manfred.__content_type__ 'a document' >>> manfred.title = u"Manfred"
要使用名称选择器,我们只需将我们的容器适配到 INameChooser 接口
>>> from zope.container.interfaces import INameChooser >>> chooser = INameChooser(folder) >>> chooser <dolmen.app.container.namechoosers.NormalizingNameChooser object at ...>
如果没有提供名称,组件将使用对象的标题来计算ID
>>> chooser.chooseName(name='', object=manfred) 'manfred'
如果提供了名称,如果可能的话,则使用该名称
>>> chooser.chooseName(name='furry elephant', object=manfred) 'furry elephant'
如果名称已存在,则将在ID末尾添加一个数字。为此,名称选择器将尝试从0到100的所有值,并保留第一个成功的组合
>>> folder['manfred'] = object() >>> chooser.chooseName(name='', object=manfred) 'manfred_1'
如果没有解决方案,则引发错误
>>> for i in range(0, 101): ... folder['manfred_%d' % i] = object() >>> chooser.chooseName(name='', object=manfred) Traceback (most recent call last): ... ValueError: Cannot find a unique name based on `manfred` after 100 attemps.
列表
为了完善容器的工具,dolmen.app.container注册了一个视图,负责以表格形式显示容器的内容。
首先,我们重置容器
>>> del root['folder'] >>> folder = root['folder'] = Folder()
我们添加各种内容
>>> folder['manfred'] = Document() >>> folder['judith'] = Document() >>> folder['subfolder'] = Folder() >>> folder['not_dolmen.content.IBaseContent'] = object()
然后,我们可以查询列表视图
>>> listing = getMultiAdapter((folder, request), name="folderlisting") >>> listing.update()
表格行是容器值的列表
>>> list(listing.values) [<dolmen.app.container.ftests.Document object at ...>, <dolmen.app.container.ftests.Document object at ...>, <object object at ...>, <dolmen.app.container.ftests.Folder object at ...>]
渲染显示了带有图标(如果存在)的链接
>>> print listing.content() <div class="folder-listing"> <h1>Content of the folder</h1> <div><table class="listing sortable"> <thead> <tr> <th>Title</th> <th>Modification date</th> </tr> </thead> <tbody> <tr class="even"> <td><a href="http://127.0.0.1/folder/judith">judith</a></td> <td>None</td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/manfred">manfred</a></td> <td>None</td> </tr> <tr class="even"> <td><a href="http://127.0.0.1/folder/not_dolmen.content.IBaseContent">not_dolmen.content.IBaseContent</a></td> <td></td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/subfolder">subfolder</a></td> <td>None</td> </tr> </tbody> </table></div> </div>
致谢
所有Dolmen软件包都由NPAI(http://www.npai.fr)赞助
变更日志
0.4 (2010-05-31)
添加了翻译(FR)。
从文件夹列表中删除了图标。
0.3 (2010-01-26)
清理了依赖项:zope.app.testing不再使用。
0.2 (2009-12-26)
修正了导入。现在所有依赖项都已声明。
更新导入以使用最新的ZTK。
0.1 (2009-11-03)
初始版本