From a2fb61835476ce4a482ea5df8fcdebe2ae47840e Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 27 Jan 2014 12:40:34 +0100 Subject: [PATCH] [FIX] do not crash when trying to rescue a wrong t-call in template Need trunk-website-al server's Rev#5173 bzr revid: fme@openerp.com-20140127114034-luhekopukpbmntqt --- addons/website/models/ir_http.py | 19 ++++++++++--------- addons/website/models/ir_ui_view.py | 17 +++++++++++------ addons/website/views/website_templates.xml | 14 +++++++------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index a4c4d5e3dab..02e320deeb0 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -8,6 +8,7 @@ import werkzeug.routing import openerp from openerp.addons.base import ir +from openerp.addons.base.ir import ir_qweb from openerp.addons.website.models.website import slug from openerp.http import request from openerp.osv import orm @@ -109,21 +110,21 @@ class ir_http(orm.AbstractModel): traceback=traceback.format_exc(exception), ) if exception: - if isinstance(exception, openerp.exceptions.AccessError): + current_exception = exception + if isinstance(exception, ir_qweb.QWebException): + values.update(qweb_exception=exception) + if exception.inner: + current_exception = exception.inner + if isinstance(current_exception, openerp.exceptions.AccessError): code = 403 else: code = getattr(exception, 'code', code) - values.update( - qweb_template=getattr(exception, 'qweb_template', None), - qweb_node=getattr(exception, 'qweb_node', None), - qweb_eval=getattr(exception, 'qweb_eval', None), - ) if code == 500: logger.error("500 Internal Server Error:\n\n%s", values['traceback']) - if values['qweb_template']: + if values.get('qweb_exception'): view = request.registry.get("ir.ui.view") - views = view._views_get(request.cr, request.uid, values['qweb_template'], request.context) - to_reset = [view for view in views if view.model_data_id.noupdate == True] + views = view._views_get(request.cr, request.uid, values['qweb_exception'].template, request.context) + to_reset = [v for v in views if v.model_data_id.noupdate is True] values['views'] = to_reset elif code == 403: logger.warn("403 Forbidden:\n\n%s", values['traceback']) diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index 02fa87e10aa..ad6e98de5fb 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- import copy -from urlparse import urlparse from lxml import etree, html from openerp.osv import osv, fields -from openerp.addons.base import ir class view(osv.osv): _inherit = "ir.ui.view" @@ -24,9 +22,9 @@ class view(osv.osv): # Returns all views (called and inherited) related to a view # Used by translation mechanism, SEO and optional templates def _views_get(self, cr, uid, view, options=True, context=None, root=True, stack_result=None): - if not context: + if not context: context = {} - if not stack_result: + if not stack_result: stack_result = [] def view_obj(view): @@ -38,7 +36,11 @@ class view(osv.osv): view_obj = self.pool.get("ir.ui.view") view = view_obj.browse(cr, uid, view, context=context) return view - view = view_obj(view) + try: + view = view_obj(view) + except ValueError: + # Shall we log that ? + return [] while root and view.inherit_id: view = view.inherit_id @@ -53,7 +55,10 @@ class view(osv.osv): result.append(r) node = etree.fromstring(view.arch) for child in node.xpath("//t[@t-call]"): - call_view = view_obj(child.get('t-call')) + try: + call_view = view_obj(child.get('t-call')) + except ValueError: + continue if call_view not in result: result += self._views_get(cr, uid, call_view, options=options, context=context, stack_result=result) return result diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 824333ee5f8..7617500f565 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -455,7 +455,7 @@ -
+