Dolmen contenttype extension : folder
Project description
menhir.contenttype.folder provides a folderish content for Dolmen based Grok applications. This folderish type has several ways to display itself, allowing the editor to chose wether it should display a summary of the content or a structured and pagined rendering.
Schema
A Folder does not have a particular schema. It uses only the IBaseContent archetype from dolmen.content, exposing only the title attribute:
>>> from dolmen.content import schema >>> from menhir.contenttype.folder import Folder >>> print schema.bind().get(Folder) [<InterfaceClass dolmen.content.interfaces.IBaseContent>]
The instanciation provides a fully functionnal folderish object:
>>> from zope.container.interfaces import IContainer >>> folder = Folder(title=u"Some title") >>> IContainer.providedBy(folder) True
The Folder class inherits from the grokcore.content OrderedContainer: the keys of container are orderable (read mutable):
>>> from grokcore.content import OrderedContainer >>> isinstance(folder, OrderedContainer) True
Test in-situ
Setup the environment
>>> from zope.component.hooks import getSite >>> root = getSite()
Create a Folder.
>>> from menhir.contenttype.folder import Folder >>> root[u'folder'] = Folder() >>> folder = root.get(u'folder')
Create a dummy content type, so that we can put dummy content in the folder.
>>> import dolmen.content as content >>> class Dummy(content.Content): ... content.name("Dummy") ... # content.icon("dummy.png")
Fill the folder with some dummies.
>>> folder[u'books'] = Dummy(title=u"Books") >>> folder[u'films'] = Dummy(title=u"Films") >>> folder[u'music'] = Dummy(title=u"Music")>>> folder[u'subfolder'] = Folder(title=u"SubFolder") >>> folder[u'subfolder'][u'subfolder2'] = Folder(title=u'SubFolder Two') >>> folder[u'subfolder'][u'bogus'] = Dummy(title=u'Bogus') >>> folder[u'subfolder'][u'subfolder2'][u'hocus'] = Dummy(title=u"hocus")
Verify the contents are correct.
>>> dict([x for x in folder.items()]) {u'films': <menhir.contenttype.folder.Dummy object at ...>, u'books': <menhir.contenttype.folder.Dummy object at ...>, u'music': <menhir.contenttype.folder.Dummy object at ...>, u'subfolder': <menhir.contenttype.folder.folder.Folder object at ...>}
Let’s take a look at it from the browser’s point-of-view.
>>> from zope.publisher.browser import TestRequest >>> from zope.component import getMultiAdapter >>> request = TestRequest()>>> view = getMultiAdapter((folder, request), name=folder.selected_view) >>> view.__class__.__name__ 'FolderListing'>>> view.update() >>> print view.render() <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/books">books</a></td> <td>None</td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/films">films</a></td> <td>None</td> </tr> <tr class="even"> <td><a href="http://127.0.0.1/folder/music">music</a></td> <td>None</td> </tr> <tr class="odd"> <td><img src="http://127.0.0.1/@@/menhir-contenttype-folder-folder-IFolder-icon.png" alt="Folder" width="16" height="16" border="0" /> <a href="http://127.0.0.1/folder/subfolder">subfolder</a></td> <td>...</td> </tr> </tbody> </table></div> </div>
We should have a look at the default view (index) as well.
>>> view = getMultiAdapter((folder, request), name='index') >>> view.__class__.__name__ 'SelectedView'>>> view.update() >>> print view.render() <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/books">books</a></td> <td>None</td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/films">films</a></td> <td>None</td> </tr> <tr class="even"> <td><a href="http://127.0.0.1/folder/music">music</a></td> <td>None</td> </tr> <tr class="odd"> <td><img src="http://127.0.0.1/@@/menhir-contenttype-folder-folder-IFolder-icon.png" alt="Folder" width="16" height="16" border="0" /> <a href="http://127.0.0.1/folder/subfolder">subfolder</a></td> <td>...</td> </tr> </tbody> </table></div> </div>
Lastly, let’s change the folder layout to the full rendering view provided in this package.
>>> folder.selected_view = u'compositeview' >>> view = getMultiAdapter((folder, request), name=folder.selected_view) >>> view.__class__.__name__ 'CompositeView'>>> view.update() >>> print view.content() <div class="composite-view"> <h1></h1> <div class="composite-body sequence-block"> <div><form action="http://127.0.0.1" method="post" enctype="multipart/form-data"> <h1>Books</h1> </form> </div> </div> <div class="composite-body sequence-block"> <div><form action="http://127.0.0.1" method="post" enctype="multipart/form-data"> <h1>Films</h1> </form> </div> </div> <div class="composite-body sequence-block"> <div><form action="http://127.0.0.1" method="post" enctype="multipart/form-data"> <h1>Music</h1> </form> </div> </div> <div class="composite-body sequence-block"> <div><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><img src="http://127.0.0.1/@@/menhir-contenttype-folder-folder-IFolder-icon.png" alt="Folder" width="16" height="16" border="0" /> <a href="http://127.0.0.1/folder/subfolder/subfolder2">subfolder2</a></td> <td>...</td> </tr> <tr class="odd"> <td><a href="http://127.0.0.1/folder/subfolder/bogus">bogus</a></td> <td>None</td> </tr> </tbody> </table></div> <BLANKLINE> </div> </div> </div> </div>
Changelog
0.2 (2010-07-27)
Corrected packaging (missing icon)
0.1 (2010-07-19)
Initial release
Project details
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 menhir.contenttype.folder-0.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 681b5aea50750ec47b85896701b073d1f1734a12b02e19f770c03f8f538ab971 |
|
MD5 | d0b4f1d7957686cc03e2608522024da9 |
|
BLAKE2b-256 | de1211db371e72e190c364d11f0cb0b96b9739d33ec7b9c4cfffdb5597dd041e |