diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 151d572c987..d4ad330463a 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -787,21 +787,24 @@ class DataSet(openerpweb.Controller): context, domain = eval_context_and_domain( req.session, req.context, domain) - ids = Model.search(domain, 0, False, sort or False, context) - # need to fill the dataset with all ids for the (domain, context) pair, - # so search un-paginated and paginate manually before reading - paginated_ids = ids[offset:(offset + limit if limit else None)] + ids = Model.search(domain, offset or 0, limit or False, sort or False, context) + if limit and len(ids) == limit: + length = Model.search_count(domain, context) + else: + length = len(ids) + (offset or 0) if fields and fields == ['id']: # shortcut read if we only want the ids return { 'ids': ids, - 'records': [{'id': id} for id in paginated_ids] + 'length': length, + 'records': [{'id': id} for id in ids] } - records = Model.read(paginated_ids, fields or False, context) + records = Model.read(ids, fields or False, context) records.sort(key=lambda obj: ids.index(obj['id'])) return { 'ids': ids, + 'length': length, 'records': records } diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index 01962f829e6..b4a202973dd 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -522,6 +522,9 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data this._sort.unshift((reverse ? '-' : '') + field); return undefined; + }, + size: function () { + return this.ids.length; } }); openerp.web.DataSetStatic = openerp.web.DataSet.extend({ @@ -568,6 +571,7 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D this._super(parent, model, context); this.domain = domain || []; this.offset = 0; + this._length; // subset records[offset:offset+limit] // is it necessary ? this.ids = []; @@ -599,6 +603,7 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D }).pipe(function (result) { self.ids = result.ids; self.offset = offset; + self._length = result.length; return result.records; }); }, @@ -619,6 +624,12 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D if (callback) callback(result); }, error_callback); + }, + size: function () { + if (this._length !== undefined) { + return this._length; + } + return this._super(); } }); openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({ diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 7fd4d20fba5..eb13bbd927b 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -246,7 +246,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# self.page = 0; break; case 'last': self.page = Math.floor( - self.dataset.ids.length / self.limit()); + self.dataset.size() / self.limit()); break; case 'next': self.page += 1; break; @@ -293,7 +293,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# this.dataset.ids = dataset.ids; var limit = this.limit(), - total = dataset.ids.length, + total = dataset.size(), first = (this.page * limit), last; if (!limit || (total - first) < limit) { @@ -1317,11 +1317,11 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L if (!self.datagroup.openable) { view.configure_pager(dataset); } else { - if (dataset.ids.length == records.length) { + if (dataset.size() == records.length) { // only one page self.$row.find('td.oe-group-pagination').empty(); } else { - var pages = Math.ceil(dataset.ids.length / limit); + var pages = Math.ceil(dataset.size() / limit); self.$row .find('.oe-pager-state') .text(_.str.sprintf(_t("%(page)d/%(page_count)d"), {