[IMP] website, website_blog: perf - cache customize show views

Most of the website rendering process depends of customize_show views which are
part of a configuration setup.
Once it has been setup, it will most likely never change afterward.

It makes sense to orm cache those infos to avoid having to query ir.ui.view
table everytime we render something.

Note that just store basic and small infos used for customize_show case.

task-2211013

Co-authored-by: Romain Derie <rde@odoo.com>
Co-authored-by: Jeremy Kersten <jke@odoo.com>
This commit is contained in:
Jeremy Kersten
2020-04-27 13:49:01 +00:00
co-authored by Romain Derie
parent ad8e65685c
commit 54048cb228
6 changed files with 24 additions and 17 deletions
+1
View File
@@ -448,6 +448,7 @@ class View(models.Model):
self._context.copy(),
main_object=self,
website=request.website,
is_view_active=request.website.is_view_active,
url_for=url_for,
res_company=request.website.company_id.sudo(),
languages=request.env['res.lang'].get_available(),
+9
View File
@@ -698,6 +698,15 @@ class Website(models.Model):
raise ValueError('No record found for unique ID %s. It may have been deleted.' % (view_id))
return view
@tools.ormcache_context('key', keys=('website_id',))
def is_view_active(self, key):
"""
Return True if active, False if not active, None if not found
"""
view = self.viewref(key, raise_if_not_found=False)
return view.active if view else None
@api.model
def get_template(self, template):
View = self.env['ir.ui.view']
+2 -2
View File
@@ -88,8 +88,8 @@ class WebsiteBlog(http.Controller):
else:
domain += [("post_date", "<=", fields.Datetime.now())]
use_cover = request.website.viewref('website_blog.opt_blog_cover_post').active
fullwidth_cover = request.website.viewref('website_blog.opt_blog_cover_post_fullwidth_design').active
use_cover = request.website.is_view_active('website_blog.opt_blog_cover_post')
fullwidth_cover = request.website.is_view_active('website_blog.opt_blog_cover_post_fullwidth_design')
# if blog, we show blog title, if use_cover and not fullwidth_cover we need pager + latest always
offset = (page - 1) * self._blog_post_per_page
@@ -6,7 +6,7 @@ from odoo.addons.website.tests.test_performance import UtilPerf
class TestBlogPerformance(UtilPerf):
def test_10_perf_sql_blog_standard_data(self):
self.assertEqual(self._get_url_hot_query('/blog'), 70)
self.assertEqual(self._get_url_hot_query('/blog'), 50)
def test_20_perf_sql_blog_bigger_data_scaling(self):
BlogPost = self.env['blog.post']
@@ -18,4 +18,4 @@ class TestBlogPerformance(UtilPerf):
for blog_post in blog_posts:
blog_post.tag_ids += blog_tags
blog_tags = blog_tags[:-1]
self.assertEqual(self._get_url_hot_query('/blog'), 136)
self.assertEqual(self._get_url_hot_query('/blog'), 116)
@@ -13,10 +13,7 @@ according to the enabled options.
<t t-if="state_info" t-set="state" t-value="state_info['state']"/>
<!-- Check for active options -->
<t t-set="opt_posts_loop_show_cover" t-value="request.website.viewref('website_blog.opt_posts_loop_show_cover').active"/>
<t t-set="opt_posts_loop_show_author" t-value="request.website.viewref('website_blog.opt_posts_loop_show_author').active"/>
<t t-set="opt_posts_loop_show_stats" t-value="request.website.viewref('website_blog.opt_posts_loop_show_stats').active"/>
<t t-set="opt_posts_loop_show_teaser" t-value="request.website.viewref('website_blog.opt_posts_loop_show_teaser').active"/>
<t t-set="opt_posts_loop_show_cover" t-value="is_view_active('website_blog.opt_posts_loop_show_cover')"/>
<div groups="website.group_website_designer" t-if="state_info and (state_info['published'] > 0 and state_info['unpublished'] > 0)">
<div class="bg-200 py-2 mb-4 alert alert-dismissable">
@@ -105,7 +102,7 @@ according to the enabled options.
<div t-if="opt_posts_loop_show_cover">
<t t-call="website_blog.post_cover_image"/>
</div>
<div t-if="opt_posts_loop_show_teaser" t-att-class="opt_blog_cards_design and 'card-body pt-0'">
<div t-if="is_view_active('website_blog.opt_posts_loop_show_teaser')" t-att-class="opt_blog_cards_design and 'card-body pt-0'">
<t t-call="website_blog.post_teaser"/>
</div>
<div t-if="opt_blog_cards_design" t-attf-class="opt_blog_cards_design and 'card-body pt-0 pb-2'}">
@@ -122,7 +119,7 @@ according to the enabled options.
<t t-if="opt_posts_loop_show_cover" t-call="website_blog.post_cover_image"/>
<div t-att-class="opt_blog_cards_design and 'card-body px-2 py-0 mb-2'">
<t t-call="website_blog.post_heading"/>
<div t-if="opt_posts_loop_show_teaser">
<div t-if="is_view_active('website_blog.opt_posts_loop_show_teaser')">
<t t-call="website_blog.post_teaser"/>
</div>
</div>
@@ -150,7 +147,7 @@ according to the enabled options.
Untitled Post
</a>
<div t-if="not opt_posts_loop_show_cover and opt_posts_loop_show_author" class="text-muted small mt-2">
<div t-if="not opt_posts_loop_show_cover and is_view_active('website_blog.opt_posts_loop_show_author')" class="text-muted small mt-2">
by <span t-field="blog_post.author_id"/>
</div>
</template>
@@ -160,7 +157,7 @@ according to the enabled options.
<div class="d-flex small flex-wrap mb-1 w-100">
<div t-attf-class="d-flex flex-wrap align-items-center justify-content-between mx-n2 #{opt_blog_list_view and 'flex-grow-0 w-auto mw-100' or 'flex-grow-1' }">
<time t-field="blog_post.post_date" class="text-nowrap font-weight-bold px-2" t-options='{"format": "MMM d, yyyy"}'/>
<div t-if="opt_posts_loop_show_stats" class="px-2">
<div t-if="is_view_active('website_blog.opt_posts_loop_show_stats')" class="px-2">
<b class="text-nowrap" title="Comments"><i class="fa fa-comment text-muted mr-1"/><t t-esc="len(blog_post.message_ids)"/></b>
<b class="text-nowrap pl-2" title="Views"><i class="fa fa-binoculars text-muted mr-1"/><t t-esc="blog_post.visits"/></b>
</div>
@@ -185,7 +182,7 @@ according to the enabled options.
<t t-set="_record" t-value="blog_post"/>
<t t-set="additionnal_classes" t-value="'o_list_cover o_not_editable ' + (not opt_blog_cards_design and ' rounded overflow-hidden shadow mb-3' or '')"/>
<t t-if="opt_posts_loop_show_author" t-call="website_blog.post_author">
<t t-if="is_view_active('website_blog.opt_posts_loop_show_author')" t-call="website_blog.post_author">
<t t-set="additionnal_classes" t-value="'o_wblog_post_list_author o_list_cover d-flex text-white w-100 o_not_editable ' + ('p-3 h5 m-0' if opt_blog_list_view else 'px-2 pb-2 pt-3') "/>
<t t-set="hide_date" t-value="True"/>
</t>
@@ -51,10 +51,10 @@ list of filtered posts (by date or tag).
</t>
<!-- Check for active options: the stored value may be used in sub-templates too -->
<t t-set="opt_blog_cards_design" t-value="request.website.viewref('website_blog.opt_blog_cards_design').active"/>
<t t-set="opt_blog_list_view" t-value="request.website.viewref('website_blog.opt_blog_list_view').active"/>
<t t-set="opt_blog_readable" t-value="request.website.viewref('website_blog.opt_blog_readable').active"/>
<t t-set="opt_blog_sidebar_show" t-value="request.website.viewref('website_blog.opt_blog_sidebar_show').active"/>
<t t-set="opt_blog_cards_design" t-value="is_view_active('website_blog.opt_blog_cards_design')"/>
<t t-set="opt_blog_list_view" t-value="is_view_active('website_blog.opt_blog_list_view')"/>
<t t-set="opt_blog_readable" t-value="is_view_active('website_blog.opt_blog_readable')"/>
<t t-set="opt_blog_sidebar_show" t-value="is_view_active('website_blog.opt_blog_sidebar_show')"/>
<div id="o_wblog_blog_top">
<!-- Selectively display droppable-areas for 'all blogs' or single-blog pages -->