changeset 1098:91ddd4db4614 beta

Added dedicated repo pager to support reversed new way slicing method of vcs and get_changesets method
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 27 Feb 2011 01:57:17 +0100
parents ecf255351311
children bc3dafd0e24c
files rhodecode/controllers/changelog.py rhodecode/controllers/shortlog.py rhodecode/controllers/summary.py rhodecode/lib/helpers.py
diffstat 4 files changed, 96 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/changelog.py	Sun Feb 27 00:38:28 2011 +0100
+++ b/rhodecode/controllers/changelog.py	Sun Feb 27 01:57:17 2011 +0100
@@ -38,8 +38,7 @@
 
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 from rhodecode.lib.base import BaseRepoController, render
-
-from webhelpers.paginate import Page
+from rhodecode.lib.helpers import RepoPage
 
 log = logging.getLogger(__name__)
 
@@ -68,7 +67,7 @@
 
         p = int(request.params.get('page', 1))
         c.total_cs = len(c.rhodecode_repo)
-        c.pagination = Page(c.rhodecode_repo, page=p, item_count=c.total_cs,
+        c.pagination = RepoPage(c.rhodecode_repo, page=p, item_count=c.total_cs,
                             items_per_page=c.size)
 
         self._graph(c.rhodecode_repo, c.size, p)
--- a/rhodecode/controllers/shortlog.py	Sun Feb 27 00:38:28 2011 +0100
+++ b/rhodecode/controllers/shortlog.py	Sun Feb 27 01:57:17 2011 +0100
@@ -29,13 +29,15 @@
 
 from pylons import tmpl_context as c, request
 
-from webhelpers.paginate import Page
-
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 from rhodecode.lib.base import BaseRepoController, render
+from rhodecode.lib.helpers import RepoPage
 
 log = logging.getLogger(__name__)
 
+
+
+
 class ShortlogController(BaseRepoController):
 
     @LoginRequired()
@@ -46,7 +48,7 @@
 
     def index(self):
         p = int(request.params.get('page', 1))
-        c.repo_changesets = Page(c.rhodecode_repo, page=p, items_per_page=20)
+        c.repo_changesets = RepoPage(c.rhodecode_repo, page=p, items_per_page=20)
         c.shortlog_data = render('shortlog/shortlog_data.html')
         if request.params.get('partial'):
             return c.shortlog_data
--- a/rhodecode/controllers/summary.py	Sun Feb 27 00:38:28 2011 +0100
+++ b/rhodecode/controllers/summary.py	Sun Feb 27 01:57:17 2011 +0100
@@ -43,8 +43,7 @@
 
 from rhodecode.lib.celerylib import run_task
 from rhodecode.lib.celerylib.tasks import get_commits_stats
-
-from webhelpers.paginate import Page
+from rhodecode.lib.helpers import RepoPage
 
 try:
     import json
@@ -70,7 +69,7 @@
         def url_generator(**kw):
             return url('shortlog_home', repo_name=c.repo_name, **kw)
 
-        c.repo_changesets = Page(c.repo, page=1, items_per_page=10,
+        c.repo_changesets = RepoPage(c.repo, page=1, items_per_page=10,
                                  url=url_generator)
 
         e = request.environ
--- a/rhodecode/lib/helpers.py	Sun Feb 27 00:38:28 2011 +0100
+++ b/rhodecode/lib/helpers.py	Sun Feb 27 01:57:17 2011 +0100
@@ -29,7 +29,7 @@
     convert_misc_entities, lchop, plural, rchop, remove_formatting, \
     replace_whitespace, urlify, truncate, wrap_paragraphs
 from webhelpers.date import time_ago_in_words
-
+from webhelpers.paginate import Page
 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
     convert_boolean_attrs, NotGiven
 
@@ -575,6 +575,92 @@
 
     return gravatar_url
 
+
+#==============================================================================
+# REPO PAGER
+#==============================================================================
+class RepoPage(Page):
+
+    def __init__(self, collection, page=1, items_per_page=20,
+        item_count=None, url=None, **kwargs):
+
+        """Create a "RepoPage" instance. special pager for paging
+        repository
+        """
+        self._url_generator = url
+
+        # Safe the kwargs class-wide so they can be used in the pager() method
+        self.kwargs = kwargs
+
+        # Save a reference to the collection
+        self.original_collection = collection
+
+        self.collection = collection
+
+        # The self.page is the number of the current page.
+        # The first page has the number 1!
+        try:
+            self.page = int(page) # make it int() if we get it as a string
+        except (ValueError, TypeError):
+            self.page = 1
+
+        self.items_per_page = items_per_page
+
+        # Unless the user tells us how many items the collections has
+        # we calculate that ourselves.
+        if item_count is not None:
+            self.item_count = item_count
+        else:
+            self.item_count = len(self.collection)
+
+        # Compute the number of the first and last available page
+        if self.item_count > 0:
+            self.first_page = 1
+            self.page_count = ((self.item_count - 1) / self.items_per_page) + 1
+            self.last_page = self.first_page + self.page_count - 1
+
+            # Make sure that the requested page number is the range of valid pages
+            if self.page > self.last_page:
+                self.page = self.last_page
+            elif self.page < self.first_page:
+                self.page = self.first_page
+
+            # Note: the number of items on this page can be less than
+            #       items_per_page if the last page is not full
+            self.first_item = max(0, (self.item_count) - (self.page * items_per_page))
+            self.last_item = ((self.item_count - 1) - items_per_page * (self.page - 1)) + 1
+
+            iterator = self.collection.get_changesets(start=self.first_item,
+                                                      end=self.last_item,
+                                                      reverse=True)
+            self.items = list(iterator)
+
+            # Links to previous and next page
+            if self.page > self.first_page:
+                self.previous_page = self.page - 1
+            else:
+                self.previous_page = None
+
+            if self.page < self.last_page:
+                self.next_page = self.page + 1
+            else:
+                self.next_page = None
+
+        # No items available
+        else:
+            self.first_page = None
+            self.page_count = 0
+            self.last_page = None
+            self.first_item = None
+            self.last_item = None
+            self.previous_page = None
+            self.next_page = None
+            self.items = []
+
+        # This is a subclass of the 'list' type. Initialise the list now.
+        list.__init__(self, self.items)
+
+
 def safe_unicode(str):
     """safe unicode function. In case of UnicodeDecode error we try to return
     unicode with errors replace, if this failes we return unicode with