From c0dc6c81dcfcd4ab80416b25c4fd7beddadb915c Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 2 Nov 2013 18:16:56 +0100 Subject: [PATCH 1/4] [FIX] qweb exception hiding bzr revid: al@openerp.com-20131102171656-j4lqrx1gfosi8ofd --- addons/website/models/website.py | 23 +++++++--------------- addons/website/views/website_templates.xml | 4 ++-- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index add8c921b92..51efec12979 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -198,23 +198,14 @@ class website(osv.osv): qweb_context['error'] = err[1] logger.warn("Website Rendering Error.\n\n%s" % traceback.format_exc()) return self.render(cr, uid, ids, 'website.401', qweb_context) - except (QWebException,), err: + except Exception, e: + qweb_context['template'] = getattr(e, 'qweb_template', '') + node = getattr(e, 'qweb_node', None) + qweb_context['node'] = node and node.toxml() + qweb_context['expr'] = getattr(e, 'qweb_eval', '') qweb_context['traceback'] = traceback.format_exc() - qweb_context['template'] = err.template - qweb_context['message'] = err.message - qweb_context['node'] = err.node and err.node.toxml() - logger.error("Website Rendering Error.\n%(message)s\n%(node)s\n\n%(traceback)s" % qweb_context) - return view.render( - cr, uid, - 'website.500' if qweb_context['editable'] else 'website.404', - qweb_context, context=context) - except Exception: - logger.exception("Website Rendering Error.") - qweb_context['traceback'] = traceback.format_exc() - return view.render( - cr, uid, - 'website.500' if qweb_context['editable'] else 'website.404', - qweb_context, context=context) + logger.error("Website Rendering Error.\n%(template)s\n%(expr)s\n%(node)s\n\n%(traceback)s" % qweb_context) + return view.render(cr, uid, 'website.500' if qweb_context['editable'] else 'website.404', qweb_context, context=context) def pager(self, cr, uid, ids, url, total, page=1, step=30, scope=5, url_args=None): # Compute Pager diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 43b85ee8b61..57e6fded011 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -364,8 +364,8 @@

500: Internal Server Error!

-

An exception appear in the template:

- +

Exception in template:

+

Expression:

                         
                     

From e51baab2f32f953242b28f3394667c2bf7b70964 Mon Sep 17 00:00:00 2001
From: Antony Lesuisse 
Date: Sat, 2 Nov 2013 18:31:40 +0100
Subject: [PATCH 2/4] [FIX] robots.txt mimetype

bzr revid: al@openerp.com-20131102173140-b43am0wxsfbetezf
---
 addons/website/controllers/main.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 2548ad80824..0b7c421dbf8 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -269,7 +269,8 @@ class Website(openerp.addons.web.controllers.main.Home):
 
     @website.route(['/robots.txt'], type='http', auth="public")
     def robots(self):
-        return request.website.render('website.robots', {'url_root': request.httprequest.url_root})
+        body = request.website.render('website.robots', {'url_root': request.httprequest.url_root})
+        return request.make_response(body, headers=[('Content-Type', 'text/plain')])
 
     @website.route('/sitemap', type='http', auth='public', multilang=True)
     def sitemap(self, **kwargs):

From fb8991d40439bccee84967cc35c7a6015e94499e Mon Sep 17 00:00:00 2001
From: Christophe Matthieu 
Date: Mon, 4 Nov 2013 11:29:14 +0100
Subject: [PATCH 3/4] [FIX] website snippets: filter insead of siblings
 readXMLData. (fix vertical drop zone, activation snippets...)

bzr revid: chm@openerp.com-20131104102914-jltkz5u88heu87xd
---
 addons/website/static/src/js/website.snippets.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/addons/website/static/src/js/website.snippets.js b/addons/website/static/src/js/website.snippets.js
index 303e670b133..8aa59cce313 100644
--- a/addons/website/static/src/js/website.snippets.js
+++ b/addons/website/static/src/js/website.snippets.js
@@ -589,7 +589,8 @@
         *       Displayed into the overlay options on focus
         */
         _readXMLData: function() {
-            this.$el = this.parent.$snippets.siblings("[data-snippet-id='"+this.snippet_id+"']").clone();
+            var self = this;
+            this.$el = this.parent.$snippets.filter(function () { return $(this).data("snippet-id") == self.snippet_id; }).clone();
             this.$editor = this.$el.find(".oe_snippet_options");
             var $options = this.$overlay.find(".oe_overlay_options");
             this.$editor.prependTo($options.find(".oe_options ul"));

From 49381094a8f00d0d5f7820315839d642edd71dab Mon Sep 17 00:00:00 2001
From: Xavier Morel 
Date: Mon, 4 Nov 2013 12:10:21 +0100
Subject: [PATCH 4/4] [IMP] error handling in website.render

Return responses with the correct status code instead of always
returning 200 on rendering errors from website.

bzr revid: xmo@openerp.com-20131104111021-inrsbawnakhsva1q
---
 addons/website/controllers/main.py |  7 ++---
 addons/website/models/website.py   | 43 ++++++++++++++++++------------
 2 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 0b7c421dbf8..6322793b547 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -124,11 +124,8 @@ class Website(openerp.addons.web.controllers.main.Home):
         values = {
             'path': path,
         }
-        try:
-            html = request.website.render(path, values)
-        except ValueError:
-            html = request.website.render('website.404', values)
-        return html
+
+        return request.website.render(path, values)
 
     @website.route('/website/customize_template_toggle', type='json', auth='user')
     def customize_template_set(self, view_id):
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 51efec12979..4cd6f6e246f 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -1,22 +1,24 @@
 # -*- coding: utf-8 -*-
 import fnmatch
 import functools
+import logging
+import math
 import simplejson
-
-import openerp
-from openerp.osv import osv, fields
-from openerp.addons.web import http
-from openerp.addons.web.http import request
+import traceback
 import urllib
 from urlparse import urljoin
-import math
-import traceback
-from openerp.tools.safe_eval import safe_eval
-from openerp.exceptions import AccessError, AccessDenied
-import werkzeug
-from openerp.addons.base.ir.ir_qweb import QWebException
 
-import logging
+import werkzeug
+import werkzeug.exceptions
+import werkzeug.wrappers
+
+import openerp
+from openerp.exceptions import AccessError, AccessDenied
+from openerp.osv import osv, fields
+from openerp.tools.safe_eval import safe_eval
+from openerp.addons.web import http
+from openerp.addons.web.http import request
+
 logger = logging.getLogger(__name__)
 
 def route(routes, *route_args, **route_kwargs):
@@ -179,8 +181,7 @@ class website(osv.osv):
             try:
                 view_ref = IMD.get_object_reference(cr, uid, module, xmlid)
             except ValueError:
-                logger.error("Website Rendering Error.\n\n%s" % traceback.format_exc())
-                return self.render(cr, uid, ids, 'website.404', qweb_context)
+                return self.error(cr, uid, 404, qweb_context, context=context)
 
         if 'main_object' not in qweb_context:
             try:
@@ -197,15 +198,23 @@ class website(osv.osv):
             logger.error(err)
             qweb_context['error'] = err[1]
             logger.warn("Website Rendering Error.\n\n%s" % traceback.format_exc())
-            return self.render(cr, uid, ids, 'website.401', qweb_context)
+            return self.error(cr, uid, 401, qweb_context, context=context)
         except Exception, e:
             qweb_context['template'] = getattr(e, 'qweb_template', '')
             node = getattr(e, 'qweb_node', None)
             qweb_context['node'] = node and node.toxml()
             qweb_context['expr'] = getattr(e, 'qweb_eval', '')
             qweb_context['traceback'] = traceback.format_exc()
-            logger.error("Website Rendering Error.\n%(template)s\n%(expr)s\n%(node)s\n\n%(traceback)s" % qweb_context)
-            return view.render(cr, uid, 'website.500' if qweb_context['editable'] else 'website.404', qweb_context, context=context)
+            logger.exception("Website Rendering Error.\n%(template)s\n%(expr)s\n%(node)s" % qweb_context)
+            return self.error(cr, uid, 500 if qweb_context['editable'] else 404,
+                              qweb_context, context=context)
+
+    def error(self, cr, uid, code, qweb_context, context=None):
+        View = request.registry['ir.ui.view']
+        return werkzeug.wrappers.Response(
+            View.render(cr, uid, 'website.%d' % code, qweb_context),
+            status=code,
+            content_type='text/html;charset=utf-8')
 
     def pager(self, cr, uid, ids, url, total, page=1, step=30, scope=5, url_args=None):
         # Compute Pager