From 90bb70473e57c58a6d18e61e83bf823673e3c564 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 14 Jul 2011 15:52:00 +0200 Subject: [PATCH] [fix] big fix related to domains and contexts defined in a model bzr revid: nicolas.vanhoren@openerp.com-20110714135200-03e9ovknnz9lusni --- addons/base/controllers/main.py | 61 ++++++++++++++++++------------- addons/base/static/src/js/form.js | 14 ++++--- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index d6a81124c4d..20419e03d3e 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -573,6 +573,10 @@ class View(openerpweb.Controller): if field.has_key('views') and field['views']: for view in field["views"].values(): self.process_view(session, view, None, transform) + if field.get('domain'): + field["domain"] = self.parse_domain(field["domain"], session) + if field.get('context'): + field["context"] = self.parse_domain(field["context"], session) @openerpweb.jsonrequest def add_custom(self, request, view_id, arch): @@ -610,27 +614,38 @@ class View(openerpweb.Controller): self.parse_domains_and_contexts(elem, session) return root - def parse_domain(self, elem, attr_name, session): - """ Parses an attribute of the provided name as a domain, transforms it + def parse_domain(self, domain, session): + """ Parses an arbitrary string containing a domain, transforms it to either a literal domain or a :class:`openerpweb.nonliterals.Domain` - :param elem: the node being parsed - :type param: xml.etree.ElementTree.Element - :param str attr_name: the name of the attribute which should be parsed + :param domain: the domain to parse, if the domain is not a string it is assumed to + be a literal domain and is returned as-is :param session: Current OpenERP session :type session: openerpweb.openerpweb.OpenERPSession """ - domain = elem.get(attr_name, '').strip() - if domain: - try: - elem.set( - attr_name, - openerpweb.ast.literal_eval( - domain)) - except ValueError: - # not a literal - elem.set(attr_name, - openerpweb.nonliterals.Domain(session, domain)) + if not isinstance(domain, (str, unicode)): + return domain + try: + return openerpweb.ast.literal_eval(domain) + except ValueError: + # not a literal + return openerpweb.nonliterals.Domain(session, domain) + + def parse_context(self, context, session): + """ Parses an arbitrary string containing a context, transforms it + to either a literal context or a :class:`openerpweb.nonliterals.Context` + + :param context: the context to parse, if the context is not a string it is assumed to + be a literal domain and is returned as-is + :param session: Current OpenERP session + :type session: openerpweb.openerpweb.OpenERPSession + """ + if not isinstance(context, (str, unicode)): + return context + try: + return openerpweb.ast.literal_eval(context) + except ValueError: + return openerpweb.nonliterals.Context(session, context) def parse_domains_and_contexts(self, elem, session): """ Converts domains and contexts from the view into Python objects, @@ -643,18 +658,14 @@ class View(openerpweb.Controller): non-literal objects :type session: openerpweb.openerpweb.OpenERPSession """ - self.parse_domain(elem, 'domain', session) - self.parse_domain(elem, 'filter_domain', session) + for el in ['domain', 'filter_domain']: + domain = elem.get(el, '').strip() + if domain: + elem.set(el, self.parse_domain(domain, session)) for el in ['context', 'default_get']: context_string = elem.get(el, '').strip() if context_string: - try: - elem.set(el, - openerpweb.ast.literal_eval(context_string)) - except ValueError: - elem.set(el, - openerpweb.nonliterals.Context( - session, context_string)) + elem.set(el, self.parse_context(context_string, session)) class FormView(View): _cp_path = "/base/formview" diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index e7edac4aa6e..523f47e5f33 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -828,8 +828,10 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ * the fields'context with the action's context. */ build_context: function() { - var a_context = this.view.dataset.get_context() || {}; - var f_context = this.field.context || {}; + // I previously belevied contexts should be herrited, but now I doubt it + //var a_context = this.view.dataset.get_context() || {}; + var f_context = this.field.context || null; + // maybe the default_get should only be used when we do a default_get? var v_context1 = this.node.attrs.default_get || {}; var v_context2 = this.node.attrs.context || {}; var v_context = new openerp.base.CompoundContext(v_context1, v_context2); @@ -837,17 +839,19 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ var fields_values = this._build_view_fields_values(); v_context.set_eval_context(fields_values); } - var ctx = new openerp.base.CompoundContext(a_context, f_context, v_context); + // if there is a context on the node, overrides the model's context + var ctx = f_context || v_context; return ctx; }, build_domain: function() { - var f_domain = this.field.domain || []; + var f_domain = this.field.domain || null; var v_domain = this.node.attrs.domain || []; if (!(v_domain instanceof Array) || true) { //TODO niv: remove || true var fields_values = this._build_view_fields_values(); v_domain = new openerp.base.CompoundDomain(v_domain).set_eval_context(fields_values); } - return new openerp.base.CompoundDomain(f_domain, v_domain); + // if there is a domain on the node, overrides the model's domain + return f_domain || v_domain; } });