跳转到主要内容

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.containerdolmen.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 注册了一个列出 dolmen.content 工厂视图的小部件。它显示容器中允许的工厂。它在此过程中检查主体的权限。

该小部件已注册为 'AboveBody' 视图管理器

>>> from dolmen.app.layout import AboveBody
>>> from dolmen.app.container import AddMenu

>>> request = TestRequest()
>>> view = getMultiAdapter((folder, request), name="index")

>>> manager = AboveBody(folder, request, view)
>>> manager
<dolmen.app.layout.master.AboveBody object at ...>

>>> viewlet = AddMenu(folder, request, view, manager)
>>> viewlet.update()

由于我们目前以管理员身份登录,我们可以看到所有工厂

>>> manager = Principal('zope.mgr')
>>> request.setPrincipal(manager)

>>> for factory in viewlet.factories: print factory['name']
dolmen.app.container.ftests.Folder
dolmen.app.container.ftests.Document

我们可以测试渲染

>>> print viewlet.render()
<dl id="add-menu" class="menu additional-actions">
  <dt>Add to folder</dt>
  <dd>
    <ul>
      <li>
      <a href="http://127.0.0.1/folder/++add++dolmen.app.container.ftests.Folder"
    id="dolmen-app-container-ftests-Folder">
        <img src="http://127.0.0.1/@@/dolmen-content-interfaces-IContainer-contenttype_icon.png" alt="Container" width="16" height="16" border="0" />
        <span>a folderish content</span>
      </a>
      </li>
      <li>
      <a href="http://127.0.0.1/folder/++add++dolmen.app.container.ftests.Document"
    id="dolmen-app-container-ftests-Document">
        <img src="http://127.0.0.1/@@/dolmen-app-container-ftests-IDocument-contenttype_icon.png" alt="Document" width="16" height="16" border="0" />
        <span>a document</span>
      </a>
      </li>
    </ul>
  </dd>
</dl>

我们现在登录一个没有任何权限的主体

>>> endInteraction()
>>> newInteraction(Participation(Principal('zope.judith')))

如果我们现在尝试渲染视图组件,文件夹工厂不应该可用,因为它受到“dolmen.content.Add”权限的保护。文档工厂应该是可用的,因为它没有被保护。

>>> viewlet.update()
>>> for factory in viewlet.factories: print factory['name']
dolmen.app.container.ftests.Document

约束

视图组件还会检查容器和工厂的约束。

我们现在回滚我们的管理器

>>> endInteraction()
>>> newInteraction(Participation(Principal('zope.mgr')))

我们测试以查看一切是否恢复正常

>>> viewlet.update()
>>> for factory in viewlet.factories: print factory['name']
dolmen.app.container.ftests.Folder
dolmen.app.container.ftests.Document

我们在文件夹上应用约束。它只能包含IDocument对象

>>> from zope.interface import alsoProvides
>>> from zope.container.constraints import contains

>>> class IDocumentRepository(Interface):
...   contains(IDocument)

>>> alsoProvides(folder, IDocumentRepository)

我们检查约束的遵守情况

>>> viewlet.update()
>>> for factory in viewlet.factories: print factory['name']
dolmen.app.container.ftests.Document

列表

为了完善容器的工具,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)

  • 初始版本

项目详情


下载文件

下载适合您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源分发

dolmen.app.container-0.4.tar.gz (10.8 kB 查看散列

上传时间:

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面