[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