[MERGE] qweb-m2o-view - Allow to use many2one for qweb template (work also with view_id)
bzr revid: jke@openerp.com-20140416085407-krltmt3jhw802a5c
This commit is contained in:
commit
73bbf079c7
|
@ -144,7 +144,7 @@ class QWeb(orm.AbstractModel):
|
||||||
"""Add a parsed template in the context. Used to preprocess templates."""
|
"""Add a parsed template in the context. Used to preprocess templates."""
|
||||||
qwebcontext.templates[name] = node
|
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
|
Loads an XML document and installs any contained template in the engine
|
||||||
"""
|
"""
|
||||||
|
@ -156,9 +156,13 @@ class QWeb(orm.AbstractModel):
|
||||||
dom = xml.dom.minidom.parse(document)
|
dom = xml.dom.minidom.parse(document)
|
||||||
|
|
||||||
for node in dom.documentElement.childNodes:
|
for node in dom.documentElement.childNodes:
|
||||||
if node.nodeType == self.node.ELEMENT_NODE and node.getAttribute('t-name'):
|
if node.nodeType == self.node.ELEMENT_NODE:
|
||||||
name = str(node.getAttribute("t-name"))
|
if node.getAttribute('t-name'):
|
||||||
self.add_template(qwebcontext, name, node)
|
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):
|
def get_template(self, name, qwebcontext):
|
||||||
origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0]
|
origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0]
|
||||||
|
@ -167,7 +171,7 @@ class QWeb(orm.AbstractModel):
|
||||||
xml_doc = qwebcontext.loader(name)
|
xml_doc = qwebcontext.loader(name)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise_qweb_exception(QWebTemplateNotFound, message="Loader could not find template %r" % name, template=origin_template)
|
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:
|
if name in qwebcontext.templates:
|
||||||
return qwebcontext.templates[name]
|
return qwebcontext.templates[name]
|
||||||
|
@ -385,7 +389,12 @@ class QWeb(orm.AbstractModel):
|
||||||
cr = d.get('request') and d['request'].cr or None
|
cr = d.get('request') and d['request'].cr or None
|
||||||
uid = d.get('request') and d['request'].uid 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):
|
def render_tag_set(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||||
if "value" in template_attributes:
|
if "value" in template_attributes:
|
||||||
|
@ -418,8 +427,7 @@ class QWeb(orm.AbstractModel):
|
||||||
element, template_attributes, generated_attributes, qwebcontext, context=qwebcontext.context)
|
element, template_attributes, generated_attributes, qwebcontext, context=qwebcontext.context)
|
||||||
|
|
||||||
def get_converter_for(self, field_type):
|
def get_converter_for(self, field_type):
|
||||||
return self.pool.get('ir.qweb.field.' + field_type,
|
return self.pool.get('ir.qweb.field.' + field_type, self.pool['ir.qweb.field'])
|
||||||
self.pool['ir.qweb.field'])
|
|
||||||
|
|
||||||
def get_widget_for(self, widget):
|
def get_widget_for(self, widget):
|
||||||
return self.pool.get('ir.qweb.widget.' + widget, self.pool['ir.qweb.widget'])
|
return self.pool.get('ir.qweb.widget.' + widget, self.pool['ir.qweb.widget'])
|
||||||
|
@ -848,6 +856,26 @@ class Contact(orm.AbstractModel):
|
||||||
|
|
||||||
return HTMLSafe(html)
|
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):
|
class QwebWidget(osv.AbstractModel):
|
||||||
_name = 'ir.qweb.widget'
|
_name = 'ir.qweb.widget'
|
||||||
|
|
||||||
|
|
|
@ -719,10 +719,13 @@ class view(osv.osv):
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
@tools.ormcache_context(accepted_keys=('lang','inherit_branding', 'editable', 'translatable'))
|
@tools.ormcache_context(accepted_keys=('lang','inherit_branding', 'editable', 'translatable'))
|
||||||
def read_template(self, cr, uid, xml_id, context=None):
|
def read_template(self, cr, uid, xml_id, context=None):
|
||||||
if '.' not in xml_id:
|
if isinstance(xml_id, (int, long)):
|
||||||
raise ValueError('Invalid template id: %r' % (xml_id,))
|
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 = self.read_combined(cr, uid, view_id, fields=['arch'], context=context)['arch']
|
||||||
arch_tree = etree.fromstring(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):
|
def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None):
|
||||||
if isinstance(id_or_xml_id, list):
|
if isinstance(id_or_xml_id, list):
|
||||||
id_or_xml_id = id_or_xml_id[0]
|
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:
|
if not context:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -867,7 +867,7 @@ class view(osv.osv):
|
||||||
def loader(name):
|
def loader(name):
|
||||||
return self.read_template(cr, uid, name, context=context)
|
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
|
# Misc
|
||||||
|
|
Loading…
Reference in New Issue