[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:
@@ -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'])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user