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
"""
BYPAGE = 10
+ website.preload_records(category, tag)
cr, uid, context = request.cr, request.uid, request.context
blog_post_obj = request.registry['blog.post']
- '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(
@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:
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,
</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">
@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)
<!-- 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">