[IMP] preload records and throw 404 if not exists for blog, event, product
authorFabien Meghazi <fme@openerp.com>
Thu, 5 Dec 2013 15:54:50 +0000 (16:54 +0100)
committerFabien Meghazi <fme@openerp.com>
Thu, 5 Dec 2013 15:54:50 +0000 (16:54 +0100)
bzr revid: fme@openerp.com-20131205155450-y6joi29l2cn9amkn

addons/website/models/website.py
addons/website_blog/controllers/main.py
addons/website_event/controllers/main.py
addons/website_event/views/website_event.xml
addons/website_sale/controllers/main.py
addons/website_sale/views/website_sale.xml

index df04d56..b1df178 100644 (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
index 29f680f..0e53809 100644 (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(
index 6724fb2..fd78aaf 100644 (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,
index 562d7ea..fc3ddab 100644 (file)
         </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">
index 7cfde4c..f511fab 100644 (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)
index ec02410..84aca47 100644 (file)
 
 
     <!-- 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">