[IMP] avoid 1 query per t-call

This commit is contained in:
Fabien Meghazi
2014-09-16 14:12:00 +02:00
parent 257187537b
commit 82a9162137
4 changed files with 37 additions and 36 deletions
+10 -1
View File
@@ -3,7 +3,7 @@ import copy
from lxml import etree, html
from openerp import SUPERUSER_ID
from openerp import SUPERUSER_ID, tools
from openerp.addons.website.models import website
from openerp.http import request
from openerp.osv import osv, fields
@@ -139,6 +139,15 @@ class view(osv.osv):
return arch
@tools.ormcache_context(accepted_keys=('website_id',))
def get_view_id(self, cr, uid, xml_id, context=None):
if context and 'website_id' in context and not isinstance(xml_id, (int, long)):
domain = [('key', '=', xml_id), '|', ('website_id', '=', context['website_id']), ('website_id', '=', False)]
[xml_id] = self.search(cr, uid, domain, order='website_id', limit=1, context=context)
else:
xml_id = super(view, self).get_view_id(cr, uid, xml_id, context=context)
return xml_id
def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None):
if request and getattr(request, 'website_enabled', False):
engine='website.qweb'
+7 -13
View File
@@ -275,19 +275,13 @@ class website(osv.osv):
return Access.check(cr, uid, 'ir.ui.menu', 'read', False, context=context)
def get_template(self, cr, uid, ids, template, context=None):
if isinstance(template, (int, long)):
view_id = template
else:
if '.' not in template:
template = 'website.%s' % template
module, xmlid = template.split('.', 1)
key = template
website_id=request.context.get('website_id')
view_id=self.pool["ir.ui.view"].search(cr, uid, [('key', '=', key),'|',('website_id','=',website_id),('website_id','=',False)], order='website_id', limit=1, context=context)
if not view_id:
raise NotFound
return self.pool["ir.ui.view"].browse(cr, uid, view_id, context=context)
if not isinstance(template, (int, long)) and '.' not in template:
template = 'website.%s' % template
View = self.pool['ir.ui.view']
view_id = View.get_view_id(cr, uid, template, context=context)
if not view_id:
raise NotFound
return View.browse(cr, uid, view_id, context=context)
def _render(self, cr, uid, ids, template, values=None, context=None):
# TODO: remove this. (just kept for backward api compatibility for saas-3)
-8
View File
@@ -237,14 +237,6 @@ class QWeb(orm.AbstractModel):
if not isinstance(qwebcontext, QWebContext):
qwebcontext = QWebContext(cr, uid, qwebcontext, loader=loader, context=context)
if context is None:
context = {}
website_id=context.get('website_id')
if website_id:
id_or_xml_id=self.pool["ir.ui.view"].search(cr, uid, [('key', '=', id_or_xml_id),'|',('website_id','=',website_id),('website_id','=',False)], order='website_id', limit=1, context=context)[0]
qwebcontext['__template__'] = id_or_xml_id
stack = qwebcontext.get('__stack__', [])
if stack:
+20 -14
View File
@@ -313,7 +313,7 @@ class view(osv.osv):
if not values.get('name'):
values['name'] = "%s %s" % (values.get('model'), values['type'])
self.read_template.clear_cache(self)
self._read_template.clear_cache(self)
return super(view, self).create(
cr, uid,
self._compute_defaults(cr, uid, values, context=context),
@@ -336,7 +336,7 @@ class view(osv.osv):
if custom_view_ids:
self.pool.get('ir.ui.view.custom').unlink(cr, uid, custom_view_ids)
self.read_template.clear_cache(self)
self._read_template.clear_cache(self)
ret = super(view, self).write(
cr, uid, ids,
self._compute_defaults(cr, uid, vals, context=context),
@@ -897,18 +897,11 @@ class view(osv.osv):
#------------------------------------------------------
# QWeb template views
#------------------------------------------------------
read_template_cache = dict(accepted_keys=('lang','inherit_branding', 'editable', 'translatable'))
_read_template_cache = dict(accepted_keys=('lang','inherit_branding', 'editable', 'translatable'))
if config['dev_mode']:
read_template_cache['size'] = 0
@tools.ormcache_context(**read_template_cache)
def read_template(self, cr, uid, xml_id, context=None):
if isinstance(xml_id, (int, long)):
view_id = xml_id
else:
if '.' not in xml_id:
raise ValueError('Invalid template id: %r' % (xml_id,))
view_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
_read_template_cache['size'] = 0
@tools.ormcache_context(**_read_template_cache)
def _read_template(self, cr, uid, view_id, context=None):
arch = self.read_combined(cr, uid, view_id, fields=['arch'], context=context)['arch']
arch_tree = etree.fromstring(arch)
@@ -921,8 +914,21 @@ class view(osv.osv):
arch = etree.tostring(root, encoding='utf-8', xml_declaration=True)
return arch
def read_template(self, cr, uid, xml_id, context=None):
if isinstance(xml_id, (int, long)):
view_id = xml_id
else:
if '.' not in xml_id:
raise ValueError('Invalid template id: %r' % (xml_id,))
view_id = self.get_view_id(cr, uid, xml_id, context=context)
return self._read_template(cr, uid, view_id, context=context)
@tools.ormcache(skiparg=3)
def get_view_id(self, cr, uid, xml_id, context=None):
return self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
def clear_cache(self):
self.read_template.clear_cache(self)
self._read_template.clear_cache(self)
def _contains_branded(self, node):
return node.tag == 't'\