Containers tools for Dolmen applications
Project description
dolmen.app.container is a collection of tools to work with containers in Dolmen applications.
Getting started
We import the Grok, request and authentication tools, in order to use them in our tests:
>>> from grokcore.component 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
Namechooser
In order to get a consistent policy concerning the container keys, dolmen.app.container provides a INameChooser adapter, for the dolmen.content.IContainer objects.
We create our container type:
>>> 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
We now create a simple content type:
>>> from zope.interface import Interface, implements >>> class IDocument(Interface): ... pass >>> class Document(dolmen.content.Content): ... dolmen.content.name('a document') ... dolmen.content.require('zope.Public') ... implements(IDocument) >>> testing.grok_component('doc', Document) True >>> manfred = Document() >>> manfred.__content_type__ u'a document' >>> manfred.title = u"Manfred"
To use the namechooser, we simply adapt our container to the INameChooser interfaces:
>>> from zope.container.interfaces import INameChooser >>> chooser = INameChooser(folder) >>> chooser <dolmen.app.container.namechoosers.NormalizingNameChooser object at ...>
If no name is provided, the component uses the object’s title to compute an id:
>>> chooser.chooseName(name='', object=manfred) 'manfred'
If a name is provided, it is used if possible:
>>> chooser.chooseName(name='furry elephant', object=manfred) 'furry elephant'
If the name already exists, it adds a number at the end of the id. To do that, the name chooser will try all the values from 0 to 100 and keep the first successful combination:
>>> folder['manfred'] = object() >>> chooser.chooseName(name='', object=manfred) 'manfred_1'
If there is no solution, an error is raised:
>>> 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.
Listing
To complete the container’s tools, dolmen.app.container registers a view in charge of displaying the content of a container as a table.
First, we reset the container:
>>> del root['folder'] >>> folder = root['folder'] = Folder()
We add all kind of contents:
>>> folder['manfred'] = Document(title=u'Manfred the Great') >>> folder['judith'] = Document() >>> folder['subfolder'] = Folder() >>> folder['not_dolmen.content.IBaseContent'] = object()
Then, we can query the listing view:
>>> listing = getMultiAdapter((folder, request), name="folderlisting") >>> listing.update()
The table lines are a list of the container values:
>>> 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 ...>]
The rendering displays links with icons (if existing):
>>> 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></td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/manfred">Manfred the Great</a></td> <td></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></td> </tr> </tbody> </table></div> </div>
Credits
All Dolmen packages are sponsorised by NPAI (http://www.npai.fr)
Changelog
1.0b1 (2011-02-02)
Updated the package for Grok 1.3.
Fixed a bug where the folder listing update was not called.
The Title column now really displays the title, if available.
The Modified column no longer displays ‘None’ if no date is available.
1.0a3 (2010-11-16)
TablePage component is now imported from megrok.z3ctable. We can now use the latest dolmen.app.layout.
1.0a2 (2010-06-06)
Restaured optional icon view rendering in both the add menu and the content listing.
1.0a1 (2010-06-04)
We now use dolmen.menu instead of megrok.menu.
Removed icons from the Add to “Folder” menu.
We now depend on the newest dolmen.content.
Fixed a bug where the zope.Public permission was not handled like the special public permission it is.
0.4 (2010-05-31)
Added translations (FR).
Removed icons from the folder listing.
0.3 (2010-01-26)
Cleaned up the dependencies : zope.app.testing is no longer used.
0.2 (2009-12-26)
Corrected imports. Now all the dependencies are declared.
Updated imports to use the latest ZTK.
0.1 (2009-11-03)
Initial release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for dolmen.app.container-1.0b1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | db1ae022954257668b181ed3b02c0a1bcf370343a487f9d2cc2970e26fc7a360 |
|
MD5 | 14ef7db9267a632d3b6cb5199824af77 |
|
BLAKE2b-256 | 9e4f282c23527938696afe42284687deb12d426ec7dcba386a5ab01126de5201 |