[Checkins] SVN: grokcore.view/branches/zca-only/ Making the response of a view a Response
Souheil CHELFOUH
souheil at chelfouh.com
Thu Mar 17 08:22:16 EDT 2011
Log message for revision 120997:
Making the response of a view a Response
Changed:
U grokcore.view/branches/zca-only/buildout.cfg
U grokcore.view/branches/zca-only/setup.py
U grokcore.view/branches/zca-only/src/grokcore/view/components.py
U grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py
U grokcore.view/branches/zca-only/src/grokcore/view/tests/template/pluggability.py
U grokcore.view/branches/zca-only/src/grokcore/view/tests/view/update_redirect.py
-=-
Modified: grokcore.view/branches/zca-only/buildout.cfg
===================================================================
--- grokcore.view/branches/zca-only/buildout.cfg 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/buildout.cfg 2011-03-17 12:22:15 UTC (rev 120997)
@@ -5,8 +5,12 @@
interpreter
test
versions = versions
-extensions = buildout.dumppickedversions
+extensions = mr.developer buildout.dumppickedversions
+auto-checkout = cromlech.io
+[sources]
+cromlech.io = git gitosis at devel.dolmen-project.org:cromlech.io.git
+
[versions]
grokcore.view =
Modified: grokcore.view/branches/zca-only/setup.py
===================================================================
--- grokcore.view/branches/zca-only/setup.py 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/setup.py 2011-03-17 12:22:15 UTC (rev 120997)
@@ -21,9 +21,11 @@
'zope.publisher',
'zope.security',
'zope.traversing',
+ 'cromlech.io',
]
tests_require = [
+ 'WebOb',
'zope.container',
'zope.securitypolicy',
'zope.site',
Modified: grokcore.view/branches/zca-only/src/grokcore/view/components.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/components.py 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/src/grokcore/view/components.py 2011-03-17 12:22:15 UTC (rev 120997)
@@ -15,6 +15,7 @@
import sys
import os
+import webob
import warnings
import fnmatch
@@ -25,30 +26,45 @@
from zope.pagetemplate.engine import TrustedAppPT
import martian.util
+from cromlech.io import IResponse
from grokcore.view import interfaces, util
+class Response(webob.Response):
+ interface.implements(IResponse)
+
+ def setBody(self, value):
+ if isinstance(value, unicode):
+ self.unicode_body = value
+ else:
+ self.body = value
+
+ def getStatus(self, as_int=True):
+ """returns the status of the response
+ """
+ if not as_int:
+ return self.status
+ return self.status_int
+
+ def redirect(self, url, status=302, trusted=False):
+ """Sets the response for a redirect.
+ """
+ self.location = url
+ self.status = status
+
+
class ViewSupport(object):
"""Mixin class providing methods and properties generally
useful for view-ish components.
"""
@property
- def response(self):
- """The HTTP Response object that is associated with the request.
-
- This is also available as self.request.response, but the
- response attribute is provided as a convenience.
- """
- return IResponse(self.request)
-
- @property
def body(self):
"""The text of the request body.
"""
return self.request.body
- def redirect(self, url, status=None, trusted=False):
+ def redirect(self, url, status=302, trusted=False):
"""Redirect to `url`.
The headers of the :attr:`response` are modified so that the
@@ -109,9 +125,12 @@
class View(Location, ViewSupport):
interface.implements(interfaces.IGrokView)
+ responseFactory = Response
+
def __init__(self, context, request):
self.context = context
self.request = request
+ self.response = self.responseFactory()
self.__name__ = getattr(self, '__view_name__', None)
@@ -125,15 +144,19 @@
def __call__(self):
self.update()
+ if self.response.getStatus() in [301, 302]:
+ return None
template = getattr(self, 'template', None)
if template is not None:
- return self._render_template()
- return self.render()
+ self.response.setBody(self._render_template())
+ else:
+ self.response.setBody(self.render())
+ return self.response
def _render_template(self):
return self.template.render(self)
- def default_namespace(self):
+ def namespace(self):
"""Returns a dictionary of namespaces that the template implementation
expects to always be available.
@@ -147,29 +170,6 @@
namespace['view'] = self
return namespace
- def namespace(self):
- """Returns a dictionary that is injected in the template namespace in
- addition to the default namespace.
-
- This method **is** intended to be overridden by the application
- developer.
- """
- return {}
-
- def __getitem__(self, key):
- # This is BBB code for Zope page templates only:
- if not isinstance(self.template, PageTemplate):
- raise AttributeError("View has no item %s" % key)
-
- value = self.template._template.macros[key]
- # When this deprecation is done with, this whole __getitem__ can
- # be removed.
- warnings.warn("Calling macros directly on the view is deprecated. "
- "Please use context/@@viewname/macros/macroname\n"
- "View %r, macro %s" % (self, key),
- DeprecationWarning, 1)
- return value
-
def update(self, **kwargs):
"""This method is meant to be implemented by subclasses. It
will be called before the view's associated template is
@@ -262,14 +262,9 @@
def namespace(self, view):
# By default use the namespaces that are defined as the
# default by the view implementation.
- return view.default_namespace()
+ return view.namespace()
- def getNamespace(self, view):
- namespace = self.namespace(view)
- namespace.update(view.namespace())
- return namespace
-
class TrustedPageTemplate(TrustedAppPT, pagetemplate.PageTemplate):
pass
@@ -301,8 +296,8 @@
factory.macros = property(_get_macros)
def render(self, view):
- namespace = self.getNamespace(view)
template = self._template
+ namespace = view.namespace()
namespace.update(template.pt_getContext())
return template.pt_render(namespace)
Modified: grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py 2011-03-17 12:22:15 UTC (rev 120997)
@@ -18,8 +18,6 @@
class IBaseClasses(Interface):
View = Attribute("Base class for browser views.")
- DirectoryResource = Attribute("Base class to create new "
- "directory resource.")
class IDirectives(Interface):
@@ -87,9 +85,6 @@
request = Attribute('request', "Request that the view was looked up with.")
- response = Attribute('response', "Response object that is "
- "associated with the current request.")
-
static = Attribute('static', "Directory resource containing "
"the static files of the view's package.")
@@ -113,20 +108,9 @@
as a cgi query string.
"""
- def default_namespace():
- """Returns a dictionary of namespaces that the template
- implementation expects to always be available.
-
- This method is *not* intended to be overridden by application
- developers.
- """
-
def namespace():
"""Returns a dictionary that is injected in the template
- namespace in addition to the default namespace.
-
- This method *is* intended to be overridden by the application
- developer.
+ namespace.
"""
def update(**kw):
@@ -171,9 +155,11 @@
def render(view):
"""Renders the template"""
+
class TemplateLookupError(Exception):
pass
+
class ITemplateRegAPI(Interface):
"""Public API for the templatereg module.
"""
Modified: grokcore.view/branches/zca-only/src/grokcore/view/tests/template/pluggability.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/tests/template/pluggability.py 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/src/grokcore/view/tests/template/pluggability.py 2011-03-17 12:22:15 UTC (rev 120997)
@@ -55,7 +55,7 @@
return {'middle_text': 'is in'}
def render(self, view):
- return self._template.render(**self.getNamespace(view))
+ return self._template.render(**self.namespace(view))
class MyPageTemplateFactory(grok.GlobalUtility):
Modified: grokcore.view/branches/zca-only/src/grokcore/view/tests/view/update_redirect.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/tests/view/update_redirect.py 2011-03-17 10:59:13 UTC (rev 120996)
+++ grokcore.view/branches/zca-only/src/grokcore/view/tests/view/update_redirect.py 2011-03-17 12:22:15 UTC (rev 120997)
@@ -15,7 +15,7 @@
None
>>> print view.response.getStatus()
302
- >>> print view.response.headers('Location')
+ >>> print view.response.headers.get('Location')
somewhere-else
"""
More information about the checkins
mailing list