[fix] big fix related to domains and contexts defined in a model
bzr revid: nicolas.vanhoren@openerp.com-20110714135200-03e9ovknnz9lusni
This commit is contained in:
parent
7416171ae1
commit
90bb70473e
|
@ -573,6 +573,10 @@ class View(openerpweb.Controller):
|
||||||
if field.has_key('views') and field['views']:
|
if field.has_key('views') and field['views']:
|
||||||
for view in field["views"].values():
|
for view in field["views"].values():
|
||||||
self.process_view(session, view, None, transform)
|
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
|
@openerpweb.jsonrequest
|
||||||
def add_custom(self, request, view_id, arch):
|
def add_custom(self, request, view_id, arch):
|
||||||
|
@ -610,27 +614,38 @@ class View(openerpweb.Controller):
|
||||||
self.parse_domains_and_contexts(elem, session)
|
self.parse_domains_and_contexts(elem, session)
|
||||||
return root
|
return root
|
||||||
|
|
||||||
def parse_domain(self, elem, attr_name, session):
|
def parse_domain(self, domain, session):
|
||||||
""" Parses an attribute of the provided name as a domain, transforms it
|
""" Parses an arbitrary string containing a domain, transforms it
|
||||||
to either a literal domain or a :class:`openerpweb.nonliterals.Domain`
|
to either a literal domain or a :class:`openerpweb.nonliterals.Domain`
|
||||||
|
|
||||||
:param elem: the node being parsed
|
:param domain: the domain to parse, if the domain is not a string it is assumed to
|
||||||
:type param: xml.etree.ElementTree.Element
|
be a literal domain and is returned as-is
|
||||||
:param str attr_name: the name of the attribute which should be parsed
|
|
||||||
:param session: Current OpenERP session
|
:param session: Current OpenERP session
|
||||||
:type session: openerpweb.openerpweb.OpenERPSession
|
:type session: openerpweb.openerpweb.OpenERPSession
|
||||||
"""
|
"""
|
||||||
domain = elem.get(attr_name, '').strip()
|
if not isinstance(domain, (str, unicode)):
|
||||||
if domain:
|
return domain
|
||||||
try:
|
try:
|
||||||
elem.set(
|
return openerpweb.ast.literal_eval(domain)
|
||||||
attr_name,
|
except ValueError:
|
||||||
openerpweb.ast.literal_eval(
|
# not a literal
|
||||||
domain))
|
return openerpweb.nonliterals.Domain(session, domain)
|
||||||
except ValueError:
|
|
||||||
# not a literal
|
def parse_context(self, context, session):
|
||||||
elem.set(attr_name,
|
""" Parses an arbitrary string containing a context, transforms it
|
||||||
openerpweb.nonliterals.Domain(session, domain))
|
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):
|
def parse_domains_and_contexts(self, elem, session):
|
||||||
""" Converts domains and contexts from the view into Python objects,
|
""" Converts domains and contexts from the view into Python objects,
|
||||||
|
@ -643,18 +658,14 @@ class View(openerpweb.Controller):
|
||||||
non-literal objects
|
non-literal objects
|
||||||
:type session: openerpweb.openerpweb.OpenERPSession
|
:type session: openerpweb.openerpweb.OpenERPSession
|
||||||
"""
|
"""
|
||||||
self.parse_domain(elem, 'domain', session)
|
for el in ['domain', 'filter_domain']:
|
||||||
self.parse_domain(elem, 'filter_domain', session)
|
domain = elem.get(el, '').strip()
|
||||||
|
if domain:
|
||||||
|
elem.set(el, self.parse_domain(domain, session))
|
||||||
for el in ['context', 'default_get']:
|
for el in ['context', 'default_get']:
|
||||||
context_string = elem.get(el, '').strip()
|
context_string = elem.get(el, '').strip()
|
||||||
if context_string:
|
if context_string:
|
||||||
try:
|
elem.set(el, self.parse_context(context_string, session))
|
||||||
elem.set(el,
|
|
||||||
openerpweb.ast.literal_eval(context_string))
|
|
||||||
except ValueError:
|
|
||||||
elem.set(el,
|
|
||||||
openerpweb.nonliterals.Context(
|
|
||||||
session, context_string))
|
|
||||||
|
|
||||||
class FormView(View):
|
class FormView(View):
|
||||||
_cp_path = "/base/formview"
|
_cp_path = "/base/formview"
|
||||||
|
|
|
@ -828,8 +828,10 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({
|
||||||
* the fields'context with the action's context.
|
* the fields'context with the action's context.
|
||||||
*/
|
*/
|
||||||
build_context: function() {
|
build_context: function() {
|
||||||
var a_context = this.view.dataset.get_context() || {};
|
// I previously belevied contexts should be herrited, but now I doubt it
|
||||||
var f_context = this.field.context || {};
|
//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_context1 = this.node.attrs.default_get || {};
|
||||||
var v_context2 = this.node.attrs.context || {};
|
var v_context2 = this.node.attrs.context || {};
|
||||||
var v_context = new openerp.base.CompoundContext(v_context1, v_context2);
|
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();
|
var fields_values = this._build_view_fields_values();
|
||||||
v_context.set_eval_context(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;
|
return ctx;
|
||||||
},
|
},
|
||||||
build_domain: function() {
|
build_domain: function() {
|
||||||
var f_domain = this.field.domain || [];
|
var f_domain = this.field.domain || null;
|
||||||
var v_domain = this.node.attrs.domain || [];
|
var v_domain = this.node.attrs.domain || [];
|
||||||
if (!(v_domain instanceof Array) || true) { //TODO niv: remove || true
|
if (!(v_domain instanceof Array) || true) { //TODO niv: remove || true
|
||||||
var fields_values = this._build_view_fields_values();
|
var fields_values = this._build_view_fields_values();
|
||||||
v_domain = new openerp.base.CompoundDomain(v_domain).set_eval_context(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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue