[Checkins] SVN: megrok.layout/trunk/ Now using grokcore.view 1.13.1 and the ViewSupport component. Added a mixin for flash messages and application_url

Souheil CHELFOUH souheil at chelfouh.com
Mon Oct 18 05:59:06 EDT 2010


Log message for revision 117659:
  Now using grokcore.view 1.13.1 and the ViewSupport component. Added a mixin for flash messages and application_url

Changed:
  U   megrok.layout/trunk/buildout.cfg
  U   megrok.layout/trunk/setup.py
  U   megrok.layout/trunk/src/megrok/layout/components.py
  U   megrok.layout/trunk/src/megrok/layout/configure.zcml
  U   megrok.layout/trunk/src/megrok/layout/ftesting.zcml
  U   megrok.layout/trunk/src/megrok/layout/ftests/templates/master.pt
  U   megrok.layout/trunk/src/megrok/layout/ftests/test_form.py
  U   megrok.layout/trunk/src/megrok/layout/ftests/test_static.py
  A   megrok.layout/trunk/src/megrok/layout/ftests/test_utils.py
  A   megrok.layout/trunk/src/megrok/layout/messages.py
  U   megrok.layout/trunk/src/megrok/layout/meta.zcml
  U   megrok.layout/trunk/src/megrok/layout/tests/test_norenderortemplatelayout.py
  U   megrok.layout/trunk/src/megrok/layout/tests/test_renderandtemplate.py

-=-
Modified: megrok.layout/trunk/buildout.cfg
===================================================================
--- megrok.layout/trunk/buildout.cfg	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/buildout.cfg	2010-10-18 09:59:06 UTC (rev 117659)
@@ -1,11 +1,12 @@
 [buildout]
 develop = .
 parts = interpreter test
-extends = http://grok.zope.org/releaseinfo/grok-1.0b1.cfg
+extends = http://grok.zope.org/releaseinfo/grok-1.1a1.cfg
 versions = versions
 
 [versions]
-grokcore.view = 1.12.1
+grokcore.formlib = 1.5
+grokcore.view = 1.13.1
 
 [interpreter]
 recipe = zc.recipe.egg

Modified: megrok.layout/trunk/setup.py
===================================================================
--- megrok.layout/trunk/setup.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/setup.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -28,9 +28,18 @@
       include_package_data=True,
       zip_safe=False,
       install_requires=[
-        'setuptools',
-        'grokcore.component',
-        'grokcore.view >= 1.12.1',
-        'grokcore.formlib',
+          'grokcore.component',
+          'grokcore.formlib',
+          'grokcore.view >= 1.13.1',
+          'setuptools',
+          'z3c.flashmessage',
+          'zope.app.zcmlfiles',
+          'zope.component',
+          'zope.interface',
+          'zope.publisher',
+          'zope.site',
+          'zope.session',
+          'zope.securitypolicy',
+          'zope.testbrowser',
         ],
       )

Modified: megrok.layout/trunk/src/megrok/layout/components.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/components.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/components.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -1,16 +1,40 @@
 # -*- coding: utf-8 -*-
 import os
 
+import grokcore.component as grok
+import grokcore.formlib
+import grokcore.view
 import zope.component
-import grokcore.view
-import grokcore.formlib
-import grokcore.component as grok
+
+from megrok.layout.interfaces import IPage, ILayout
+from z3c.flashmessage.interfaces import IMessageSource
 from zope.interface import Interface
 from zope.publisher.publish import mapply
-from megrok.layout.interfaces import IPage, ILayout
+from zope.site.hooks import getSite
 
 
-class Layout(object):
+class UtilityView(object):
+    """A view mixin with useful methods.
+    """
+    def application_url(self, name=None):
+        """Return the URL of the nearest site.
+        """
+        site = getSite()
+        if not site:
+            raise zope.component.ComponentLookupError("No site found.")
+        return self.url(site, name)
+
+    def flash(self, message, type='message'):
+        """Send a short message to the user.
+        """
+        source = zope.component.queryUtility(IMessageSource, name='session')
+        if source is None:
+            return None
+        source.send(message, type)
+        return True
+
+
+class Layout(grokcore.view.ViewSupport, UtilityView):
     """A layout object.
     """
     grok.baseclass()
@@ -24,8 +48,7 @@
         if getattr(self, 'module_info', None) is not None:
             self.static = zope.component.queryAdapter(
                 self.request, Interface,
-                name=self.module_info.package_dotted_name
-                )
+                name=self.module_info.package_dotted_name)
         else:
             self.static = None
 
@@ -44,10 +67,6 @@
     def update(self):
         pass
 
-    @property
-    def response(self):
-        return self.request.response
-
     def _render_template(self):
         return self.template.render(self)
 
@@ -62,7 +81,7 @@
         return self.render()
 
 
-class Page(grokcore.view.View):
+class Page(grokcore.view.View, UtilityView):
     """A view class.
     """
     grok.baseclass()
@@ -132,33 +151,39 @@
 
 
 # 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 = 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 = grokcore.view.PageTemplateFile(
+    os.path.join('templates', 'default_display_form.pt'))
 default_display_template.__grok_name__ = 'default_display_form'
 
+grokcore.view.templatedir('templates')
 
 class Form(LayoutAwareForm, grokcore.formlib.Form):
-
+    """A form base class.
+    """
     grok.baseclass()
-    template = default_form_template
+    grokcore.view.template('default_form_template')
 
 
 class AddForm(LayoutAwareForm, grokcore.formlib.AddForm):
-
+    """Base add form.
+    """
     grok.baseclass()
     template = default_form_template
 
 
 class EditForm(LayoutAwareForm, grokcore.formlib.EditForm):
-
+    """Base edit form.
+    """
     grok.baseclass()
     template = default_form_template
 
 
 class DisplayForm(LayoutAwareForm, grokcore.formlib.DisplayForm):
-
+    """Base display form.
+    """
     grok.baseclass()
     template = default_display_template

Modified: megrok.layout/trunk/src/megrok/layout/configure.zcml
===================================================================
--- megrok.layout/trunk/src/megrok/layout/configure.zcml	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/configure.zcml	2010-10-18 09:59:06 UTC (rev 117659)
@@ -3,7 +3,8 @@
    xmlns:grok="http://namespaces.zope.org/grok">
 
   <include package="megrok.layout" file="meta.zcml" />
-  <include package="grokcore.view"/>
-  <include package="grokcore.formlib"/>
+  <include package="grokcore.view" />
+  <include package="grokcore.formlib" />
+  <include package="zope.session" />
 
 </configure>

Modified: megrok.layout/trunk/src/megrok/layout/ftesting.zcml
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftesting.zcml	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/ftesting.zcml	2010-10-18 09:59:06 UTC (rev 117659)
@@ -4,12 +4,11 @@
 
   <include package="zope.app.zcmlfiles" file="meta.zcml" />
   <include package="zope.securitypolicy" file="meta.zcml" />
-  <include package="megrok.layout" />
 
+  <include package="megrok.layout" />
   <include package="zope.app.zcmlfiles" />
   <include package="zope.app.authentication" />
 
-  <include package="grokcore.view" file="meta.zcml" />
   <grok:grok package="megrok.layout.ftests" />
 
   <securityPolicy
@@ -37,6 +36,4 @@
   <grantAll role="zope.Manager" />
   <grant role="zope.Manager" principal="zope.mgr" />
 
-
-
 </configure>

Modified: megrok.layout/trunk/src/megrok/layout/ftests/templates/master.pt
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftests/templates/master.pt	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/ftests/templates/master.pt	2010-10-18 09:59:06 UTC (rev 117659)
@@ -1,8 +1,7 @@
 <html>
  <body>
-   <div class="layout" tal:content="structure view/render">
-         here comes the content
+   <div class="layout" tal:content="structure view/content">
+     here comes the content
    </div>
  </body>
 </html>
-

Modified: megrok.layout/trunk/src/megrok/layout/ftests/test_form.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftests/test_form.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/ftests/test_form.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -11,10 +11,15 @@
   >>> print myview()
   <html>
    <body>
-     <div class="layout"><form ...
-     ...<span>Color</span>...
-     ...<div class="widget">globally dark</div>...
-     ...</form>
+     <div class="layout">...
+          <tr class="even">
+            <td class="fieldname">
+              Color
+            </td>
+            <td>
+              globally dark
+            </td>
+          </tr>...
      </div>
    </body>
   </html>
@@ -24,25 +29,75 @@
   >>> 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>
+   <table class="listing">
+    <thead>
+      <tr>
+        <th class="label-column">&nbsp;</th>
+        <th>&nbsp;</th>
+      </tr>
+    </thead>
+    <tbody>
+  <BLANKLINE>
+        <tr class="even">
+          <td class="fieldname">
+            Color
+          </td>
+          <td>
+            globally dark
+          </td>
+        </tr>
+  <BLANKLINE>
+    </tbody>
+    <tfoot>
+      <tr class="controls">
+        <td colspan="2" class="align-right">
+        </td>
+      </tr>
+    </tfoot>
+  </table>
+  <BLANKLINE>
 
   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>
+     <div class="layout"><form action="http://127.0.0.1" method="post"
+        class="edit-form" enctype="multipart/form-data">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+    <table class="form-fields">
+      <tbody>
+  <BLANKLINE>
+          <tr>
+            <td class="label">
+  <BLANKLINE>
+              <label for="form.color">
+                <span class="required">*</span><span>Color</span>
+              </label>
+            </td>
+            <td class="field">
+              <div class="widget"><input class="textType" id="form.color" name="form.color" size="20" type="text" value="globally dark"  /></div>
+  <BLANKLINE>
+            </td>
+          </tr>
+  <BLANKLINE>
+      </tbody>
+    </table>
+  <BLANKLINE>
+    <div id="actionsView">
+      <span class="actionButtons">
+        <input type="submit" id="form.actions.apply" name="form.actions.apply" value="Apply" class="button" />
+      </span>
+    </div>
+  </form>
+  </div>
    </body>
   </html>
+  <BLANKLINE>
 
   >>> myeditview
   <megrok.layout.ftests.test_form.MyEditView object at ...>
@@ -68,13 +123,11 @@
 
 
 class ICowProperties(interface.Interface):
-
     color = schema.TextLine(title=u"Color")
 
 
 class Cow(grok.Context):
     grok.implements(ICowProperties)
-
     color = u"globally dark"
 
 
@@ -95,7 +148,6 @@
     from zope.testing import doctest
     from megrok.layout.ftests import FunctionalLayer
     suite = doctest.DocTestSuite(
-        optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
-        )
+        optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
     suite.layer = FunctionalLayer
     return suite

Modified: megrok.layout/trunk/src/megrok/layout/ftests/test_static.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftests/test_static.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/ftests/test_static.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -8,7 +8,7 @@
   >>> mylayout.static
   <grokcore.view.components.DirectoryResource object at ...>
   >>> mylayout.static['empty.js']
-  <zope.app.publisher.browser.fileresource.FileResource object at ...>
+  <zope.browserresource.file.FileResource object at ...>
 """
 
 import grokcore.component as grok

Added: megrok.layout/trunk/src/megrok/layout/ftests/test_utils.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/ftests/test_utils.py	                        (rev 0)
+++ megrok.layout/trunk/src/megrok/layout/ftests/test_utils.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -0,0 +1,79 @@
+"""
+  >>> from megrok.layout import ILayout
+  >>> from zope.component import getMultiAdapter
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> kitty = Cat()
+  >>> mylayout = getMultiAdapter((request, kitty), ILayout)
+  >>> myview = getMultiAdapter((kitty, request), name='utils')
+
+  >>> print myview.application_url()
+  Traceback (most recent call last):
+  ...
+  ComponentLookupError: No site found.
+
+  >>> from zope.site.hooks import setSite
+  >>> root = getRootFolder()
+  >>> setSite(root)
+  >>> print myview.application_url()
+  http://127.0.0.1
+
+  >>> print myview.flash(u'test')
+  None
+
+  >>> from zope.security.management import newInteraction
+  >>> newInteraction(request)
+
+  >>> grok.testing.grok('megrok.layout.messages')
+  >>> print myview.flash(u'test')
+  True
+
+  >>> from zope.component import getUtility
+  >>> from z3c.flashmessage.interfaces import IMessageReceiver
+  >>> receiver = getUtility(IMessageReceiver)
+  >>> messages = [i for i in receiver.receive()]
+  >>> messages
+  [<z3c.flashmessage.message.Message object at ...>]
+
+  >>> print ", ".join([msg.message for msg in messages])
+  test
+  
+  >>> from zope.security.management import endInteraction
+  >>> endInteraction()
+
+"""
+import grokcore.component as grok
+from grokcore.view import templatedir
+
+from zope import interface
+from megrok.layout import Layout, Page
+
+templatedir('templates')
+
+
+class Cat(grok.Context):
+    pass
+
+
+class Master(Layout):
+    grok.name('master')
+    grok.context(Cat)
+
+
+class Utils(Page):
+    grok.context(interface.Interface)
+
+    def render(self):
+	return "<p>A purring cat</p>"
+
+
+def test_suite():
+    from zope.testing import doctest
+    from zope.app.testing import functional
+    from megrok.layout.ftests import FunctionalLayer
+    suite = doctest.DocTestSuite(
+        optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+        extraglobs={"getRootFolder": functional.getRootFolder}
+        )
+    suite.layer = FunctionalLayer
+    return suite

Added: megrok.layout/trunk/src/megrok/layout/messages.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/messages.py	                        (rev 0)
+++ megrok.layout/trunk/src/megrok/layout/messages.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+"""This module can be grokked you need a generic flash message setup.
+"""
+import grokcore.component
+import z3c.flashmessage.sources
+import z3c.flashmessage.receiver
+
+
+grokcore.component.global_utility(
+    z3c.flashmessage.sources.SessionMessageSource, name='session')
+
+grokcore.component.global_utility(
+    z3c.flashmessage.receiver.GlobalMessageReceiver)

Modified: megrok.layout/trunk/src/megrok/layout/meta.zcml
===================================================================
--- megrok.layout/trunk/src/megrok/layout/meta.zcml	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/meta.zcml	2010-10-18 09:59:06 UTC (rev 117659)
@@ -4,9 +4,9 @@
 
   <include package="grokcore.component" file="meta.zcml" />
   <include package="grokcore.security" file="meta.zcml" />
+  <include package="grokcore.view" file="meta.zcml" />
+  <include package="grokcore.formlib" file="meta.zcml" />
 
-  <include package="grokcore.view" file="meta-minimal.zcml" />
-  <include package="grokcore.formlib" file="meta.zcml" />
   <grok:grok package=".meta" />
 
 </configure>

Modified: megrok.layout/trunk/src/megrok/layout/tests/test_norenderortemplatelayout.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/tests/test_norenderortemplatelayout.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/tests/test_norenderortemplatelayout.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -2,7 +2,7 @@
   >>> grok.testing.grok(__name__)
   Traceback (most recent call last):
   ...
-  ConfigurationExecutionError: martian.error.GrokError: View <class 'megrok.layout.tests.test_norenderortemplatelayout.MyLayout'> has no associated template or 'render' method.
+  ConfigurationExecutionError: <class 'martian.error.GrokError'>: View <class 'megrok.layout.tests.test_norenderortemplatelayout.MyLayout'> has no associated template or 'render' method.
   in:
   <BLANKLINE>
 """

Modified: megrok.layout/trunk/src/megrok/layout/tests/test_renderandtemplate.py
===================================================================
--- megrok.layout/trunk/src/megrok/layout/tests/test_renderandtemplate.py	2010-10-18 09:59:00 UTC (rev 117658)
+++ megrok.layout/trunk/src/megrok/layout/tests/test_renderandtemplate.py	2010-10-18 09:59:06 UTC (rev 117659)
@@ -2,7 +2,7 @@
   >>> grok.testing.grok(__name__)
   Traceback (most recent call last):
   ...
-  ConfigurationExecutionError: martian.error.GrokError: Multiple possible ways to render view <class 'megrok.layout.tests.test_renderandtemplate.MyLayout'>. It has both a 'render' method as well as an associated template.
+  ConfigurationExecutionError: <class 'martian.error.GrokError'>: Multiple possible ways to render view <class 'megrok.layout.tests.test_renderandtemplate.MyLayout'>. It has both a 'render' method as well as an associated template.
   in:
   <BLANKLINE>
 """



More information about the checkins mailing list