{ "info": { "author": "Souheil Chelfouh", "author_email": "trollfot@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Other Audience", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "====================\ndolmen.app.container\n====================\n\n`dolmen.app.container` is a collection of tools to work with\ncontainers in Dolmen applications.\n\n\nGetting started\n===============\n\nWe import the Grok, request and authentication tools, in order to use\nthem in our tests::\n\n >>> from grok import testing\n >>> from zope.component import getMultiAdapter\n >>> from zope.publisher.browser import TestRequest\n >>> from zope.security.testing import Principal, Participation\n >>> from zope.security.management import newInteraction, endInteraction\n\n\nNamechooser\n===========\n\nIn order to get a consistent policy concerning the container keys,\n`dolmen.app.container` provides a INameChooser adapter, for the\n`dolmen.content.IContainer` objects.\n\nWe create our container type::\n\n >>> import dolmen.content\n\n >>> class Folder(dolmen.content.Container):\n ... dolmen.content.name('a folderish content')\n ... dolmen.content.require('dolmen.content.Add')\n\n >>> testing.grok_component('folder', Folder)\n True\n\n >>> root = getSite()\n >>> folder = Folder()\n >>> root['folder'] = folder\n\nWe now create a simple content type::\n\n >>> from zope.interface import Interface, implements\n\n >>> class IDocument(Interface):\n ... pass\n\n >>> class Document(dolmen.content.Content):\n ... dolmen.content.name('a document')\n ... implements(IDocument)\n\n >>> testing.grok_component('doc', Document)\n True\n\n >>> manfred = Document()\n >>> manfred.__content_type__\n 'a document'\n >>> manfred.title = u\"Manfred\"\n\nTo use the namechooser, we simply adapt our container to the\nINameChooser interfaces::\n\n >>> from zope.container.interfaces import INameChooser\n >>> chooser = INameChooser(folder)\n >>> chooser\n \n \nIf no name is provided, the component uses the object's title to\ncompute an id::\n\n >>> chooser.chooseName(name='', object=manfred)\n 'manfred'\n\nIf a name is provided, it is used if possible::\n\n >>> chooser.chooseName(name='furry elephant', object=manfred)\n 'furry elephant'\n\nIf the name already exists, it adds a number at the end of the id. To\ndo that, the name chooser will try all the values from 0 to 100 and\nkeep the first successful combination::\n\n >>> folder['manfred'] = object()\n >>> chooser.chooseName(name='', object=manfred)\n 'manfred_1'\n\nIf there is no solution, an error is raised::\n\n >>> for i in range(0, 101):\n ... folder['manfred_%d' % i] = object()\n\n >>> chooser.chooseName(name='', object=manfred)\n Traceback (most recent call last):\n ...\n ValueError: Cannot find a unique name based on `manfred` after 100 attemps.\n\n\nAdding menu\n===========\n\nPermissions\n-----------\n\n`dolmen.app.container` registers a viewlet listing the\n`dolmen.content` factories. It displays the factories allowed in the\ncontainer. It checks the principal's permissions in the process.\n\nThe viewlet is registered for the 'AboveBody' viewlet manager::\n\n >>> from dolmen.app.layout import AboveBody\n >>> from dolmen.app.container import AddMenu\n\n >>> request = TestRequest()\n >>> view = getMultiAdapter((folder, request), name=\"index\")\n\n >>> manager = AboveBody(folder, request, view)\n >>> manager\n \n\n >>> viewlet = AddMenu(folder, request, view, manager)\n >>> viewlet.update()\n\nAs we are currently logged in as Manager, we can see all the\nfactories::\n\n >>> manager = Principal('zope.mgr')\n >>> request.setPrincipal(manager)\n \n >>> for factory in viewlet.factories: print factory['name']\n dolmen.app.container.ftests.Folder\n dolmen.app.container.ftests.Document\n\nWe can test the rendering::\n\n >>> print viewlet.render()\n
\n
Add to folder
\n
\n \n
\n
\n\nWe now log a principal with no privileges::\n\n >>> endInteraction()\n >>> newInteraction(Participation(Principal('zope.judith')))\n\nIf we now try to render the viewlet, the Folder factory should not be\navailable, as it is protected by the 'dolmen.content.Add'\npermission. The Document factory should be available as it's not\nprotected::\n\n >>> viewlet.update()\n >>> for factory in viewlet.factories: print factory['name']\n dolmen.app.container.ftests.Document\n\n\nContraints\n----------\n\nThe viewlet also checks the constraints on the container and the\nfactory.\n\nWe now log back our manager::\n\n >>> endInteraction()\n >>> newInteraction(Participation(Principal('zope.mgr')))\n\nWe test to see if everything is back to normal::\n\n >>> viewlet.update()\n >>> for factory in viewlet.factories: print factory['name']\n dolmen.app.container.ftests.Folder\n dolmen.app.container.ftests.Document\n\nWe apply a constraint on the folder. It will only be able to contain\nIDocument objects::\n\n >>> from zope.interface import alsoProvides\n >>> from zope.container.constraints import contains\n\n >>> class IDocumentRepository(Interface):\n ... contains(IDocument)\n\n >>> alsoProvides(folder, IDocumentRepository)\n\nWe check the respect of the constraint::\n\n >>> viewlet.update()\n >>> for factory in viewlet.factories: print factory['name']\n dolmen.app.container.ftests.Document\n\n\nListing\n=======\n\nTo complete the container's tools, `dolmen.app.container` registers a\nview in charge of displaying the content of a container as a table.\n\nFirst, we reset the container::\n\n >>> del root['folder']\n >>> folder = root['folder'] = Folder()\n\nWe add all kind of contents::\n\n >>> folder['manfred'] = Document()\n >>> folder['judith'] = Document()\n >>> folder['subfolder'] = Folder()\n >>> folder['not_dolmen.content.IBaseContent'] = object()\n\nThen, we can query the listing view::\n\n >>> listing = getMultiAdapter((folder, request), name=\"folderlisting\")\n >>> listing.update()\n\nThe table lines are a list of the container values::\n\n >>> list(listing.values)\n [, , , ]\n\nThe rendering displays links with icons (if existing)::\n\n >>> print listing.content()\n
\n

Content of the folder

\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TitleModification date
judithNone
manfredNone
not_dolmen.content.IBaseContent
subfolderNone
\n
\n\n\nCredits\n=======\n\nAll Dolmen packages are sponsorised by NPAI (http://www.npai.fr)\n\n\nChangelog\n=========\n\n0.4 (2010-05-31)\n----------------\n\n* Added translations (FR).\n\n* Removed icons from the folder listing.\n\n\n0.3 (2010-01-26)\n----------------\n\n* Cleaned up the dependencies : zope.app.testing is no longer used.\n\n\n0.2 (2009-12-26)\n----------------\n\n* Corrected imports. Now all the dependencies are declared.\n\n* Updated imports to use the latest ZTK.\n\n\n0.1 (2009-11-03)\n----------------\n\n* Initial release", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://gitweb.dolmen-project.org/", "keywords": "Grok Zope3 CMS Dolmen", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "dolmen.app.container", "package_url": "https://pypi.org/project/dolmen.app.container/", "platform": "Any", "project_url": "https://pypi.org/project/dolmen.app.container/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://gitweb.dolmen-project.org/" }, "release_url": "https://pypi.org/project/dolmen.app.container/0.4/", "requires_dist": null, "requires_python": null, "summary": "Containers tools for Dolmen applications", "version": "0.4" }, "last_serial": 791318, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "8f5ee74290981b3ad0cea59c134a3fdc", "sha256": "9e68d840a606fa9e8c6ae61b2e949cd6902d39d337ce631cd98c9825c912ca2a" }, "downloads": -1, "filename": "dolmen.app.container-0.1.tar.gz", "has_sig": false, "md5_digest": "8f5ee74290981b3ad0cea59c134a3fdc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7682, "upload_time": "2009-11-03T17:33:48", "url": "https://files.pythonhosted.org/packages/79/db/6fc8020a85b3cb564d3da4f4df54fe9356d44660d4de3c0ca3757f50ea69/dolmen.app.container-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "c07bbd54eaa1be2aa4696484f3fcaac8", "sha256": "a8f341968c3840efbb59822212156fdeb750057bb62fc3007df8d20b9468eef1" }, "downloads": -1, "filename": "dolmen.app.container-0.2.tar.gz", "has_sig": false, "md5_digest": "c07bbd54eaa1be2aa4696484f3fcaac8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8048, "upload_time": "2009-12-26T22:18:39", "url": "https://files.pythonhosted.org/packages/26/e2/cf02fe0782ede22bac3bd51ef55d9ebb06cea75c344b3b1d29fb8b5ea7f5/dolmen.app.container-0.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "76c350316fcf0b7e3c15305ce9dbddff", "sha256": "2d2487765c0feecd2e49062445ec94cc99ca2ac6bb672c825c02c994f89e0638" }, "downloads": -1, "filename": "dolmen.app.container-0.3.0.tar.gz", "has_sig": false, "md5_digest": "76c350316fcf0b7e3c15305ce9dbddff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9409, "upload_time": "2010-01-26T20:02:11", "url": "https://files.pythonhosted.org/packages/17/b9/6ea9df9cf987aa976f179bb623fc5350ec855f5c144d9cf101ea2723ae87/dolmen.app.container-0.3.0.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "c3fabde5cc7450e18634c9cfa372fe81", "sha256": "622d8f7bdddb08e18a947bc46b2f8dc74514e63a7f43d07431220125b8e894ba" }, "downloads": -1, "filename": "dolmen.app.container-0.4.tar.gz", "has_sig": false, "md5_digest": "c3fabde5cc7450e18634c9cfa372fe81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10838, "upload_time": "2010-05-31T01:45:53", "url": "https://files.pythonhosted.org/packages/b9/54/1b3ccf5171988c00a87f740a54835db53538a17517f3237f5a170c5c8b8f/dolmen.app.container-0.4.tar.gz" } ], "1.0a1": [ { "comment_text": "", "digests": { "md5": "e8a9bc6fc803d2386a4b9c6a4161d6ca", "sha256": "689c9b1af61ec78a499f53d9b06ec5cf790fca7dfeba902ea76d64378b5633fa" }, "downloads": -1, "filename": "dolmen.app.container-1.0a1.tar.gz", "has_sig": false, "md5_digest": "e8a9bc6fc803d2386a4b9c6a4161d6ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10764, "upload_time": "2010-06-04T18:46:06", "url": "https://files.pythonhosted.org/packages/17/d8/b22eb8a634a51adb096b89193d954957244bb1ea396f27e59f8f0de806a4/dolmen.app.container-1.0a1.tar.gz" } ], "1.0a2": [ { "comment_text": "", "digests": { "md5": "7c4b58b38dc182ce517a17eb474ce6de", "sha256": "5182105a531807559be408559910221695dc69e2152e8f8e8dc1d20e4162436e" }, "downloads": -1, "filename": "dolmen.app.container-1.0a2.tar.gz", "has_sig": false, "md5_digest": "7c4b58b38dc182ce517a17eb474ce6de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11228, "upload_time": "2010-06-06T19:50:45", "url": "https://files.pythonhosted.org/packages/72/35/8ba5b872429b31c71f0eea0c833d6d6b17e09d116f401fd5abca38a85130/dolmen.app.container-1.0a2.tar.gz" } ], "1.0a3": [ { "comment_text": "", "digests": { "md5": "06535bc97926cf48c561d30e0705c59a", "sha256": "7f4d20f71b67842bd17889933b1deab7619b260242a7ddf9d2d2a2c2bb271627" }, "downloads": -1, "filename": "dolmen.app.container-1.0a3.tar.gz", "has_sig": false, "md5_digest": "06535bc97926cf48c561d30e0705c59a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11398, "upload_time": "2010-11-16T15:34:58", "url": "https://files.pythonhosted.org/packages/32/c8/3921345c296005f22eaa3ec97ac582fca3d51cc6132309cc03515c54af7f/dolmen.app.container-1.0a3.tar.gz" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "14ef7db9267a632d3b6cb5199824af77", "sha256": "db1ae022954257668b181ed3b02c0a1bcf370343a487f9d2cc2970e26fc7a360" }, "downloads": -1, "filename": "dolmen.app.container-1.0b1.tar.gz", "has_sig": false, "md5_digest": "14ef7db9267a632d3b6cb5199824af77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11623, "upload_time": "2011-02-02T17:18:58", "url": "https://files.pythonhosted.org/packages/9e/4f/282c23527938696afe42284687deb12d426ec7dcba386a5ab01126de5201/dolmen.app.container-1.0b1.tar.gz" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "a890e8b484709cb7368dd026510c4975", "sha256": "cf57541bc1c58c6cd476ea75ba30a5dd954d3204550940aa4c1eb758358c4aa1" }, "downloads": -1, "filename": "dolmen.app.container-1.0b2.tar.gz", "has_sig": false, "md5_digest": "a890e8b484709cb7368dd026510c4975", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12106, "upload_time": "2011-02-14T15:06:01", "url": "https://files.pythonhosted.org/packages/9f/1a/237912bfaed06bbb3c37bbddc6e74db59b7e74abfafaff378c4453da8d4f/dolmen.app.container-1.0b2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c3fabde5cc7450e18634c9cfa372fe81", "sha256": "622d8f7bdddb08e18a947bc46b2f8dc74514e63a7f43d07431220125b8e894ba" }, "downloads": -1, "filename": "dolmen.app.container-0.4.tar.gz", "has_sig": false, "md5_digest": "c3fabde5cc7450e18634c9cfa372fe81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10838, "upload_time": "2010-05-31T01:45:53", "url": "https://files.pythonhosted.org/packages/b9/54/1b3ccf5171988c00a87f740a54835db53538a17517f3237f5a170c5c8b8f/dolmen.app.container-0.4.tar.gz" } ] }