[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">&nbsp;</th>
+      <th>&nbsp;</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