[IMP] change DataSet.read_slice to take an options object for optional fields, offset and limit args

bzr revid: xmo@openerp.com-20110811070050-pkz6x39tf0i4e49r
This commit is contained in:
Xavier Morel 2011-08-11 09:00:50 +02:00
parent 93a1fa9263
commit 13c75281b0
10 changed files with 59 additions and 49 deletions

View File

@ -270,12 +270,11 @@ openerp.base.DataSet = openerp.base.Widget.extend( /** @lends openerp.base.Data
* Read records.
*
* @param {Array} ids identifiers of the records to read
* @param {Array} [fields] fields to read and return, by default all fields are returned
* @param {Array} fields fields to read and return, by default all fields are returned
* @param {Function} callback function called with read result
* @returns {$.Deferred}
*/
read_ids: function (ids, fields, callback) {
var self = this;
return this.rpc('/base/dataset/get', {
model: this.model,
ids: ids,
@ -287,14 +286,14 @@ openerp.base.DataSet = openerp.base.Widget.extend( /** @lends openerp.base.Data
* Read a slice of the records represented by this DataSet, based on its
* domain and context.
*
* @param {Array} [fields] fields to read and return, by default all fields are returned
* @param {Number} [offset=0] The index from which selected records should be returned
* @param {Number} [limit=null] The maximum number of records to return
* @params {Object} options
* @param {Array} [options.fields] fields to read and return, by default all fields are returned
* @param {Number} [options.offset=0] The index from which selected records should be returned
* @param {Number} [options.limit=null] The maximum number of records to return
* @param {Function} callback function called with read_slice result
* @returns {$.Deferred}
*/
read_slice: function (fields, offset, limit, callback) {
},
read_slice: function (options, callback) { return null; },
/**
* Reads the current dataset record (from its index)
*
@ -476,9 +475,11 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({
// all local records
this.ids = ids || [];
},
read_slice: function (fields, offset, limit, callback) {
var self = this;
offset = offset || 0;
read_slice: function (options, callback) {
var self = this,
offset = options.offset || 0,
limit = options.limit || false,
fields = options.fields || false;
var end_pos = limit && limit !== -1 ? offset + limit : undefined;
return this.read_ids(this.ids.slice(offset, end_pos), fields, callback);
},
@ -515,25 +516,28 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({
// is it necessary ?
this.ids = [];
},
read_slice: function (fields, offset, limit, callback) {
/**
* Read a slice of the records represented by this DataSet, based on its
* domain and context.
*
* @params {Object} options
* @param {Array} [options.fields] fields to read and return, by default all fields are returned
* @param {Number} [options.offset=0] The index from which selected records should be returned
* @param {Number} [options.limit=null] The maximum number of records to return
* @param {Function} callback function called with read_slice result
* @returns {$.Deferred}
*/
read_slice: function (options, callback) {
var self = this;
offset = offset || 0;
// cached search, not sure it's a good idea
if(this.offset <= offset) {
var start = offset - this.offset;
if(this.ids.length - start >= limit) {
// TODO: check if this could work do only read if possible
// return read_ids(ids.slice(start,start+limit),fields,callback)
}
}
var offset = options.offset || 0;
return this.rpc('/base/dataset/search_read', {
model: this.model,
fields: fields,
fields: options.fields || false,
domain: this.domain,
context: this.get_context(),
sort: this.sort(),
offset: offset,
limit: limit
limit: options.limit || false
}, function (result) {
self.ids = result.ids;
self.offset = offset;

View File

@ -451,12 +451,14 @@ openerp.base.form.SidebarAttachments = openerp.base.Widget.extend({
this.on_attachments_loaded([]);
} else {
(new openerp.base.DataSetSearch(
this, 'ir.attachment', this.view.dataset.get_context(),
[['res_model', '=', this.view.dataset.model],
['res_id', '=', this.view.datarecord.id],
['type', 'in', ['binary', 'url']]])).read_slice(
['name', 'url', 'type'], false, false,
this.on_attachments_loaded);
this, 'ir.attachment', this.view.dataset.get_context(),
[
['res_model', '=', this.view.dataset.model],
['res_id', '=', this.view.datarecord.id],
['type', 'in', ['binary', 'url']]
])).read_slice(
{fields: ['name', 'url', 'type']},
this.on_attachments_loaded);
}
},
on_attachments_loaded: function(attachments) {

View File

@ -478,7 +478,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi
_.extend(this.dataset, {
domain: dataset.domain,
context: dataset.get_context()
}).read_slice([], 0, false, function () {
}).read_slice({}, function () {
self.select_record(index);
});
},
@ -1033,10 +1033,11 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas
d = new $.Deferred(),
page = this.datagroup.openable ? this.page : view.page;
dataset.read_slice(
_.filter(_.pluck(_.select(this.columns, function(x) {return x.tag == "field";}), 'name'), _.identity),
page * limit, limit,
function (records) {
dataset.read_slice({
fields: _.filter(_.pluck(_.select(this.columns, function(x) {return x.tag == "field";}), 'name'), _.identity),
offset: page * limit,
limit: limit
}, function (records) {
if (!self.datagroup.openable) {
view.configure_pager(dataset);
} else {

View File

@ -72,7 +72,7 @@ openerp.base.TreeView = openerp.base.View.extend({
'toolbar': has_toolbar
}));
this.dataset.read_slice(this.fields_list(), 0, false, function (records) {
this.dataset.read_slice({fields: this.fields_list()}, function (records) {
if (!has_toolbar) {
// WARNING: will do a second read on the same ids, but only on
// first load so not very important

View File

@ -131,7 +131,7 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({
},
load_scheduler: function() {
var self = this;
this.dataset.read_slice([], 0, false, function(events) {
this.dataset.read_slice({}, function(events) {
if (self.session.locale_code) {
// TODO: replace $LAB
$LAB.setOptions({AlwaysPreserveOrder: true}).script([
@ -340,7 +340,11 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({
// TODO: handle non-empty results.group_by with read_group
self.dataset.context = self.context = results.context;
self.dataset.domain = self.domain = results.domain;
self.dataset.read_slice(_.keys(self.fields), 0, self.limit, self.on_events_loaded);
self.dataset.read_slice({
fields: _.keys(self.fields),
offset:0,
limit: self.limit
}, self.on_events_loaded);
});
});
},

View File

@ -290,7 +290,7 @@ openerp.base_dashboard.ConfigOverview = openerp.base.View.extend({
this.dataset.domain = [['type', '=', 'manual']];
},
start: function () {
$.when(this.dataset.read_slice(['state', 'action_id', 'category_id']),
$.when(this.dataset.read_slice({fields: ['state', 'action_id', 'category_id']}),
this.dataset.call('progress'))
.then(this.on_records_loaded);
},
@ -353,8 +353,8 @@ openerp.base_dashboard.ApplicationTiles = openerp.base.View.extend({
start: function () {
var self = this;
this.dataset.read_slice(
['name', 'web_icon_data', 'web_icon_hover_data'],
null, null, function (applications) {
{fields: ['name', 'web_icon_data', 'web_icon_hover_data']},
function (applications) {
// Create a matrix of 3*x applications
var rows = [];
while (applications.length) {
@ -384,7 +384,8 @@ openerp.base_dashboard.Widgets = openerp.base.View.extend({
this.widgets = new openerp.base.DataSetSearch(this, 'res.widget');
},
start: function () {
this.user_widgets.read_slice(['widget_id', 'user_id'], null, null,
this.user_widgets.read_slice(
{fields: ['widget_id', 'user_id']},
this.on_widgets_list_loaded);
},
on_widgets_list_loaded: function (user_widgets) {

View File

@ -86,7 +86,7 @@ openerp.base_default_home = function (openerp) {
$.blockUI({
message: '<img src="/base_default_home/static/src/img/throbber.gif">'
});
Modules.read_slice(['id'], null, null, function (records) {
Modules.read_slice({fields: ['id']}, function (records) {
if (!(records.length === 1)) { return; }
Modules.call('state_update',
[_.pluck(records, 'id'), 'to install', ['uninstalled']],

View File

@ -81,7 +81,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
get_events: function() {
var self = this;
this.dataset.read_slice(false, false, false, function(result) {
this.dataset.read_slice({}, function(result) {
self.load_event(result);
});
@ -460,7 +460,7 @@ init: function(view_manager, session, element_id, dataset, view_id) {
reload_gantt: function() {
var self = this;
this.dataset.read_slice(false, false, false, function(response) {
this.dataset.read_slice({}, function(response) {
ganttChartControl.clearAll();
jQuery("#GanttDiv").children().remove();
self.load_event(response);

View File

@ -89,7 +89,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({
}
this.dataset.domain = domain;
this.dataset.context = this.view_manager.dataset.context;
this.dataset.read_slice(_(this.fields).keys(), 0, false, function(res) {
this.dataset.read_slice({fields: _(this.fields).keys()}, function(res) {
self.schedule_chart(res);
});
}
@ -468,9 +468,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({
}
self.dataset.context = results.context;
self.dataset.domain = results.domain;
self.dataset.read_slice([], 0, false,function(response){
self.load_chart(response);
});
self.dataset.read_slice({}, $.proxy(self, 'load_chart'));
});
}
});

View File

@ -12,7 +12,7 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({
view_id = this.action.views[1][0];
this.dataset = new openerp.base.DataSetSearch(this.session, this.action.res_model, null, null);
this.dataset.read_slice(false, false, false, function (result) {
this.dataset.read_slice({}, function (result) {
for (var i = 0; i < result.length; i++) {
if (result[i].id == id) {
@ -101,4 +101,4 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({
},
});
}
}