[IMP] preload records and throw 404 if not exists for blog, event, product

bzr revid: fme@openerp.com-20131205155450-y6joi29l2cn9amkn
This commit is contained in:
Fabien Meghazi 2013-12-05 16:54:50 +01:00
parent bba940105a
commit 7a3b490f46
6 changed files with 54 additions and 2 deletions

View File

@ -80,6 +80,23 @@ def urlplus(url, params):
def quote_plus(value):
return urllib.quote_plus(value.encode('utf-8') if isinstance(value, unicode) else str(value))
def preload_records(*args, **kwargs):
""" This helper allows to check the existence and prefetch one or many browse_records at once.
If the browse record(s) does not exists in the db it will raise a LazyResponse
"""
field = kwargs.pop('field', 'name')
on_error = kwargs.pop('on_error', 'website.404')
error_code = kwargs.pop('error_code', 404)
try:
for arg in args:
if isinstance(arg, orm.browse_record):
arg[field]
elif isinstance(arg, orm.browse_record_list):
[record[field] for record in arg]
except:
lazy_error = request.website.render(on_error, status_code=error_code)
raise werkzeug.exceptions.HTTPException(response=lazy_error)
class website(osv.osv):
def _get_menu_website(self, cr, uid, ids, context=None):
# IF a menu is changed, update all websites

View File

@ -97,6 +97,7 @@ class WebsiteBlog(http.Controller):
"""
BYPAGE = 10
website.preload_records(category, tag)
cr, uid, context = request.cr, request.uid, request.context
blog_post_obj = request.registry['blog.post']
@ -178,6 +179,8 @@ class WebsiteBlog(http.Controller):
- 'nav_list': a dict [year][month] for archives navigation
"""
website.preload_records(blog_post)
pager_url = "/blogpost/%s" % blog_post.id
pager = request.website.pager(

View File

@ -163,13 +163,15 @@ class website_event(http.Controller):
@website.route(['/event/<model("event.event"):event>/page/<page:page>'], type='http', auth="public", multilang=True)
def event_page(self, event, page, **post):
website.preload_records(event, on_error="website_event.404")
values = {
'event': event,
}
return request.website.render(page, values)
@website.route(['/event/<model("event.event"):event>'], type='http', auth="public", multilang=True)
def event(self, event=None, **post):
def event(self, event, **post):
website.preload_records(event, on_error="website_event.404")
if event.menu_id and event.menu_id.child_id:
target_url = event.menu_id.child_id[0].url
else:
@ -179,7 +181,8 @@ class website_event(http.Controller):
return request.redirect(target_url);
@website.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", multilang=True)
def event_register(self, event=None, **post):
def event_register(self, event, **post):
website.preload_records(event, on_error="website_event.404")
values = {
'event': event,
'range': range,

View File

@ -243,6 +243,20 @@
</t>
</template>
<template id="404">
<t t-call="website.layout">
<div id="wrap">
<div class="oe_structure oe_empty">
<div class="container">
<h1 class="mt32">Event not found!</h1>
<p>Sorry, the requested event is not available anymore.</p>
<p><a t-href="/event/">Return to the event list.</a></p>
</div>
</div>
</div>
</t>
</template>
<template id="event_description_full">
<t t-call="website_event.event_details">
<div class="col-md-8">

View File

@ -243,6 +243,8 @@ class Ecommerce(http.Controller):
@website.route(['/shop/product/<model("product.template"):product>/'], type='http', auth="public", multilang=True)
def product(self, product, search='', category='', filter_domain='', **kwargs):
website.preload_records(product, on_error="website_sale.404")
category_obj = request.registry.get('product.public.category')
category_ids = category_obj.search(request.cr, request.uid, [], context=request.context)

View File

@ -227,6 +227,19 @@
<!-- product -->
<template id="404">
<t t-call="website.layout">
<div id="wrap">
<div class="oe_structure oe_empty">
<div class="container">
<h1 class="mt32">Product not found!</h1>
<p>Sorry, this product is not available anymore.</p>
<p><a t-href="/shop/">Return to the product list.</a></p>
</div>
</div>
</div>
</t>
</template>
<template id="product" name="Product">
<t t-call="website.layout">