SVN: zope.formlib/trunk/ Avoid rendering when an action caused a redirect.

Christian Theune <[email protected]>
Newsgroups gmane.comp.web.zope.zope3.cvs
Message-ID <[email protected]>
Log message for revision 87020:
  Avoid rendering when an action caused a redirect.
  

Changed:
  U   zope.formlib/trunk/CHANGES.txt
  U   zope.formlib/trunk/src/zope/formlib/form.py
  U   zope.formlib/trunk/src/zope/formlib/form.txt

-=-
Modified: zope.formlib/trunk/CHANGES.txt
===================================================================
--- zope.formlib/trunk/CHANGES.txt	2008-05-29 10:48:43 UTC (rev 87019)
+++ zope.formlib/trunk/CHANGES.txt	2008-05-29 10:53:24 UTC (rev 87020)
@@ -18,6 +18,9 @@
 Bugs Fixed
 ----------
 
+- Actions that cause a redirect (301, 302) do not cause the `render` method to
+  be called anymore.
+
 - The zope.formlib.form.Action class didn't fully implement
   zope.formlib.interfaces.IAction.
 

Modified: zope.formlib/trunk/src/zope/formlib/form.py
===================================================================
--- zope.formlib/trunk/src/zope/formlib/form.py	2008-05-29 10:48:43 UTC (rev 87019)
+++ zope.formlib/trunk/src/zope/formlib/form.py	2008-05-29 10:53:24 UTC (rev 87020)
@@ -779,7 +779,12 @@
 
     def __call__(self):
         self.update()
-        return self.render()
+        if self.request.response.getStatus() in [301, 302]:
+            # Avoid rendering if the action caused a redirect.
+            result = self.form_result or ''
+        else:
+            result = self.render()
+        return result
 
     def error_views(self):
         for error in self.errors:

Modified: zope.formlib/trunk/src/zope/formlib/form.txt
===================================================================
--- zope.formlib/trunk/src/zope/formlib/form.txt	2008-05-29 10:48:43 UTC (rev 87019)
+++ zope.formlib/trunk/src/zope/formlib/form.txt	2008-05-29 10:53:24 UTC (rev 87020)
@@ -1835,4 +1835,38 @@
 Cleanup:
 
     >>> zope.event.subscribers.remove(eventLog)
-    
+
+Actions that cause a redirect
+-----------------------------
+
+When an action causes a redirect, the following `render` phase is omitted as
+the result will not be displayed anyway. This is both a performance
+improvement and for avoiding application bugs with one-time session
+information.
+
+    >>> class MyForm(form.Form):
+    ...     form_fields = form.FormFields(IFooBar)
+    ...     @form.action("Redirect")
+    ...     def redirect(self, action, data):
+    ...         print 'Action: redirect'
+    ...         self.request.response.redirect('foo')
+    ...     @form.action("Stay")
+    ...     def redirect(self, action, data):
+    ...         print 'Action: stay'
+    ...         pass
+    ...     def render(self):
+    ...         print 'render was called'
+    ...         return ''
+
+    >>> request = TestRequest()
+    >>> print MyForm(None, request)() # doctest: +NORMALIZE_WHITESPACE
+    render was called
+    >>> request.form['form.actions.redirect'] = u''
+    >>> print MyForm(None, request)() # doctest: +NORMALIZE_WHITESPACE
+    Action: redirect
+
+    >>> request = TestRequest()
+    >>> request.form['form.actions.stay'] = u''
+    >>> print MyForm(None, request)() # doctest: +NORMALIZE_WHITESPACE
+    Action: stay
+    render was called
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.