fix rng validation, fields_view_get, qweb t-esc t-raw default

bzr revid: al@openerp.com-20130630213515-go5qr2dmo0xlazvr
This commit is contained in:
Antony Lesuisse 2013-06-30 23:35:15 +02:00
parent 54a41790a0
commit 05c9b607f8
3 changed files with 64 additions and 46 deletions

View File

@ -139,21 +139,21 @@ class view(osv.osv):
except Exception, e:
_logger.exception(e)
return False
# RNG-based validation is not possible anymore with 7.0 forms
# TODO 7.0: provide alternative assertion-based validation of view_arch_utf8
view_docs = [etree.fromstring(view_arch_utf8)]
if view_docs[0].tag == 'data':
# A <data> element is a wrapper for multiple root nodes
view_docs = view_docs[0]
validator = self._relaxng()
for view_arch in view_docs:
if (view_arch.get('version') < '7.0') and validator and not validator.validate(view_arch):
for error in validator.error_log:
_logger.error(tools.ustr(error))
return False
if not valid_view(view_arch):
return False
if view.type != 'qweb':
# RNG-based validation is not possible anymore with 7.0 forms
# TODO 7.0: provide alternative assertion-based validation of view_arch_utf8
view_docs = [etree.fromstring(view_arch_utf8)]
if view_docs[0].tag == 'data':
# A <data> element is a wrapper for multiple root nodes
view_docs = view_docs[0]
validator = self._relaxng()
for view_arch in view_docs:
if (view_arch.get('version') < '7.0') and validator and not validator.validate(view_arch):
for error in validator.error_log:
_logger.error(tools.ustr(error))
return False
if not valid_view(view_arch):
return False
return True
_constraints = [
@ -200,14 +200,15 @@ class view(osv.osv):
:return: id of the default view of False if none found
:rtype: int
"""
ids = self.search(cr, uid, [
domain = [
['model', '=', model],
['type', '=', view_type],
['inherit_id', '=', False],
], limit=1, order='priority', context=context)
]
ids = self.search(cr, uid, domain, limit=1, order='priority', context=context)
if not ids:
return False
return ids[0]
return ids[0]
# inheritance
@ -739,11 +740,11 @@ class view(osv.osv):
def loader(name):
arch = self.read_template(cr, uid, name, context=context)
arch_tree = etree.fromstring(arch.encode('utf-8'))
arch_tree = etree.fromstring(arch)
self.distribute_branding(arch_tree)
arch = etree.tostring(arch_tree, encoding='utf-8')
arch = u'<?xml version="1.0" encoding="utf-8"?><tpl><t t-name="{0}">{1}</t></tpl>'.format(name, arch)
arch = '<?xml version="1.0" encoding="utf-8"?><tpl><t t-name="%s">%s</t></tpl>' % (name.encode('utf-8'), arch)
return arch
engine = qweb.QWebXml(loader)

View File

@ -1820,24 +1820,24 @@ class BaseModel(object):
result['type'] = root_view['type']
result['view_id'] = root_view['id']
result['field_parent'] = root_view['field_parent']
# Apply post processing, groups and modifiers etc...
ctx = context
if root_view.get('model') != self._name:
ctx = dict(context, base_model_name=root_view.get('model'))
xarch, xfields = View.postprocess_and_fields( cr, uid, self._name, etree.fromstring(result['arch']), result['view_id'], context=ctx)
result['arch'] = xarch
result['fields'] = xfields
else:
# fallback on default views methods if no ir.ui.view could be found
try:
get_func = getattr(self, '_get_default_%s_view' % view_type)
arch_etree = get_func(self.cr, self.uid, self.context)
arch_etree = get_func(cr, uid, context)
result['arch'] = etree.tostring(arch_etree, encoding='utf-8')
result['type'] = view_type
result['name'] = 'default'
except AttributeError:
raise except_orm(_('Invalid Architecture!'), _("No default view of type '%s' could be found !") % view_type)
# Apply post processing, groups and modifiers etc...
ctx = context
if root_view.get('model') != self._name:
ctx = dict(context, base_model_name=root_view.get('model'))
xarch, xfields = View.postprocess_and_fields( cr, uid, self._name, etree.fromstring(result['arch']), result['view_id'], context=ctx)
result['arch'] = xarch
result['fields'] = xfields
# Add related action information if aksed
if toolbar:

View File

@ -34,7 +34,7 @@ class QWebEval(object):
def eval_str(self, expr):
if expr == "0":
return self.data[0]
return self.data.get(0, '')
if isinstance(self[expr], unicode):
return self[expr].encode("utf8")
return str(self[expr])
@ -122,7 +122,9 @@ class QWebXml(object):
def eval_bool(self, expr, v):
return QWebEval(v).eval_bool(expr)
def render(self, tname, v={}, out=None):
def render(self, tname, v=None, out=None):
if v is None:
v = {}
return self.render_node(self.get_template(tname), v)
def render_node(self, e, v):
@ -130,7 +132,6 @@ class QWebXml(object):
if e.nodeType == self.node.TEXT_NODE or e.nodeType == self.node.CDATA_SECTION_NODE:
r = e.data.encode("utf8")
elif e.nodeType == self.node.ELEMENT_NODE:
pre = ""
g_att = ""
t_render = None
t_att = {}
@ -155,15 +156,24 @@ class QWebXml(object):
if t_render in self._render_tag:
r = self._render_tag[t_render](self, e, t_att, g_att, v)
else:
r = self.render_element(e, g_att, v, pre, t_att.get("trim", 0))
r = self.render_element(e, t_att, g_att, v)
return r
def render_element(self, e, g_att, v, pre="", trim=0):
g_inner = []
for n in e.childNodes:
g_inner.append(self.render_node(n, v))
def render_element(self, e, t_att, g_att, v, inner=None):
# e: element
# t_att: t-* attributes
# g_att: generated attributes
# v: values
# inner: optional innerXml
if inner:
g_inner = inner
else:
g_inner = []
for n in e.childNodes:
g_inner.append(self.render_node(n, v))
name = str(e.nodeName)
inner = "".join(g_inner)
trim = t_att.get("trim", 0)
if trim == 0:
pass
elif trim == 'left':
@ -174,8 +184,9 @@ class QWebXml(object):
inner = inner.strip()
if name == "t":
return inner
elif len(inner):
return "<%s%s>%s%s</%s>" % (name, g_att, pre, inner, name)
elif len(inner) or name in ['script','i']:
# script should be rendered as <script></script>
return "<%s%s>%s</%s>" % (name, g_att, inner, name)
else:
return "<%s%s/>" % (name, g_att)
@ -191,16 +202,20 @@ class QWebXml(object):
# Tags
def render_tag_raw(self, e, t_att, g_att, v):
return self.eval_str(t_att["raw"], v)
inner = self.eval_str(t_att["raw"], v)
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_rawf(self, e, t_att, g_att, v):
return self.eval_format(t_att["rawf"], v)
inner = self.eval_format(t_att["rawf"], v)
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_esc(self, e, t_att, g_att, v):
return cgi.escape(self.eval_str(t_att["esc"], v))
inner = cgi.escape(self.eval_str(t_att["esc"], v))
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_escf(self, e, t_att, g_att, v):
return cgi.escape(self.eval_format(t_att["escf"], v))
inner = cgi.escape(self.eval_format(t_att["escf"], v))
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_foreach(self, e, t_att, g_att, v):
expr = t_att["foreach"]
@ -234,7 +249,7 @@ class QWebXml(object):
d.update(i)
else:
d[var] = i
ru.append(self.render_element(e, g_att, d))
ru.append(self.render_element(e, t_att, g_att, d))
index += 1
return "".join(ru)
else:
@ -242,7 +257,7 @@ class QWebXml(object):
def render_tag_if(self, e, t_att, g_att, v):
if self.eval_bool(t_att["if"], v):
return self.render_element(e, g_att, v)
return self.render_element(e, t_att, g_att, v)
else:
return ""
@ -252,12 +267,14 @@ class QWebXml(object):
d = v
else:
d = v.copy()
d[0] = self.render_element(e, g_att, d)
d[0] = self.render_element(e, t_att, g_att, d)
return self.render(t_att["call"], d)
def render_tag_set(self, e, t_att, g_att, v):
if "eval" in t_att:
v[t_att["set"]] = self.eval_object(t_att["eval"], v)
else:
v[t_att["set"]] = self.render_element(e, g_att, v)
v[t_att["set"]] = self.render_element(e, t_att, g_att, v)
return ""
# leave this, al.