summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2011-03-23 13:08:06 +0100
committerXavier Morel <xmo@openerp.com>2011-03-23 13:08:06 +0100
commit801fae18ca92eecd9f6febcc15ec4f3ee0887cc4 (patch)
tree0cd3c7c0277164b8dfeee23f0839078b075f13b0
parent65c8aaf78b7e4cabbd3c2888c9e09e30297c748d (diff)
[ADD] implement forgotten DataSet.get RPC method, test it a bit
bzr revid: xmo@openerp.com-20110323120806-uhas8xvxnpsa1dm2
-rw-r--r--addons/base/controllers/main.py27
-rw-r--r--addons/base/static/openerp/js/base_views.js6
-rw-r--r--addons/base/tests/test_dataset.py39
3 files changed, 70 insertions, 2 deletions
diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py
index f5eda8020c5..723b0ae39dc 100644
--- a/addons/base/controllers/main.py
+++ b/addons/base/controllers/main.py
@@ -176,6 +176,9 @@ class DataSet(openerpweb.Controller):
domain, context, sort)
def do_find(self, request, model, fields=False, offset=0, limit=False,
domain=None, context=None, sort=None):
+ """ Performs a search() followed by a read() (if needed) using the
+ provided search criteria, only
+ """
Model = request.session.model(model)
ids = Model.search(domain or [], offset or 0, limit or False,
sort or False, context or False)
@@ -184,6 +187,30 @@ class DataSet(openerpweb.Controller):
return map(lambda id: {'id': id}, ids)
return Model.read(ids, fields or False)
+ @openerpweb.jsonrequest
+ def get(self, request, model, ids):
+ self.do_get(request, model, ids)
+
+ def do_get(self, request, model, ids):
+ """ Fetches and returns the records of the model ``model`` whose ids
+ are in ``ids``.
+
+ The results are in the same order as the inputs, but elements may be
+ missing (if there is no record left for the id)
+
+ :param request: the JSON-RPC2 request object
+ :type request: openerpweb.JsonRequest
+ :param model: the model to read from
+ :type model: str
+ :param ids: a list of identifiers
+ :type ids: list
+ """
+ Model = request.session.model(model)
+ records = Model.read(ids)
+
+ record_map = dict((record['id'], record) for record in records)
+
+ return [record_map[id] for id in ids if record_map.get(id)]
class DataRecord(openerpweb.Controller):
_cp_path = "/base/datarecord"
diff --git a/addons/base/static/openerp/js/base_views.js b/addons/base/static/openerp/js/base_views.js
index f86be31c89a..004d57fd13b 100644
--- a/addons/base/static/openerp/js/base_views.js
+++ b/addons/base/static/openerp/js/base_views.js
@@ -183,7 +183,8 @@ openerp.base.DataSet = openerp.base.Controller.extend({
*/
active_ids: function () {
this.rpc('/base/dataset/get', {
- ids: this.get_active_ids()
+ ids: this.get_active_ids(),
+ model: this.model
}, _.bind(function (records) {
this.on_active_ids(_.map(
records, function (record) {
@@ -210,7 +211,8 @@ openerp.base.DataSet = openerp.base.Controller.extend({
*/
active_id: function () {
this.rpc('/base/dataset/get', {
- ids: [this.get_active_id()]
+ ids: [this.get_active_id()],
+ model: this.model
}, _.bind(function (records) {
var record = records[0];
this.on_active_id(
diff --git a/addons/base/tests/test_dataset.py b/addons/base/tests/test_dataset.py
index c0cd8d7a465..80d1e52561b 100644
--- a/addons/base/tests/test_dataset.py
+++ b/addons/base/tests/test_dataset.py
@@ -35,3 +35,42 @@ class TestDataSetController(unittest2.TestCase):
self.dataset.do_find(self.request, 'fake.model', ['id']),
[{'id': 1}, {'id': 2}, {'id': 3}])
self.assertFalse(self.read.called)
+
+ def test_get(self):
+ self.read.return_value = [
+ {'id': 1, 'name': 'baz'},
+ {'id': 3, 'name': 'foo'},
+ {'id': 2, 'name': 'bar'}
+ ]
+
+ result = self.dataset.do_get(
+ self.request, 'fake.model', [3, 2, 1])
+ self.read.assert_called_once_with(
+ [3, 2, 1])
+ self.assertFalse(self.search.called)
+
+ self.assertEqual(
+ result,
+ [
+ {'id': 3, 'name': 'foo'},
+ {'id': 2, 'name': 'bar'},
+ {'id': 1, 'name': 'baz'}
+ ]
+ )
+
+ def test_get_missing_result(self):
+ self.read.return_value = [
+ {'id': 1, 'name': 'baz'},
+ {'id': 2, 'name': 'bar'}
+ ]
+
+ result = self.dataset.do_get(
+ self.request, 'fake.model', [3, 2, 1])
+
+ self.assertEqual(
+ result,
+ [
+ {'id': 2, 'name': 'bar'},
+ {'id': 1, 'name': 'baz'}
+ ]
+ )