[Checkins] SVN: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/ Pagination added.

Charlie Clark charlie at begeistert.org
Mon Aug 10 11:09:13 EDT 2009


Log message for revision 102629:
  Pagination added.

Changed:
  U   Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py
  A   Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/templates/pagingation_widgets.pt
  U   Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/tests/test_new_folder.py

-=-
Modified: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py
===================================================================
--- Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py	2009-08-10 14:48:55 UTC (rev 102628)
+++ Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/new_folder.py	2009-08-10 15:09:13 UTC (rev 102629)
@@ -178,7 +178,37 @@
             title = _(u'Next ${count} items', mapping={'count': length})
         return {'title': title, 'url': url}
 
+    def page_range(self):
+        """Create a range of up to ten pages around the current page"""
+        url = self._getViewURL()
+        batch_query = '%s?b_start:int=%s'
+        pages = [(idx + 1, b_start) for idx, b_start in enumerate(
+                    range(0, 
+                        self._getBatchObj().sequence_length, 
+                        self._BATCH_SIZE)
+                    )
+                ]
+        range_start = max(self.current_page() - 5, 0)
+        range_stop = min(max(self.current_page() + 5, 10), len(pages))
+        page_range = []
+        for page, b_start in pages[range_start:range_stop]:
+            page_range.append({'number':page, 
+            'url':batch_query % (url, b_start)})
+        return page_range
+
     @memoize
+    def page_count(self):
+        """Count total number of pages in the batch"""
+        batch_obj = self._getBatchObj()
+        count = (batch_obj.sequence_length - 1) / self._BATCH_SIZE + 1
+        return count or 1
+
+    @memoize
+    def current_page(self):
+        """Get the number of the current page in the batch"""
+        return self._getBatchStart() / (self._BATCH_SIZE + 1)
+
+    @memoize
     def summary_length(self):
         length = self._getBatchObj().sequence_length
         return length and thousands_commas(length) or ''

Added: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/templates/pagingation_widgets.pt
===================================================================
--- Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/templates/pagingation_widgets.pt	                        (rev 0)
+++ Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/templates/pagingation_widgets.pt	2009-08-10 15:09:13 UTC (rev 102629)
@@ -0,0 +1,18 @@
+<metal:macro metal:define-macro="pagination"
+  tal:define="current_page view/current_page_number">
+	<a href="" 
+	   tal:condition="python: current_page != 1"
+		 tal:attributes="href view/navigation_previous/url">&lt;&lt;</a>
+	<tal:repeat repeat="page view/getPages">
+		<a tal:condition="python: not page['number'] == current_page" 
+		  tal:attributes="href page/url"
+		  tal:content="page/number">Page number</a>
+	  <span tal:condition="python: page['number'] == current_page"
+	        tal:content="page/number">Page number</span>
+		<tal:condition condition="not: repeat/page/end">|</tal:condition> 
+	</tal:repeat>
+	
+	<a href="" 
+	   tal:condition="python: current_page != view/page_count()" 
+	   tal:attributes="href view/navigation_next/url">&gt;&gt;</a>
+</metal>
\ No newline at end of file

Modified: Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/tests/test_new_folder.py
===================================================================
--- Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/tests/test_new_folder.py	2009-08-10 14:48:55 UTC (rev 102628)
+++ Products.CMFDefault/branches/charlie_formlib_for_folders/Products/CMFDefault/browser/tests/test_new_folder.py	2009-08-10 15:09:13 UTC (rev 102629)
@@ -141,6 +141,27 @@
         self.assertEquals(view.navigation_previous()['title'], 
                             "Previous ${count} items")
         self.failIf(view.navigation_next())
+        
+    def test_page_count(self):
+        """Check batch page count"""
+        self._make_batch()
+        request = TestRequest(ACTUAL_URL='http://foo.com/bar')
+        view = ContentsView(self.folder, request)
+        self.assertEquals(view.page_count(), 2)
+        
+    def test_page_range(self):
+        """Check page range by starting on page fifteen.
+        The page range should then be 10 to 19"""
+        batch_size = ContentsView._BATCH_SIZE
+        for i in range(batch_size * 20):
+            content_id = "Dummy%s" % i
+            self._make_one(content_id)
+        request = TestRequest(ACTUAL_URL='http://foo.com/bar')
+        request.form = {'b_start':batch_size * 15}
+        view = ContentsView(self.folder, request)
+        self.assertEquals(view.page_range()[0]['number'], 10)
+        self.assertEquals(view.page_range()[-1]['number'], 19)
+        
 
 def test_suite():
     suite = unittest.TestSuite()



More information about the Checkins mailing list