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