fix rng validation, fields_view_get, qweb t-esc t-raw default
bzr revid: al@openerp.com-20130630213515-go5qr2dmo0xlazvr
This commit is contained in:
parent
54a41790a0
commit
05c9b607f8
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue