{ "info": { "author": "Danilo G. Botelho", "author_email": "danilogbotelho@yahoo.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": "Introduction\n============\n\nScaffolding allows you to auto-generate forms for models. The goal is to create \ncommonly used forms without much boilerplate while still allowing for deeper \ncustomizations.\n\n.. contents::\n\nBefore we can start using scaffolding, we must create the content to work with:\n\nModels\n------\n\n >>> import grokcore.component as grok\n >>> from zope.interface import Interface\n >>> from zope import schema\n\n >>> class IMammoth(Interface):\n ... name = schema.TextLine(title=u\"Name\")\n ... age = schema.Int(title=u\"Age\")\n\n >>> class Mammoth(Model):\n ... grok.implements(IMammoth)\n ... name = schema.fieldproperty.FieldProperty(IMammoth['name'])\n ... age = schema.fieldproperty.FieldProperty(IMammoth['age'])\n\n >>> class HerdContainer(Container):\n ... pass\n\nNow all we have to do is create a controller:\n\nWhole application in a few lines\n--------------------------------\n\n >>> from megrok.scaffold import Controller, scaffold\n \n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth)\n\nThat's it. And we have an add form, an edit form, display 'form' and a list \nview. With deletion enabled.\n\nLet's verify that.\n\nGrokking and querying\n---------------------\n\nWe let Grok register the component::\n\n >>> grok_component('mammothcontroller', MammothController)\n True\n\nNow, we can query it normally::\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n >>> herd = HerdContainer()\n >>> getRootFolder()['herd'] = herd\n >>> manfred = Mammoth()\n >>> herd['manfred'] = manfred\n\n >>> from zope.component import getMultiAdapter\n >>> editform = getMultiAdapter((manfred, request), name=\"edit\")\n\n >>> editform\n \n >>> print editform()\n \n \n
\n
\n ...\n\n >>> displayform = getMultiAdapter((manfred, request), name=\"index\")\n >>> displayform\n \n\n >>> addform = getMultiAdapter((herd, request), name=\"addmammoth\")\n >>> addform\n \n\n >>> listform = getMultiAdapter((herd, request), name=\"listmammoth\")\n >>> listform\n \n\nLayout integration\n------------------\n\nFirst, let's unregister the previous forms to start it anew::\n\n >>> from zope.component import getGlobalSiteManager\n >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer\n >>> from zope.interface import implementedBy\n >>> sm = getGlobalSiteManager()\n >>> def unregister_views():\n ... done = sm.unregisterAdapter(None, (implementedBy(Mammoth), \n ... IDefaultBrowserLayer), Interface, 'edit')\n ... done = done and sm.unregisterAdapter(None, (implementedBy(Mammoth), \n ... IDefaultBrowserLayer), Interface, 'index')\n ... done = done and sm.unregisterAdapter(None, (implementedBy(HerdContainer), \n ... IDefaultBrowserLayer), Interface, 'addmammoth')\n ... done = done and sm.unregisterAdapter(None, (implementedBy(HerdContainer), \n ... IDefaultBrowserLayer), Interface, 'listmammoth')\n ... return done\n >>> unregister_views()\n True\n\nNow, simply define the layout as usual::\n\n >>> from megrok.layout import Layout\n >>> class MyLayout(Layout):\n ... grok.name('mylayout')\n ... grok.context(Interface)\n ...\n ... def render(self):\n ... return u\"A simple layout\\n%s\" % self.view.content()\n >>> grok_component('MyLayout', MyLayout)\n True\n\nAnd tell the scaffolding grokker to register the forms as layout pages::\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth, aspage=True)\n \n >>> grok_component('mammothcontroller', MammothController)\n True\n >>> editform = getMultiAdapter((manfred, request), name=\"edit\")\n >>> print editform()\n A simple layout\n
\n \n ...\n\nCustomization\n=============\n\nThe names of the views can be configured using parameters passed to the scaffold directive, e.g.::\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth, addname='add', editname='edit', displayname='index', listname='index')\n\nBesides this, the interfaces used for each form can be set as well::\n\n >>> class IListMammoth(Interface):\n ... name = schema.TextLine(title=u\"Mammoth's name\")\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(add=Mammoth, edit=IMammoth, list=IListMammoth, display=IMammoth)\n\nOne can easily disable the automatic registering of views::\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth, list=False)\n\nPutting it all together::\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth, list=IListMammoth, listname='index', edit=False, aspage=True)\n\nThe latter will register::\n \n- an add form named after the model's name ('addmammoth')\n- a display form named 'index'\n- a list view named 'index' displaying the fields defined in IListMammoth\n- no edit form\n\n >>> unregister_views()\n True\n >>> grok_component('mammothcontroller', MammothController)\n True\n >>> getMultiAdapter((herd, request), name=\"index\")\n \n >>> editform = getMultiAdapter((manfred, request), name=\"edit\")\n Traceback (most recent call last):\n ...\n ComponentLookupError:\n\nActions\n-------\n\nEach form have a subset of these common actions: 'add', 'edit', 'apply', 'delete'.\n Some can be activated or deactivated using attributes like 'allow_edit' and 'allow_delete'.\n\nYour own custom actions can be created using formlib's action decorator::\n\n >>> from grokcore.formlib import action\n\n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth, listname='index')\n ...\n ... allow_delete = False\n ...\n ... @action('Cancel')\n ... def cancel(self, **data):\n ... pass\n ...\n ... list_actions = Controller.list_actions.copy()\n ...\n ... @action('Import', list_actions)\n ... def do_import(self, **data):\n ... self.redirect(self.url(self.context, 'import_view'))\n\n >>> unregister_views()\n True\n >>> grok_component('mammothcontroller', MammothController)\n True\n >>> listform = getMultiAdapter((herd, request), name=\"index\")\n >>> html = listform()\n >>> print listform() # doctest: +NORMALIZE_WHITESPACE\n 1\n \n\nSecurity\n========\n\nBy default the views registered have no permissions set. To change that use the\n megrok.scaffold's 'require' directive::\n\n >>> from megrok.scaffold import require as scaffold_require \n \n >>> class MammothController(Controller):\n ... grok.context(HerdContainer)\n ...\n ... scaffold(Mammoth)\n ... scaffold_require(add='zope.ManageContent', edit='zope.ManageContent')\n\nAPI\n===\n\nSee interfaces.py module.\n\nChangelog\n=========\n\n0.3\n-----------------\n\n- List view table now uses field's titles as columns headers\n- Fixed bug (indentation error) on Controller default add method\n- Changed Controller __init__'s signature\n- Dropped megrok.layout dependency. Now either megrok.layout or\ngrokcore.layout must be included.\n- Controllers are now registered as utilities\n\n\n0.2\n------------------\n\n- Fixed templates for layout pages (aspage=True)\n- Fixed minor bugs\n\n0.1\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://pypi.python.org/pypi/megrok.scaffold", "keywords": "CRUD form auto model scaffold", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "megrok.scaffold", "package_url": "https://pypi.org/project/megrok.scaffold/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/megrok.scaffold/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/megrok.scaffold" }, "release_url": "https://pypi.org/project/megrok.scaffold/0.3/", "requires_dist": null, "requires_python": null, "summary": "Auto-generate CRUD forms for a given domain class.", "version": "0.3" }, "last_serial": 744801, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ad62b0a50375fef82dcc3252434e8fa3", "sha256": "61b736dbd37b28c2bcd2bf9d157d54f588b971232f507de3e90a22d7f540b7f7" }, "downloads": -1, "filename": "megrok.scaffold-0.1.tar.gz", "has_sig": false, "md5_digest": "ad62b0a50375fef82dcc3252434e8fa3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16689, "upload_time": "2011-09-17T23:06:14", "url": "https://files.pythonhosted.org/packages/19/18/5f58404e0b03adbfc233a03b2668259870e90e882821414ed3f8ba93f3c4/megrok.scaffold-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "56b04a1f9d49a1407edfd39d7e30e36f", "sha256": "2c65c621422d4f21d75b0ba297aa661e4fa4f07e5a34f55eb7f30f4a47b7dbc4" }, "downloads": -1, "filename": "megrok.scaffold-0.2.tar.gz", "has_sig": false, "md5_digest": "56b04a1f9d49a1407edfd39d7e30e36f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17036, "upload_time": "2011-09-21T22:06:45", "url": "https://files.pythonhosted.org/packages/1d/45/258b33c29ab2db12537057cb1b2549a8e136e7b9487314542821919cc166/megrok.scaffold-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "7d0017d8eea9fcd8ca3540f472a070b5", "sha256": "b2d21554ea61b002acb33d751c8ca6611e69c60748fadc8cb23a0d76f8a08739" }, "downloads": -1, "filename": "megrok.scaffold-0.3.tar.gz", "has_sig": false, "md5_digest": "7d0017d8eea9fcd8ca3540f472a070b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16353, "upload_time": "2011-12-03T19:54:57", "url": "https://files.pythonhosted.org/packages/f6/26/409609abab6e0db3f0755de379398c834fe0acb061a8790c777fb73ff657/megrok.scaffold-0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7d0017d8eea9fcd8ca3540f472a070b5", "sha256": "b2d21554ea61b002acb33d751c8ca6611e69c60748fadc8cb23a0d76f8a08739" }, "downloads": -1, "filename": "megrok.scaffold-0.3.tar.gz", "has_sig": false, "md5_digest": "7d0017d8eea9fcd8ca3540f472a070b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16353, "upload_time": "2011-12-03T19:54:57", "url": "https://files.pythonhosted.org/packages/f6/26/409609abab6e0db3f0755de379398c834fe0acb061a8790c777fb73ff657/megrok.scaffold-0.3.tar.gz" } ] }