diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py index bf80a489f23..0fa42f0c2b0 100644 --- a/openerp/addons/base/ir/ir_ui_view.py +++ b/openerp/addons/base/ir/ir_ui_view.py @@ -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 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 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'{1}'.format(name, arch) + arch = '%s' % (name.encode('utf-8'), arch) return arch engine = qweb.QWebXml(loader) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 51d49950aa5..6073104ed4e 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -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: diff --git a/openerp/tools/qweb.py b/openerp/tools/qweb.py index a1ee2feae2e..fa35476a5fe 100644 --- a/openerp/tools/qweb.py +++ b/openerp/tools/qweb.py @@ -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" % (name, g_att, pre, inner, name) + elif len(inner) or name in ['script','i']: + # script should be rendered as + return "<%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.