[IMP] implement DataSet.find, rename .ids() to .fetch() (and the corresponding event), make list and form views use the new dataset API

bzr revid: xmo@openerp.com-20110323083441-ego3wphgpb94obrg
This commit is contained in:
Xavier Morel 2011-03-23 09:34:41 +01:00
parent 1284858cb1
commit 3d65a024d2
4 changed files with 37 additions and 48 deletions

View File

@ -170,11 +170,15 @@ class DataSet(openerpweb.Controller):
return {'fields': req.session.model(model).fields_get()}
@openerpweb.jsonrequest
def load(self, req, model, domain=[], fields=['id']):
m = req.session.model(model)
ids = m.search(domain)
values = m.read(ids, fields)
return {'ids': ids, 'values': values}
def find(self, request, model, fields=False, offset=0, limit=False,
domain=None, context=None, sort=None):
Model = request.session.model(model)
ids = Model.search(domain or [], offset or 0, limit or False,
sort or False, context or False)
if fields and fields == ['id']:
# shortcut read if we only want the ids
return map(lambda id: {'id': id}, ids)
return Model.read(ids, fields or False)
class DataRecord(openerpweb.Controller):

View File

@ -348,7 +348,6 @@
<input id="mode_list" type="button" value="ListView"/>
<input id="mode_form" type="button" value="FormView"/>
</div>
<div id="oe_action_dataset" style="display:none;"></div>
<div id="oe_action_search" ></div>
<div id="oe_action_list" ></div>
<div id="oe_action_form" ></div>

View File

@ -44,7 +44,7 @@ openerp.base.Action = openerp.base.Controller.extend({
},
do_action_window: function(action) {
this.formview_id = false;
this.dataset = new openerp.base.DataSet(this.session, "oe_action_dataset", action.res_model);
this.dataset = new openerp.base.DataSet(this.session, action.res_model);
this.dataset.start();
// Locate first tree view
@ -101,7 +101,7 @@ openerp.base.EmbbededView = openerp.base.Controller.extend({
openerp.base.DataSet = openerp.base.Controller.extend({
init: function(session, model) {
this._super(session);
this._model = model;
this.model = model;
this._fields = null;
@ -115,7 +115,7 @@ openerp.base.DataSet = openerp.base.Controller.extend({
},
start: function() {
// TODO: fields_view_get fields selection?
this.rpc("/base/dataset/fields", {"model":this._model}, this.on_fields);
this.rpc("/base/dataset/fields", {"model":this.model}, this.on_fields);
},
on_fields: function(result) {
this._fields = result._fields;
@ -132,11 +132,11 @@ openerp.base.DataSet = openerp.base.Controller.extend({
* @param {Number} [limit=null] The maximum number of records to return
* @returns itself
*/
ids: function (offset, limit) {
fetch: function (offset, limit) {
offset = offset || 0;
limit = limit || null;
this.rpc('/base/dataset/find', {
model: this._model,
model: this.model,
fields: this._fields,
domain: this._domain,
context: this._context,
@ -147,11 +147,11 @@ openerp.base.DataSet = openerp.base.Controller.extend({
var data_records = _.map(
records, function (record) {
return new openerp.base.DataRecord(
this.session, this._model,
this.session, this.model,
this._fields, record);
}, this);
this.on_ids(data_records, {
this.on_fetch(data_records, {
offset: offset,
limit: limit,
domain: this._domain,
@ -174,7 +174,7 @@ openerp.base.DataSet = openerp.base.Controller.extend({
* @param {Object} event.context the context set on the DataSet before DataSet#ids was called
* @param {Array} event.sort the sorting criteria used to get the ids
*/
on_ids: function (records, event) { },
on_fetch: function (records, event) { },
/**
* Fetch all the currently active records for this DataSet (records selected via DataSet#select)
@ -188,7 +188,7 @@ openerp.base.DataSet = openerp.base.Controller.extend({
this.on_active_ids(_.map(
records, function (record) {
return new openerp.base.DataRecord(
this.session, this._model,
this.session, this.model,
this._fields, record);
}, this));
}, this));
@ -215,7 +215,7 @@ openerp.base.DataSet = openerp.base.Controller.extend({
var record = records[0];
this.on_active_id(
record && new openerp.base.DataRecord(
this.session, this._model,
this.session, this.model,
this._fields, record));
}, this));
return this;
@ -398,7 +398,7 @@ openerp.base.SearchView = openerp.base.Controller.extend({
// collect all non disabled domains definitions, AND them
// evaluate as python expression
// save the result in this.domain
this.dataset.do_load();
this.dataset.fetch();
},
on_clear: function() {
}
@ -422,7 +422,6 @@ openerp.base.FormView = openerp.base.Controller.extend({
init: function(session, element_id, dataset, view_id) {
this._super(session, element_id);
this.dataset = dataset;
this.dataset_index = 0;
this.model = dataset.model;
this.view_id = view_id;
this.fields_views = {};
@ -447,22 +446,11 @@ openerp.base.FormView = openerp.base.Controller.extend({
}
// bind to all wdigets that have onchange ??
// When the dataset is loaded load the first record (like gtk)
this.dataset.on_loaded.add_last(this.do_load_record);
// When a datarecord is loaded display the values in the inputs
this.datarecord = new openerp.base.DataRecord(this.session, this.model,{});
this.datarecord.on_loaded.add_last(this.on_record_loaded);
this.dataset.on_fetch.add(this.on_record_loaded);
},
do_load_record: function() {
// if dataset is empty display the empty datarecord
if(this.dataset.ids.length == 0) {
this.on_record_loaded();
}
this.datarecord.load(this.dataset.ids[this.dataset_index]);
},
on_record_loaded: function() {
on_record_loaded: function(records) {
this.datarecord = records[0];
console.log('record', this.datarecord);
for (var f in this.fields) {
this.fields[f].set_value(this.datarecord.values[f]);
}
@ -508,20 +496,18 @@ openerp.base.ListView = openerp.base.Controller.extend({
this.colmodel.push({ name: col.attrs.name, index: col.attrs.name });
}
}
//this.log(this.cols);
this.dataset.fields = this.cols;
this.dataset.on_loaded.add_last(this.do_fill_table);
this.dataset.on_fetch.add(this.do_fill_table);
},
do_fill_table: function() {
//this.log("do_fill_table");
do_fill_table: function(records) {
this.log("do_fill_table");
var self = this;
//this.log(this.dataset.data);
var rows = [];
var ids = this.dataset.ids;
for(var i = 0; i < ids.length; i++) {
for(var i = 0; i < records.length; i++) {
// TODO very strange is sometimes non existing ? even as admin ? example ir.ui.menu
var row = this.dataset.values[ids[i]];
var row = records[i].values;
if(row)
rows.push(row);
// else

View File

@ -158,7 +158,7 @@ $(document).ready(function () {
asyncTest("Baseline event attributes", 6, function () {
var dataset = new openerp.base.DataSet(
new Session());
dataset.on_ids.add(function (records, event) {
dataset.on_fetch.add(function (records, event) {
deepEqual(records, [], 'No records returned');
equal(event.offset, 0, 'No offset set in call');
equal(event.limit, null, 'No limit set in call');
@ -167,17 +167,17 @@ $(document).ready(function () {
deepEqual(event.sort, [], 'The dataset is not sorted');
start();
});
dataset.ids();
dataset.fetch();
});
asyncTest("Offset and limit", 2, function () {
var dataset = new openerp.base.DataSet(
new Session());
dataset.on_ids.add(function (records, event) {
dataset.on_fetch.add(function (records, event) {
equal(event.offset, 20);
equal(event.limit, 42);
start();
});
dataset.ids(20, 42);
dataset.fetch(20, 42);
});
asyncTest("Domain and context propagation", 3, function () {
var dataset = new openerp.base.DataSet(
@ -185,7 +185,7 @@ $(document).ready(function () {
var domain_value = [['foo', '=', 'bar']];
var context_value= {active_id:3, active_ids:42};
var sort_value = ['foo'];
dataset.on_ids.add(function (records, event) {
dataset.on_fetch.add(function (records, event) {
deepEqual(event.domain, domain_value);
deepEqual(event.context, context_value);
deepEqual(event.sort, sort_value);
@ -196,7 +196,7 @@ $(document).ready(function () {
context: context_value,
sort: sort_value
});
dataset.ids();
dataset.fetch();
});
asyncTest("Data records", function () {
var dataset = new openerp.base.DataSet({
@ -208,7 +208,7 @@ $(document).ready(function () {
]);
}
});
dataset.on_ids.add(function (records) {
dataset.on_fetch.add(function (records) {
equal(records.length, 2, "I loaded two virtual records");
var d1 = records[0],
d2 = records[1];
@ -216,7 +216,7 @@ $(document).ready(function () {
ok(d2 instanceof openerp.base.DataRecord);
start();
});
dataset.ids();
dataset.fetch();
});
var dataset;