From 3d65a024d2cce9cd9dd8258a36f18bea7a4d8aea Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 23 Mar 2011 09:34:41 +0100 Subject: [PATCH] [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 --- addons/base/controllers/main.py | 14 ++++-- addons/base/static/openerp/base.xml | 1 - addons/base/static/openerp/js/base_views.js | 54 ++++++++------------- addons/base/static/openerp/js/tests.js | 16 +++--- 4 files changed, 37 insertions(+), 48 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 185f2d18bca..f976f809a44 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -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): diff --git a/addons/base/static/openerp/base.xml b/addons/base/static/openerp/base.xml index 40edce66c3e..c416d9cf093 100644 --- a/addons/base/static/openerp/base.xml +++ b/addons/base/static/openerp/base.xml @@ -348,7 +348,6 @@ -
diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js index e24b5835d44..de42b5470bb 100644 --- a/addons/base/static/openerp/js/base_views.js +++ b/addons/base/static/openerp/js/base_views.js @@ -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 diff --git a/addons/base/static/openerp/js/tests.js b/addons/base/static/openerp/js/tests.js index 596eb134031..39c8f213fe6 100644 --- a/addons/base/static/openerp/js/tests.js +++ b/addons/base/static/openerp/js/tests.js @@ -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;