diff src/server/server.py @ 968:4d37b23777c3

pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page: instead of giving a full uri, a page is now given when we want to redirect to something else that current page on data post. This make the redirection more simple and intuive A tuple can be used to specify arguments to put in URL.
author Goffi <goffi@goffi.org>
date Thu, 09 Nov 2017 08:02:47 +0100
parents 12c149171199
children c4e58c4dba75
line wrap: on
line diff
--- a/src/server/server.py	Sun Nov 05 22:11:23 2017 +0100
+++ b/src/server/server.py	Thu Nov 09 08:02:47 2017 +0100
@@ -1658,11 +1658,13 @@
         self.pageError(request, C.HTTP_INTERNAL_ERROR)
 
     def _on_data_post_redirect(self, ret, request):
-        """called when page's on_data_post has been called successfuly
+        """called when page's on_data_post has been done successfuly
 
-        this method redirect to the same page or to request.data['post_redirect_uri']
-        if it is set, using Post/Redirect/Get pattern.
-        HTTP status code "See Other" (303) is the recommanded code in this case
+        This will do a Post/Redirect/Get pattern.
+        this method redirect to the same page or to request.data['post_redirect_page']
+        post_redirect_page can be either a page or a tuple with page as first item, then a list of unicode arguments to append to the url.
+        if post_redirect_page is not used, initial request.uri (i.e. the same page as where the data have been posted) will be used for redirection.
+        HTTP status code "See Other" (303) is used as it is the recommanded code in this case.
         @param ret(None, unicode, iterable): on_data_post return value
             see LiberviaPage.__init__ on_data_post docstring
         """
@@ -1674,10 +1676,24 @@
             ret = tuple(ret)
             raise NotImplementedError(_(u'iterable in on_data_post return value is not used yet'))
         session_data = self.host.getSessionData(request, session_iface.ISATSession)
+        if 'post_redirect_page' in request.data:
+            redirect_page_data = request.data['post_redirect_page']
+            if isinstance(redirect_page_data, tuple):
+                redirect_page = redirect_page_data[0]
+                redirect_page_args = [urllib.quote_plus(a.encode('utf-8')).replace('%40','@')
+                                      for a in redirect_page_data[1:]]
+            else:
+                redirect_page = redirect_page_data
+                redirect_page_args = []
+            redirect_uri = os.path.join(redirect_page.url, *redirect_page_args)
+        else:
+            redirect_page = self
+            redirect_uri = request.uri
+
         if not C.POST_NO_CONFIRM in ret:
-            session_data.setPageFlag(self, C.FLAG_CONFIRM)
+            session_data.setPageFlag(redirect_page, C.FLAG_CONFIRM)
         request.setResponseCode(C.HTTP_SEE_OTHER)
-        request.setHeader("location", request.data.get('post_redirect_uri', request.uri))
+        request.setHeader("location", redirect_uri)
         request.finish()
         raise failure.Failure(exceptions.CancelError(u'Post/Redirect/Get is used'))