# HG changeset patch # User Goffi # Date 1558901982 -7200 # Node ID 263fed3ce354947cb2c72171679af22df52a2e54 # Parent dab7a2b151eaf0079ecb1a3b4ca0ef0e8fd3b7f2 server (pages): on_data_post can now raise an exceptions.DataError to reload the page with a warning message (without validating data posted) diff -r dab7a2b151ea -r 263fed3ce354 libervia/server/pages.py --- a/libervia/server/pages.py Sun May 26 22:18:04 2019 +0200 +++ b/libervia/server/pages.py Sun May 26 22:19:42 2019 +0200 @@ -149,9 +149,12 @@ @param template(unicode, None): path to the template to render. This method is mutually exclusive with render @param on_data_post(callable, None): method to call when data is posted - None if not post is handled + None if data post is not handled on_data_post can return a string with following value: - C.POST_NO_CONFIRM: confirm flag will not be set + on_data_post can raise following exceptions: + - exceptions.DataError: value is incorrect, message will be displayed + as a notification @param on_data(callable, None): method to call when dynamic data is sent this method is used with Libervia's websocket mechanism @param on_signal(callable, None): method to call when a registered signal is @@ -1250,6 +1253,17 @@ .format( url=request.URLPath(), msg=failure_)) self.pageError(request, C.HTTP_INTERNAL_ERROR) + def _on_data_post_error(self, failure_, request): + failure_.trap(exceptions.DataError) + # something is wrong with the posted data, we re-display the page with a + # warning notification + session_data = self.host.getSessionData(request, session_iface.ISATSession) + session_data.setPageNotification(self, failure_.value.message, C.LVL_WARNING) + request.setResponseCode(C.HTTP_SEE_OTHER) + request.setHeader("location", request.uri) + request.finish() + raise failure.Failure(exceptions.CancelError(u"Post/Redirect/Get is used")) + def _on_data_post_redirect(self, ret, request): """called when page's on_data_post has been done successfuly @@ -1312,6 +1326,7 @@ self.pageError(request, C.HTTP_FORBIDDEN) d = defer.maybeDeferred(self.on_data_post, self, request) d.addCallback(self._on_data_post_redirect, request) + d.addErrback(self._on_data_post_error, request) return d def getPostedData(self, request, keys, multiple=False, raise_on_missing=True):