[fix] big fix related to domains and contexts defined in a model
authorniv-openerp <nicolas.vanhoren@openerp.com>
Thu, 14 Jul 2011 13:52:00 +0000 (15:52 +0200)
committerniv-openerp <nicolas.vanhoren@openerp.com>
Thu, 14 Jul 2011 13:52:00 +0000 (15:52 +0200)
bzr revid: nicolas.vanhoren@openerp.com-20110714135200-03e9ovknnz9lusni

addons/base/controllers/main.py
addons/base/static/src/js/form.js

index d6a8112..20419e0 100644 (file)
@@ -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
+        """
+        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
         """
-        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(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"
index e7edac4..523f47e 100644 (file)
@@ -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;
     }
 });