杜尔曼应用容器工具

dolmen.app.container的Python项目详细描述


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对象。

我们创建容器类型:

>>> 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"

要使用namechooser,我们只需使容器适应 机械增压器接口:

>>> 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注册一个viewlet,列出 杜尔曼.内容工厂。它显示了 集装箱。它检查进程中主体的权限。

viewlet是为“overbody”viewlet管理器注册的:

>>> 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')))

如果现在尝试呈现viewlet,文件夹工厂不应该是 可用,因为它受“dolmen.content.add”保护 许可。文档工厂应该是可用的,因为它不是 受保护:

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

禁忌症

viewlet还检查容器和 工厂。

我们现在重新登录我们的经理:

>>> 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

我们对文件夹应用了约束。它只能容纳 i文档对象:

>>> 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

列表

要完成容器的工具,请注册 视图,负责将容器的内容显示为表。

首先,我们重置容器:

>>> 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 ...>]
< P>显示与图标(如果存在)的链接:

>>> 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)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java访问数据库中的数据。罐子   java Android Studio 2摄像头安全性异常   编译创建。java文件,并将其编译为。运行时的类文件   使用正则表达式的Java单词过滤器?   java如何获取服务器和客户端之间交换的证书详细信息(如果是activemq)   安卓在java代码中使用相对布局   java在代码中设置线性布局权重,而不是xml问题   java在Spring安全认证成功URL上设置自定义响应头   java Selenium+sikuli runnable jar   多线程跟踪Java中的引用   源代码值为1.5的java错误已过时,将在未来的版本中删除   java JPA:PGobject无法强制转换   java如何将eclipse项目的类patth添加到ant脚本中?   java如何提高准确性?基于连续隐马尔可夫模型(Jahmm)的活动识别   java如何在Groovy中调用OpenCSV库CSVReader(Reader in,char x)?   java Bukkit插件消息传递   用于循环如何在两个字符后单独打印   java熟悉Netbeans的人:为什么会发生这种情况?错误不是真正的错误吗?