[Checkins] SVN: grokcore.view/branches/1.13/ factor out generally useful methods and properties for view-ish components
Jan-Wijbrand Kolman
janwijbrand at gmail.com
Thu Nov 26 08:19:47 EST 2009
Log message for revision 106021:
factor out generally useful methods and properties for view-ish components
Changed:
U grokcore.view/branches/1.13/CHANGES.txt
U grokcore.view/branches/1.13/src/grokcore/view/components.py
U grokcore.view/branches/1.13/src/grokcore/view/tests/view/update_redirect.py
U grokcore.view/branches/1.13/src/grokcore/view/util.py
-=-
Modified: grokcore.view/branches/1.13/CHANGES.txt
===================================================================
--- grokcore.view/branches/1.13/CHANGES.txt 2009-11-26 11:47:26 UTC (rev 106020)
+++ grokcore.view/branches/1.13/CHANGES.txt 2009-11-26 13:19:47 UTC (rev 106021)
@@ -4,7 +4,8 @@
1.13 (unreleased)
-----------------
-- Nothing changed yet.
+- Factor out generally useful methods and properties for view-ish
+ components into components.ViewSupport mixin.
1.13a1 (2009-11-15)
Modified: grokcore.view/branches/1.13/src/grokcore/view/components.py
===================================================================
--- grokcore.view/branches/1.13/src/grokcore/view/components.py 2009-11-26 11:47:26 UTC (rev 106020)
+++ grokcore.view/branches/1.13/src/grokcore/view/components.py 2009-11-26 13:19:47 UTC (rev 106021)
@@ -34,7 +34,45 @@
from grokcore.view import interfaces, util
-class View(BrowserPage):
+class ViewSupport(object):
+ """Mixin class providing methods and properties generally
+ useful for view-ish components.
+ """
+ @property
+ def response(self):
+ return self.request.response
+
+ @property
+ def body(self):
+ return request.bodyStream.getCacheStream().read()
+
+ def redirect(self, url):
+ return self.request.response.redirect(url)
+
+ 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
+
+ return util.url(self.request, obj, name, data)
+
+
+class View(ViewSupport, BrowserPage):
interface.implements(interfaces.IGrokView)
def __init__(self, context, request):
@@ -50,10 +88,6 @@
else:
self.static = None
- @property
- def response(self):
- return self.request.response
-
def __call__(self):
mapply(self.update, (), self.request)
if self.request.response.getStatus() in (302, 303):
@@ -93,38 +127,7 @@
"View %r, macro %s" % (self, key),
DeprecationWarning, 1)
return value
-
-
- 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)
-
- def redirect(self, url):
- return self.request.response.redirect(url)
-
+
def update(self, **kwargs):
pass
Modified: grokcore.view/branches/1.13/src/grokcore/view/tests/view/update_redirect.py
===================================================================
--- grokcore.view/branches/1.13/src/grokcore/view/tests/view/update_redirect.py 2009-11-26 11:47:26 UTC (rev 106020)
+++ grokcore.view/branches/1.13/src/grokcore/view/tests/view/update_redirect.py 2009-11-26 13:19:47 UTC (rev 106021)
@@ -11,9 +11,9 @@
>>> view = getMultiAdapter((manfred, request), name='cavepainting')
>>> print view()
None
- >>> print request.response.getStatus()
+ >>> print view.response.getStatus()
302
- >>> print request.response.getHeader('Location')
+ >>> print view.response.getHeader('Location')
somewhere-else
"""
@@ -24,7 +24,7 @@
class CavePainting(grok.View):
def update(self):
- self.request.response.redirect('somewhere-else')
+ self.redirect('somewhere-else')
cavepainting = grok.PageTemplate("""\
Modified: grokcore.view/branches/1.13/src/grokcore/view/util.py
===================================================================
--- grokcore.view/branches/1.13/src/grokcore/view/util.py 2009-11-26 11:47:26 UTC (rev 106020)
+++ grokcore.view/branches/1.13/src/grokcore/view/util.py 2009-11-26 13:19:47 UTC (rev 106021)
@@ -18,16 +18,23 @@
from zope.traversing.browser.interfaces import IAbsoluteURL
from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
-def url(request, obj, name=None, data={}):
+def url(request, obj, name=None, data=None):
url = getMultiAdapter((obj, request), IAbsoluteURL)()
if name is not None:
url += '/' + urllib.quote(name.encode('utf-8'), SAFE_URL_CHARACTERS)
- if data:
- for k,v in data.items():
- if isinstance(v, unicode):
- data[k] = v.encode('utf-8')
- if isinstance(v, (list, set, tuple)):
- data[k] = [isinstance(item, unicode) and item.encode('utf-8')
+
+ if data is None:
+ return url
+
+ if not isinstance(data, dict):
+ raise TypeError('url() data argument must be a dict.')
+
+ for k,v in data.items():
+ if isinstance(v, unicode):
+ data[k] = v.encode('utf-8')
+ if isinstance(v, (list, set, tuple)):
+ data[k] = [
+ isinstance(item, unicode) and item.encode('utf-8')
or item for item in v]
- url += '?' + urllib.urlencode(data, doseq=True)
- return url
+
+ return url + '?' + urllib.urlencode(data, doseq=True)
More information about the checkins
mailing list