diff options
| author | Fabien Meghazi <fme@openerp.com> | 2014-01-27 12:40:34 +0100 |
|---|---|---|
| committer | Fabien Meghazi <fme@openerp.com> | 2014-01-27 12:40:34 +0100 |
| commit | a2fb61835476ce4a482ea5df8fcdebe2ae47840e (patch) | |
| tree | ba2b3c542fb39ecfd189b6f3a4d733c9f86171ee | |
| parent | b8fec90fb466b335980c170bca32c3c01db9bdc6 (diff) | |
[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
| -rw-r--r-- | addons/website/models/ir_http.py | 19 | ||||
| -rw-r--r-- | addons/website/models/ir_ui_view.py | 17 | ||||
| -rw-r--r-- | 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 @@ </div> </div> </div> - <div class="panel panel-default" t-if="qweb_template"> + <div class="panel panel-default" t-if="qweb_exception"> <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#adebug_infos" href="#error_qweb"> @@ -466,11 +466,11 @@ <div id="error_qweb" class="panel-collapse collapse"> <div class="panel-body"> <p> - The error occured while rendering the template <code t-esc="qweb_template"/> - <t t-if="qweb_eval">and evaluating the following expression: <code t-esc="qweb_eval"/></t> + The error occured while rendering the template <code t-esc="qweb_exception.template"/> + <t t-if="qweb_exception.expression">and evaluating the following expression: <code t-esc="qweb_exception.expression"/></t> </p> - <t t-if="qweb_node"> - <pre id="exception_node" t-esc="qweb_node.toxml()"/> + <t t-if="qweb_exception.node"> + <pre id="exception_node" t-esc="qweb_exception.node.toxml()"/> </t> </div> </div> @@ -567,9 +567,9 @@ </div> <div class="container" t-if="views"> - <div class="alert alert-danger" t-if="qweb_template and editable"> + <div class="alert alert-danger" t-if="qweb_exception and editable"> <h4>Template fallback</h4> - <p>An error occured while rendering the template <code t-esc="qweb_template"/>.</p> + <p>An error occured while rendering the template <code t-esc="qweb_exception.template"/>.</p> <p>If this error is caused by a change of yours in the templates, you have the possibility to reset one or more templates to their <strong>factory settings</strong>.</p> <form action="/website/reset_templates" method="post"> <ul class="oe_template_fallback"> |
