[imp] refactored dataset to use get_context()

added parenting in o2m & form view
modified on_change to raise an exception when it can't resolve correctly one of the arguments

bzr revid: nicolas.vanhoren@openerp.com-20110629143506-8kr93moo0dug9u6m
This commit is contained in:
niv-openerp 2011-06-29 16:35:06 +02:00
parent 00cf247377
commit 42a474d8ee
2 changed files with 58 additions and 26 deletions

View File

@ -259,7 +259,8 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
return this.rpc('/base/dataset/get', {
model: this.model,
ids: ids,
fields: fields
fields: fields,
context: this.get_context()
}, callback);
},
/**
@ -288,14 +289,14 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
return this.rpc('/base/dataset/default_get', {
model: this.model,
fields: fields,
context: this.context
context: this.get_context()
}, callback);
},
create: function(data, callback, error_callback) {
return this.rpc('/base/dataset/create', {
model: this.model,
data: data,
context: this.context
context: this.get_context()
}, callback, error_callback);
},
write: function (id, data, callback) {
@ -303,12 +304,12 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
model: this.model,
id: id,
data: data,
context: this.context
context: this.get_context()
}, callback);
},
unlink: function(ids, callback, error_callback) {
var self = this;
return this.call_and_eval("unlink", [ids, this.context], null, 1,
return this.call_and_eval("unlink", [ids, this.get_context()], null, 1,
callback, error_callback);
},
call: function (method, args, callback, error_callback) {
@ -337,18 +338,18 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
}, callback, error_callback);
},
name_get: function(ids, callback) {
return this.call_and_eval('name_get', [ids, this.context], null, 1, callback);
return this.call_and_eval('name_get', [ids, this.get_context()], null, 1, callback);
},
/*
* args = domain
*/
name_search: function (name, args, operator, limit, callback) {
return this.call_and_eval('name_search',
[name || '', args || false, operator || 'ilike', this.context, limit || 100],
[name || '', args || false, operator || 'ilike', this.get_context(), limit || 100],
1, 3, callback);
},
name_create: function(name, callback) {
return this.call_and_eval('name_create', [name, this.context], null, 1, callback);
return this.call_and_eval('name_create', [name, this.get_context()], null, 1, callback);
},
exec_workflow: function (id, signal, callback) {
return this.rpc('/base/dataset/exec_workflow', {
@ -356,6 +357,9 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base.
id: id,
signal: signal
}, callback);
},
get_context: function() {
return this.context;
}
});
@ -413,7 +417,7 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({
model: this.model,
fields: fields,
domain: this.domain,
context: this.context,
context: this.get_context(),
sort: this.sort(),
offset: offset,
limit: limit

View File

@ -174,17 +174,32 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
'True' : true,
'None' : null
}
var parent_fields = null;
_.each(call[2].split(','), function(a) {
var field = _.trim(a);
if (field in argument_replacement) {
args.push(argument_replacement[field]);
return;
} else if (self.fields[field]) {
var value = self.fields[field].get_value();
args.push(value == null ? false : value);
return;
} else {
args.push(false);
self.log("warning : on_change can't find field " + field, onchange);
debugger;
var splitted = field.split('.');
if (splitted.length > 1 && _.trim(splitted[0]) === "parent" && self.dataset.parent_view) {
if (parent_fields === null) {
parent_fields = self.dataset.parent_view.get_fields_values();
}
var p_val = parent_fields[_.trim(splitted[1])];
if (p_val !== undefined) {
args.push(value ? value : false);
return;
}
}
}
throw "Could not get field with name '" + field +
"' for onchange '" + onchange + "'";
});
var ajax = {
url: '/base/dataset/call',
@ -1083,28 +1098,26 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({
});
})();
var build_view_fields_values = function(view) {
var a_dataset = view.dataset || {};
var fields_values = view.get_fields_values();
var parent_values = a_dataset.parent_view ? a_dataset.parent_view.get_fields_values() : {};
fields_values.parent = parent_values;
return fields_values;
}
/**
* Builds a new context usable for operations related to fields by merging
* the fields'context with the action's context.
*/
var build_relation_context = function(relation_field) {
var a_context = relation_field.view.dataset.context || {};
var fields_values = relation_field.view.get_fields_values();
var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {};
parent_values = _.clone(parent_values);
delete parent_values.parent;
fields_values.parent = parent_values;
var a_context = relation_field.view.dataset.get_context() || {};
var fields_values = build_view_fields_values(relation_field.view);
var f_context = new openerp.base.CompoundContext(relation_field.field.context || {}).set_eval_context(fields_values);
var ctx = new openerp.base.CompoundContext(a_context, f_context);
return ctx;
}
var build_relation_domain = function(relation_field) {
var a_context = relation_field.view.dataset.context || {};
var fields_values = relation_field.view.get_fields_values();
var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {};
parent_values = _.clone(parent_values);
delete parent_values.parent;
fields_values.parent = parent_values;
var fields_values = build_view_fields_values(relation_field.view);
var f_domain = new openerp.base.CompoundDomain(relation_field.field.domain || []).set_eval_context(fields_values);
return f_domain;
}
@ -1404,7 +1417,9 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
var self = this;
this.dataset = new openerp.base.BufferedDataSet(this.session, this.field.relation);
this.dataset = new openerp.base.form.One2ManyDataSet(this.session, this.field.relation);
this.dataset.o2m = this;
this.dataset.parent_view = this.view;
this.dataset.on_change.add_last(function() {
self.on_ui_change();
});
@ -1491,6 +1506,8 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
},
get_value: function() {
var self = this;
if (!this.dataset)
return [];
var val = _.map(this.dataset.ids, function(id) {
var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;});
if (alter_order) {
@ -1512,6 +1529,13 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({
}
});
openerp.base.form.One2ManyDataSet = openerp.base.BufferedDataSet.extend({
get_context: function() {
this.context = build_relation_context(this.o2m);
return this.context;
}
});
openerp.base.form.One2ManyListView = openerp.base.ListView.extend({
do_add_record: function () {
var self = this;
@ -1519,8 +1543,9 @@ openerp.base.form.One2ManyListView = openerp.base.ListView.extend({
pop.select_element(self.o2m.field.relation,{
initial_view: "form",
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
auto_create: false
});
auto_create: false,
parent_view: self.o2m.view
}, build_relation_domain(self.o2m), build_relation_context(self.o2m));
pop.on_create.add(function(data) {
self.o2m.dataset.create(data, function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
@ -1616,6 +1641,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
* - disable_multiple_selection
* - alternative_form_view
* - auto_create (default true)
* - parent_view
*/
select_element: function(model, options, domain, context) {
this.model = model;
@ -1632,6 +1658,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
this._super();
this.dataset = new openerp.base.ReadOnlyDataSetSearch(this.session, this.model,
this.context, this.domain);
this.dataset.parent_view = this.options.parent_view;
if (this.options.initial_view == "search") {
this.setup_search_view();
} else { // "form"
@ -1687,6 +1714,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
return;
var self = this;
var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain);
wdataset = this.options.parent_view;
wdataset.create(data, function(r) {
self.on_select_elements([r.result]);
});