[FIX] website: perf - get most specific in SQL

Before this commit, we would get all the pages for the requested URL then
filter to get the most specific.
This can just be done in SQL by sorting website_id desc so the specific are
returned first.

Note that this will respect 41897f0dba.

This will avoid having to prefetch the generic page when it is useless.

Related to #47257
task-2211013

X-original-commit: b31294592a80d9e55f887f0122cc01225b64966c
This commit is contained in:
Jeremy Kersten
2020-03-19 15:37:48 +00:00
committed by Romain Derie
parent b98d9c968c
commit 89bbf76c44
+7 -14
View File
@@ -237,22 +237,15 @@ class Http(models.AbstractModel):
page_domain = [('url', '=', req_page)] + request.website.website_domain()
published_domain = page_domain
# need to bypass website_published, to apply is_most_specific
# filter later if not publisher
pages = request.env['website.page'].sudo().search(published_domain, order='website_id')
pages = pages.filtered(pages._is_most_specific_page)
if not request.website.is_publisher():
pages = pages.filtered('is_visible')
mypage = pages[0] if pages else False
_, ext = os.path.splitext(req_page)
if mypage:
return request.render(mypage.get_view_identifier(), {
# 'path': req_page[1:],
# specific page first
page = request.env['website.page'].sudo().search(published_domain, order='website_id asc', limit=1)
if page and (request.website.is_publisher() or page.is_visible):
_, ext = os.path.splitext(req_page)
return request.render(page.get_view_identifier(), {
'deletable': True,
'main_object': mypage,
'main_object': page,
}, mimetype=_guess_mimetype(ext))
return False
@classmethod
def _serve_redirect(cls):