[Checkins] SVN: megrok.layout/trunk/ Fix default templates on form, and make available EditForm, AddForm and DisplayForm as well
Souheil CHELFOUH
souheil at chelfouh.com
Mon Oct 18 05:58:55 EDT 2010
Log message for revision 117657:
Fix default templates on form, and make available EditForm, AddForm and DisplayForm as well
Changed:
U megrok.layout/trunk/docs/HISTORY.txt
U megrok.layout/trunk/setup.py
U megrok.layout/trunk/src/megrok/layout/README.txt
U megrok.layout/trunk/src/megrok/layout/__init__.py
U megrok.layout/trunk/src/megrok/layout/components.py
U megrok.layout/trunk/src/megrok/layout/configure.zcml
A megrok.layout/trunk/src/megrok/layout/ftests/test_form.py
U megrok.layout/trunk/src/megrok/layout/meta.zcml
A megrok.layout/trunk/src/megrok/layout/templates/
A megrok.layout/trunk/src/megrok/layout/templates/default_display_form.pt
A megrok.layout/trunk/src/megrok/layout/templates/default_edit_form.pt
-=-
Modified: megrok.layout/trunk/docs/HISTORY.txt
===================================================================
--- megrok.layout/trunk/docs/HISTORY.txt 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/docs/HISTORY.txt 2010-10-18 09:58:54 UTC (rev 117657)
@@ -1,6 +1,17 @@
Changelog
=========
+0.9 (2009-09-26)
+----------------
+
+- Add default templates to form which doesn't contain an html and body
+ tag.
+ [sylvain]
+
+- Add an AddForm, EditForm and DisplayForm, all aware of the layout
+ component.
+ [sylvain]
+
0.8 (2009-09-17)
----------------
Modified: megrok.layout/trunk/setup.py
===================================================================
--- megrok.layout/trunk/setup.py 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/setup.py 2010-10-18 09:58:54 UTC (rev 117657)
@@ -6,7 +6,7 @@
open(os.path.join('docs', 'HISTORY.txt')).read()
setup(name='megrok.layout',
- version='0.8',
+ version='0.9',
description="A layout component package for zope3 and Grok.",
long_description = long_description,
classifiers=[
Modified: megrok.layout/trunk/src/megrok/layout/README.txt
===================================================================
--- megrok.layout/trunk/src/megrok/layout/README.txt 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/src/megrok/layout/README.txt 2010-10-18 09:58:54 UTC (rev 117657)
@@ -113,3 +113,9 @@
>>> page()
u'Header. Page: Looks like an elephant. Footer'
+
+Forms
+=====
+
+You have as well a Form, AddForm, EditForm and DisplayForm availables,
+which are all aware of Layout components like Page does.
Modified: megrok.layout/trunk/src/megrok/layout/__init__.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/__init__.py 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/src/megrok/layout/__init__.py 2010-10-18 09:58:54 UTC (rev 117657)
@@ -2,3 +2,4 @@
from megrok.layout.interfaces import ILayout, IPage
from megrok.layout.components import Layout, Page, Form
+from megrok.layout.components import AddForm, EditForm, DisplayForm
Modified: megrok.layout/trunk/src/megrok/layout/components.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/components.py 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/src/megrok/layout/components.py 2010-10-18 09:58:54 UTC (rev 117657)
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
+import os
import zope.component
import grokcore.view
@@ -93,17 +94,16 @@
return mapply(self.render, (), self.request)
-class Form(grokcore.formlib.Form):
- """A form class.
+class LayoutAwareForm(object):
+ """A mixin to make form aware of layouts.
"""
- grok.baseclass()
def __init__(self, context, request):
- super(Form, self).__init__(context, request)
+ super(LayoutAwareForm, self).__init__(context, request)
self.layout = None
def default_namespace(self):
- namespace = super(Form, self).default_namespace()
+ namespace = super(LayoutAwareForm, self).default_namespace()
namespace['layout'] = self.layout
return namespace
@@ -129,3 +129,36 @@
self.layout = zope.component.getMultiAdapter(
(self.request, self.context), ILayout)
return self.layout(self)
+
+
+# Default forms for form without the html and body tags
+default_form_template = grokcore.view.PageTemplateFile(os.path.join(
+ 'templates', 'default_edit_form.pt'))
+default_form_template.__grok_name__ = 'default_edit_form'
+default_display_template = grokcore.view.PageTemplateFile(os.path.join(
+ 'templates', 'default_display_form.pt'))
+default_display_template.__grok_name__ = 'default_display_form'
+
+
+class Form(LayoutAwareForm, grokcore.formlib.Form):
+
+ grok.baseclass()
+ template = default_form_template
+
+
+class AddForm(LayoutAwareForm, grokcore.formlib.AddForm):
+
+ grok.baseclass()
+ template = default_display_template
+
+
+class EditForm(LayoutAwareForm, grokcore.formlib.EditForm):
+
+ grok.baseclass()
+ template = default_form_template
+
+
+class DisplayForm(LayoutAwareForm, grokcore.formlib.DisplayForm):
+
+ grok.baseclass()
+ template = default_form_template
Modified: megrok.layout/trunk/src/megrok/layout/configure.zcml
===================================================================
--- megrok.layout/trunk/src/megrok/layout/configure.zcml 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/src/megrok/layout/configure.zcml 2010-10-18 09:58:54 UTC (rev 117657)
@@ -4,6 +4,6 @@
<include package="megrok.layout" file="meta.zcml" />
<include package="grokcore.view"/>
+ <include package="grokcore.formlib"/>
-
</configure>
Added: megrok.layout/trunk/src/megrok/layout/ftests/test_form.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftests/test_form.py (rev 0)
+++ megrok.layout/trunk/src/megrok/layout/ftests/test_form.py 2010-10-18 09:58:54 UTC (rev 117657)
@@ -0,0 +1,101 @@
+"""
+ >>> from megrok.layout import ILayout
+ >>> from zope.component import getMultiAdapter
+ >>> from zope.publisher.browser import TestRequest
+ >>> request = TestRequest()
+ >>> cow = Cow()
+ >>> mylayout = getMultiAdapter((request, cow), ILayout)
+
+ Display form:
+ >>> myview = getMultiAdapter((cow, request), name='myview')
+ >>> print myview()
+ <html>
+ <body>
+ <div class="layout"><form ...
+ ...<span>Color</span>...
+ ...<div class="widget">globally dark</div>...
+ ...</form>
+ </div>
+ </body>
+ </html>
+
+ >>> myview
+ <megrok.layout.ftests.test_form.MyView object at ...>
+ >>> myview.layout
+ <megrok.layout.ftests.test_form.Master object at ...>
+ >>> print myview.content()
+ <form action="http://127.0.0.1" method="post"
+ class="edit-form" enctype="multipart/form-data">
+ ...<span>Color</span>...
+ ...<div class="widget">globally dark</div>...
+ </form>
+
+ Edit form:
+ >>> myeditview = getMultiAdapter((cow, request), name='myeditview')
+ >>> print myeditview()
+ <html>
+ <body>
+ <div class="layout"><form ...
+ ...<span>Color</span>...
+ ... value="globally dark" ...
+ ... value="Apply" ...
+ ...</form>
+ </div>
+ </body>
+ </html>
+
+ >>> myeditview
+ <megrok.layout.ftests.test_form.MyEditView object at ...>
+ >>> myeditview.layout
+ <megrok.layout.ftests.test_form.Master object at ...>
+ >>> print myeditview.content()
+ <form action="http://127.0.0.1" method="post"
+ class="edit-form" enctype="multipart/form-data">
+ ...<span>Color</span>...
+ ... value="globally dark" ...
+ ... value="Apply" ...
+ </form>
+
+
+"""
+import grokcore.component as grok
+from grokcore.view import templatedir
+
+from zope import interface, schema
+from megrok.layout import Layout, DisplayForm, EditForm
+
+templatedir('templates')
+
+
+class ICowProperties(interface.Interface):
+
+ color = schema.TextLine(title=u"Color")
+
+
+class Cow(grok.Context):
+ grok.implements(ICowProperties)
+
+ color = u"globally dark"
+
+
+class Master(Layout):
+ grok.name('master')
+ grok.context(Cow)
+
+
+class MyView(DisplayForm):
+ grok.context(Cow)
+
+
+class MyEditView(EditForm):
+ grok.context(Cow)
+
+
+def test_suite():
+ from zope.testing import doctest
+ from megrok.layout.ftests import FunctionalLayer
+ suite = doctest.DocTestSuite(
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+ )
+ suite.layer = FunctionalLayer
+ return suite
Modified: megrok.layout/trunk/src/megrok/layout/meta.zcml
===================================================================
--- megrok.layout/trunk/src/megrok/layout/meta.zcml 2010-10-18 09:58:48 UTC (rev 117656)
+++ megrok.layout/trunk/src/megrok/layout/meta.zcml 2010-10-18 09:58:54 UTC (rev 117657)
@@ -6,6 +6,7 @@
<include package="grokcore.security" file="meta.zcml" />
<include package="grokcore.view" file="meta-minimal.zcml" />
+ <include package="grokcore.formlib" file="meta.zcml" />
<grok:grok package=".meta" />
</configure>
Added: megrok.layout/trunk/src/megrok/layout/templates/default_display_form.pt
===================================================================
--- megrok.layout/trunk/src/megrok/layout/templates/default_display_form.pt (rev 0)
+++ megrok.layout/trunk/src/megrok/layout/templates/default_display_form.pt 2010-10-18 09:58:54 UTC (rev 117657)
@@ -0,0 +1,29 @@
+<table class="listing">
+ <thead>
+ <tr>
+ <th class="label-column"> </th>
+ <th> </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tal:block repeat="widget view/widgets">
+ <tr tal:define="odd repeat/widget/odd"
+ tal:attributes="class python: odd and 'odd' or 'even'">
+ <td class="fieldname">
+ <tal:block content="widget/label"/>
+ </td>
+ <td>
+ <input tal:replace="structure widget" />
+ </td>
+ </tr>
+ </tal:block>
+ </tbody>
+ <tfoot>
+ <tr class="controls">
+ <td colspan="2" class="align-right">
+ <input tal:repeat="action view/actions"
+ tal:replace="structure action/render" />
+ </td>
+ </tr>
+ </tfoot>
+</table>
Added: megrok.layout/trunk/src/megrok/layout/templates/default_edit_form.pt
===================================================================
--- megrok.layout/trunk/src/megrok/layout/templates/default_edit_form.pt (rev 0)
+++ megrok.layout/trunk/src/megrok/layout/templates/default_edit_form.pt 2010-10-18 09:58:54 UTC (rev 117657)
@@ -0,0 +1,61 @@
+<form action="." tal:attributes="action request/URL" method="post"
+ class="edit-form" enctype="multipart/form-data">
+
+ <h1 i18n:translate=""
+ tal:condition="view/label"
+ tal:content="view/label">Label</h1>
+
+ <div class="form-status"
+ tal:define="status view/status"
+ tal:condition="status">
+
+ <div i18n:translate="" tal:content="view/status">
+ Form status summary
+ </div>
+
+ <ul class="errors" tal:condition="view/errors">
+ <li tal:repeat="error view/error_views">
+ <span tal:replace="structure error">Error Type</span>
+ </li>
+ </ul>
+ </div>
+
+ <table class="form-fields">
+ <tbody>
+ <tal:block repeat="widget view/widgets">
+ <tr>
+ <td class="label" tal:define="hint widget/hint">
+ <label tal:condition="python:hint"
+ tal:attributes="for widget/name">
+ <span class="required" tal:condition="widget/required"
+ >*</span><span i18n:translate=""
+ tal:content="widget/label">label</span>
+ </label>
+ <label tal:condition="python:not hint"
+ tal:attributes="for widget/name">
+ <span class="required" tal:condition="widget/required"
+ >*</span><span i18n:translate=""
+ tal:content="widget/label">label</span>
+ </label>
+ </td>
+ <td class="field">
+ <div class="widget" tal:content="structure widget">
+ <input type="text" />
+ </div>
+ <div class="error" tal:condition="widget/error">
+ <span tal:replace="structure widget/error">error</span>
+ </div>
+ </td>
+ </tr>
+ </tal:block>
+ </tbody>
+ </table>
+
+ <div id="actionsView">
+ <span class="actionButtons" tal:condition="view/availableActions">
+ <input tal:repeat="action view/actions"
+ tal:replace="structure action/render"
+ />
+ </span>
+ </div>
+</form>
More information about the checkins
mailing list