[Checkins] SVN: Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/ Implementing and testing application_url and flash from IGrokView interface from the grok package
Christian Klinger
cklinger at novareto.de
Thu Mar 19 07:17:43 EDT 2009
Log message for revision 98266:
Implementing and testing application_url and flash from IGrokView interface from the grok package
Changed:
U Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/component.py
U Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/tests/test_pagelet.py
-=-
Modified: Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/component.py
===================================================================
--- Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/component.py 2009-03-19 11:11:18 UTC (rev 98265)
+++ Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/component.py 2009-03-19 11:17:43 UTC (rev 98266)
@@ -1,10 +1,12 @@
import martian.util
import grokcore.component
+import z3c.flashmessage.interfaces
from zope import interface
from zope import component
-from grokcore.view import View
-from grokcore.view import interfaces
+from grok import Application
+from grokcore.view import View, util
+from grok.interfaces import IGrokView
from martian.error import GrokImportError
from zope.interface import implements
from zope.component import getMultiAdapter
@@ -19,7 +21,7 @@
class Pagelet(BrowserPage):
- implements(interfaces.IGrokView, IPagelet)
+ implements(IGrokView, IPagelet)
template = None
layout = None
@@ -31,7 +33,24 @@
interface.Interface,
name=self.module_info.package_dotted_name
)
-
+
+ def application_url(self, name=None):
+ """Return the URL of the nearest enclosing `grok.Application`."""
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, Application):
+ return self.url(obj, name)
+ obj = obj.__parent__
+ raise ValueError("No application found.")
+
+ def flash(self, message, type='message'):
+ """Send a short message to the user."""
+ # XXX this has no tests or documentation, anywhere
+ source = component.getUtility(
+ z3c.flashmessage.interfaces.IMessageSource, name='session')
+ source.send(message, type)
+
+
def default_namespace(self):
namespace = {}
namespace['context'] = self.context
@@ -50,7 +69,6 @@
# We don not work with IContentTemplate for now
# We use instead our grok.View behavior with the associated
# Templates
-
return self.template.render(self)
def __call__(self):
@@ -61,3 +79,31 @@
(self.context, self.request), ILayoutTemplate)
return layout(self)
return self.layout()
+
+
+ def url(self, obj=None, name=None, data=None):
+ """Return string for the URL based on the obj and name. The data
+ argument is used to form a CGI query string.
+ """
+ if isinstance(obj, basestring):
+ if name is not None:
+ raise TypeError(
+ 'url() takes either obj argument, obj, string arguments, '
+ 'or string argument')
+ name = obj
+ obj = None
+
+ if name is None and obj is None:
+ # create URL to view itself
+ obj = self
+ elif name is not None and obj is None:
+ # create URL to view on context
+ obj = self.context
+
+ if data is None:
+ data = {}
+ else:
+ if not isinstance(data, dict):
+ raise TypeError('url() data argument must be a dict.')
+
+ return util.url(self.request, obj, name, data=data)
Modified: Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/tests/test_pagelet.py
===================================================================
--- Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/tests/test_pagelet.py 2009-03-19 11:11:18 UTC (rev 98265)
+++ Sandbox/cklinger/megrok.pagelet/trunk/src/megrok/pagelet/tests/test_pagelet.py 2009-03-19 11:17:43 UTC (rev 98266)
@@ -38,6 +38,20 @@
</html>
>>> print viewt.render()
<p> I am a renderd template of a pagelet </p>
+
+grok.View has this nice url method. This should of course work in
+the Pagelets, too.
+
+ >>> from zope.app.folder import Folder
+ >>> from zope.app.testing.functional import getRootFolder
+ >>> folder = Folder()
+ >>> app = App()
+ >>> getRootFolder()['app'] = app
+ >>> pagelet = getMultiAdapter((app, request), name="applicationpagelet")
+ >>> pagelet.url()
+ 'http://127.0.0.1/app/applicationpagelet'
+ >>> pagelet.application_url()
+ 'http://127.0.0.1/app'
"""
import grok
import megrok.pagelet
@@ -72,7 +86,18 @@
return "<b> Render without a Pagelet"
+class App(grok.Application, grok.Container):
+ pass
+class ApplicationPagelet(megrok.pagelet.Pagelet):
+ grok.context(App)
+
+ def render(self):
+ return "Pagelet"
+
+
+
+
def test_suite():
from zope.testing import doctest
from megrok.pagelet.tests import FunctionalLayer
More information about the Checkins
mailing list