From 64462173c1d54f92a26db600d7494d39a62739cb Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Wed, 9 Apr 2014 14:46:26 +0200 Subject: [PATCH 1/2] [IMP] ir_qweb, ir_ui_view: can use id insead of xml_id; can render ir.ui.view many2one with widget='qweb' in template bzr revid: chm@openerp.com-20140409124626-ccxnfef7bb7h1gm6 --- openerp/addons/base/ir/ir_qweb.py | 36 ++++++++++++++++++++++++---- openerp/addons/base/ir/ir_ui_view.py | 14 +++++------ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 40ed60b05a3..edbe6c327c0 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -144,7 +144,7 @@ class QWeb(orm.AbstractModel): """Add a parsed template in the context. Used to preprocess templates.""" qwebcontext.templates[name] = node - def load_document(self, document, qwebcontext): + def load_document(self, document, res_id, qwebcontext): """ Loads an XML document and installs any contained template in the engine """ @@ -159,6 +159,8 @@ class QWeb(orm.AbstractModel): if node.nodeType == self.node.ELEMENT_NODE and node.getAttribute('t-name'): name = str(node.getAttribute("t-name")) self.add_template(qwebcontext, name, node) + if res_id: + self.add_template(qwebcontext, res_id, node) def get_template(self, name, qwebcontext): origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0] @@ -167,7 +169,7 @@ class QWeb(orm.AbstractModel): xml_doc = qwebcontext.loader(name) except ValueError: raise_qweb_exception(QWebTemplateNotFound, message="Loader could not find template %r" % name, template=origin_template) - self.load_document(xml_doc, qwebcontext=qwebcontext) + self.load_document(xml_doc, isinstance(name, (int, long)) and name or None, qwebcontext=qwebcontext) if name in qwebcontext.templates: return qwebcontext.templates[name] @@ -385,7 +387,12 @@ class QWeb(orm.AbstractModel): cr = d.get('request') and d['request'].cr or None uid = d.get('request') and d['request'].uid or None - return self.render(cr, uid, self.eval_format(template_attributes["call"], d), d) + template = self.eval_format(template_attributes["call"], d) + try: + template = int(template) + except ValueError: + pass + return self.render(cr, uid, template, d) def render_tag_set(self, element, template_attributes, generated_attributes, qwebcontext): if "value" in template_attributes: @@ -418,8 +425,7 @@ class QWeb(orm.AbstractModel): element, template_attributes, generated_attributes, qwebcontext, context=qwebcontext.context) def get_converter_for(self, field_type): - return self.pool.get('ir.qweb.field.' + field_type, - self.pool['ir.qweb.field']) + return self.pool.get('ir.qweb.field.' + field_type, self.pool['ir.qweb.field']) def get_widget_for(self, widget): return self.pool.get('ir.qweb.widget.' + widget, self.pool['ir.qweb.widget']) @@ -845,6 +851,26 @@ class Contact(orm.AbstractModel): return HTMLSafe(html) +class QwebView(orm.AbstractModel): + _name = 'ir.qweb.field.qweb' + _inherit = 'ir.qweb.field.many2one' + + def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None): + if not getattr(record, field_name): + return None + + view = getattr(record, field_name) + + if view._model._name != "ir.ui.view": + _logger.warning("%s.%s must be a 'ir.ui.view' model." % (record, field_name)) + return None + + ctx = (context or {}).copy() + ctx['object'] = record + html = view.render(ctx, engine='ir.qweb', context=ctx).decode('utf8') + + return HTMLSafe(html) + class QwebWidget(osv.AbstractModel): _name = 'ir.qweb.widget' diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py index 7c857e767ba..f67f65f2c1c 100644 --- a/openerp/addons/base/ir/ir_ui_view.py +++ b/openerp/addons/base/ir/ir_ui_view.py @@ -719,10 +719,13 @@ class view(osv.osv): #------------------------------------------------------ @tools.ormcache_context(accepted_keys=('lang','inherit_branding', 'editable', 'translatable')) def read_template(self, cr, uid, xml_id, context=None): - if '.' not in xml_id: - raise ValueError('Invalid template id: %r' % (xml_id,)) + 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) - view_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True) arch = self.read_combined(cr, uid, view_id, fields=['arch'], context=context)['arch'] arch_tree = etree.fromstring(arch) @@ -847,9 +850,6 @@ class view(osv.osv): def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None): if isinstance(id_or_xml_id, list): id_or_xml_id = id_or_xml_id[0] - tname = id_or_xml_id - if isinstance(tname, (int, long)): - tname = self.get_view_xmlid(cr, uid, tname) if not context: context = {} @@ -867,7 +867,7 @@ class view(osv.osv): def loader(name): return self.read_template(cr, uid, name, context=context) - return self.pool[engine].render(cr, uid, tname, qcontext, loader=loader, context=context) + return self.pool[engine].render(cr, uid, id_or_xml_id, qcontext, loader=loader, context=context) #------------------------------------------------------ # Misc From 9d187f99157af242db1f2294f8e420853003d9ad Mon Sep 17 00:00:00 2001 From: "chm@openerp.com" <> Date: Thu, 10 Apr 2014 10:00:58 +0200 Subject: [PATCH 2/2] [IMP] ir_qweb: first tag 't' template of a view is added to qwebcontext.templates with id of ir_ui_view bzr revid: chm@openerp.com-20140410080058-tx59gwh8nsefria3 --- openerp/addons/base/ir/ir_qweb.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index edbe6c327c0..b57e935089a 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -156,11 +156,13 @@ class QWeb(orm.AbstractModel): dom = xml.dom.minidom.parse(document) for node in dom.documentElement.childNodes: - if node.nodeType == self.node.ELEMENT_NODE and node.getAttribute('t-name'): - name = str(node.getAttribute("t-name")) - self.add_template(qwebcontext, name, node) - if res_id: + if node.nodeType == self.node.ELEMENT_NODE: + if node.getAttribute('t-name'): + name = str(node.getAttribute("t-name")) + self.add_template(qwebcontext, name, node) + if res_id and node.tagName == "t": self.add_template(qwebcontext, res_id, node) + res_id = None def get_template(self, name, qwebcontext): origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0]