[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
This commit is contained in:
Fabien Meghazi 2014-01-27 12:40:34 +01:00
parent b8fec90fb4
commit a2fb618354
3 changed files with 28 additions and 22 deletions

View File

@ -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'])

View File

@ -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

View File

@ -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">