[CNG] make forms worse but pagination not break in case of manyrecords
authorXavier Morel <xmo@openerp.com>
Thu, 9 Feb 2012 17:07:48 +0000 (18:07 +0100)
committerXavier Morel <xmo@openerp.com>
Thu, 9 Feb 2012 17:07:48 +0000 (18:07 +0100)
bzr revid: xmo@openerp.com-20120209170748-l70q7grxgsumha2i

addons/web/controllers/main.py
addons/web/static/src/js/data.js
addons/web/static/src/js/view_list.js

index 151d572..d4ad330 100644 (file)
@@ -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
         }
 
index 01962f8..b4a2029 100644 (file)
@@ -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({
index 7fd4d20..eb13bbd 100644 (file)
@@ -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"), {