Skip to main content

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 IDescriptiveSchema from dolmen.app.content, exposing only the title and description attributes:

>>> from dolmen.content import schema
>>> from menhir.contenttype.folder import Folder
>>> print schema.bind().get(Folder)
[<InterfaceClass dolmen.app.content.interfaces.IDescriptiveSchema>]

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></td>
    </tr>
    <tr class="odd">
      <td><a href="http://127.0.0.1/folder/films">films</a></td>
      <td></td>
    </tr>
    <tr class="even">
      <td><a href="http://127.0.0.1/folder/music">music</a></td>
      <td></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></td>
    </tr>
    <tr class="odd">
      <td><a href="http://127.0.0.1/folder/films">films</a></td>
      <td></td>
    </tr>
    <tr class="even">
      <td><a href="http://127.0.0.1/folder/music">music</a></td>
      <td></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">SubFolder Two</a></td>
      <td></td>
    </tr>
    <tr class="odd">
      <td><a href="http://127.0.0.1/folder/subfolder/bogus">bogus</a></td>
      <td></td>
    </tr>
  </tbody>
</table></div>
<BLANKLINE>
</div>
</div>
  </div>
</div>

Changelog

0.4 (2011-02-14)

  • The schema no longer includes IViewSelector. This prevents the field from showing up in the auto-generated forms.

  • IFolder now inherits from zope.container IContainer.

  • Consolidated the “composite view” using a normalized way to get the default view name. We now test if the view exists and if it’s a valid IPage.

0.3 (2011-02-14)

  • Updated for the latest changes in dolmen.content, dolmen.app.content and dolmen.app.container.

  • Cleaned up dependencies.

0.2 (2010-07-27)

  • Corrected packaging (missing icon)

0.1 (2010-07-19)

  • Initial release

Metadata

Release files for menhir.contenttype.folder 0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for menhir.contenttype.folder 0.4
File Size Uploaded Provenance Actions
menhir.contenttype.folder-0.4.tar.gz 8.0 kB Without provenance Details for menhir.contenttype.folder-0.4.tar.gz

Release files / menhir.contenttype.folder-0.4.tar.gz

Download URL menhir.contenttype.folder-0.4.tar.gz
Size 8.0 kB
Tags Source
SHA-256 checksum
How to use checksums
3bd4ed44aac5e38054999a330a193bc774e33a117515fc1f0022ac5b7e271cc2
BLAKE2b-256 checksum
How to use checksums
ae8cda2ff43d87030d53ec9c377e2dc2fe25d74f62b1c433db2841029030cea5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for menhir.contenttype.folder 0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page