[FIX] website: catch and dispatch error for rendering

bzr revid: chm@openerp.com-20130826101615-t1ouij4flhtdthxe
This commit is contained in:
Christophe Matthieu 2013-08-26 12:16:15 +02:00
parent 04f97cf6e3
commit 667d96ff0c
5 changed files with 30 additions and 17 deletions

View File

@ -292,7 +292,7 @@
<t t-call="website.layout">
<div class="container">
<h1 class="mt32">500: Internal Server Error!</h1>
<pre t-esc="traceback"/>
<pre t-if="editable" t-esc="traceback"/>
</div>
</t>
</template>
@ -308,7 +308,7 @@
Maybe you were looking for one of these
popular pages ?
</p>
<pre class="hidden" t-esc="error"/>
<pre t-if="editable" t-esc="error"/>
<ul>
<li><a href="/">Homepage</a></li>
<li><a href="/">Contact Us</a></li>

View File

@ -10,6 +10,7 @@ import urllib
import math
import traceback
from openerp.tools.safe_eval import safe_eval
from openerp.exceptions import AccessError, AccessDenied
import logging
logger = logging.getLogger(__name__)
@ -72,25 +73,36 @@ class website(osv.osv):
values.update(additional_values)
return values
def render(self, template, values={}):
def render(self, template, values=None):
view = request.registry.get("ir.ui.view")
IMD = request.registry.get("ir.model.data")
if not values:
values = {}
context = {
'inherit_branding': values.get('editable', False),
}
# check if xmlid of the template exists
try:
model, xmlid = template.split('.')
model, id = IMD.get_object_reference(request.cr, request.uid, model, xmlid)
except ValueError:
logger.error("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render('website.404', values)
# render template and catch error
try:
return view.render(request.cr, request.uid, template, values, context=context)
# except (osv.except_osv, orm.except_orm), err:
# logger.error(err)
# values['error'] = err[1]
# return self.render('website.401', values)
# except ValueError:
# logger.error("Website Rendering Error.\n\n%s" % (traceback.format_exc()))
# return self.render('website.404', values)
except (AccessError, AccessDenied), err:
logger.error(err)
values['error'] = err[1]
logger.warn("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render('website.401', values)
except Exception:
trace = traceback.format_exc()
logger.error("Website Rendering Error.\n\n%s" % trace)
values['traceback'] = traceback.format_exc()
logger.error("Website Rendering Error.\n\n%s" % values['traceback'])
if values['editable']:
values['traceback'] = trace
return view.render(request.cr, request.uid, 'website.500', values, context=context)
else:
return view.render(request.cr, request.uid, 'website.404', values, context=context)

View File

@ -32,7 +32,7 @@ class website_contract(http.Controller):
step = 20
pager = website.pager(url="/references/", total=len(partner_ids), page=page, step=step, scope=7, url_args=post)
partner_ids = partner_obj.search(request.cr, request.uid, [('id', 'in', partner_ids)], limit=step, offset=pager['offset'])
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, [('id', 'in', partner_ids)], limit=step, offset=pager['offset'])
values = website.get_rendering_context({
'partner_ids': partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids),
@ -45,8 +45,9 @@ class website_contract(http.Controller):
def references_ref(self, ref_id=0, **post):
website = request.registry['website']
partner_obj = request.registry['res.partner']
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, [('website_published', '=', True), ('id', '=', ref_id)])
values = website.get_rendering_context({
'partner_id': partner_obj.browse(request.cr, openerp.SUPERUSER_ID, ref_id, context={'show_address': True}),
'partner_id': partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids[0], context={'show_address': True}),
})
return website.render("website_contract.details", values)

View File

@ -48,7 +48,7 @@
<div class="media-body">
<t t-call="website.publish"><t t-set="object" t-value="partner"/></t>
<a class="media-heading" t-attf-href="/references/#{ partner.id }/"><small t-field="partner.parent_id"/> <small t-field="partner.name"/></a>
<div t-field="partner.website_sort_description"/>
<div t-field="partner.website_short_description"/>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@ class res_partner(osv.osv):
_columns = {
'website_published': fields.boolean('Available in the website'),
'website_description': fields.html('Description for the website'),
'website_sort_description': fields.text('Sort description for the website'),
'website_short_description': fields.text('Sort description for the website'),
}
def img(self, cr, uid, ids, field='image_small', context=None):