webhelpers: replaced paginate library with custom lib

This commit is contained in:
Daniel Dourvaris 2019-11-21 20:37:17 +01:00
parent 4057ada739
commit dbac62326d
26 changed files with 1167 additions and 356 deletions

View file

@ -1829,7 +1829,6 @@ self: super: {
self."venusian"
self."weberror"
self."webhelpers2"
self."webhelpers"
self."webob"
self."whoosh"
self."wsgiref"
@ -2212,20 +2211,6 @@ self: super: {
license = [ pkgs.lib.licenses.mit ];
};
};
"webhelpers" = super.buildPythonPackage {
name = "webhelpers-1.3";
doCheck = false;
propagatedBuildInputs = [
self."markupsafe"
];
src = fetchurl {
url = "https://files.pythonhosted.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
sha256 = "10x5i82qdkrvyw18gsybwggfhfpl869siaab89vnndi9x62g51pa";
};
meta = {
license = [ pkgs.lib.licenses.bsdOriginal ];
};
};
"webhelpers2" = super.buildPythonPackage {
name = "webhelpers2-2.0";
doCheck = false;

View file

@ -71,7 +71,6 @@ urlobject==2.4.3
venusian==1.2.0
weberror==0.10.3
webhelpers2==2.0
webhelpers==1.3
webob==1.8.5
whoosh==2.7.4
wsgiref==0.1.2

View file

@ -28,7 +28,7 @@ from rhodecode.model.db import joinedload, UserLog
from rhodecode.lib.user_log_filter import user_log_filter
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
from rhodecode.lib.utils2 import safe_int
from rhodecode.lib.helpers import Page
from rhodecode.lib.helpers import SqlPage
log = logging.getLogger(__name__)
@ -62,13 +62,16 @@ class AdminAuditLogsView(BaseAppView):
p = safe_int(self.request.GET.get('page', 1), 1)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num
}
if c.search_term:
kw['filter'] = c.search_term
return self.request.current_route_path(_query=kw)
query_params['filter'] = c.search_term
return self.request.current_route_path(_query=query_params)
c.audit_logs = Page(users_log, page=p, items_per_page=10,
url=url_generator)
c.audit_logs = SqlPage(users_log, page=p, items_per_page=10,
url_maker=url_generator)
return self._get_template_context(c)
@LoginRequired()

View file

@ -44,6 +44,7 @@ from rhodecode.lib.ext_json import json
from rhodecode.lib.auth import (
LoginRequired, HasPermissionAllDecorator, CSRFRequired)
from rhodecode.lib import helpers as h
from rhodecode.lib.helpers import SqlPage
from rhodecode.lib.utils2 import safe_int, safe_unicode, AttributeDict
from rhodecode.model.auth_token import AuthTokenModel
from rhodecode.model.forms import (
@ -1228,13 +1229,16 @@ class UsersView(UserAppView):
filter_term = self.request.GET.get('filter')
user_log = UserModel().get_user_log(c.user, filter_term)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num
}
if filter_term:
kw['filter'] = filter_term
return self.request.current_route_path(_query=kw)
query_params['filter'] = filter_term
return self.request.current_route_path(_query=query_params)
c.audit_logs = h.Page(
user_log, page=p, items_per_page=10, url=url_generator)
c.audit_logs = SqlPage(
user_log, page=p, items_per_page=10, url_maker=url_generator)
c.filter_term = filter_term
return self._get_template_context(c)

View file

@ -34,7 +34,7 @@ from rhodecode.model.db import (
or_, joinedload, Repository, UserLog, UserFollowing, User, UserApiKeys)
from rhodecode.model.meta import Session
import rhodecode.lib.helpers as h
from rhodecode.lib.helpers import Page
from rhodecode.lib.helpers import SqlPage
from rhodecode.lib.user_log_filter import user_log_filter
from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired, HasRepoPermissionAny
from rhodecode.lib.utils2 import safe_int, AttributeDict, md5_safe
@ -232,15 +232,15 @@ class JournalView(BaseAppView):
journal = self._get_journal_data(following, c.search_term)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num,
'filter': c.search_term
}
query_params.update(kw)
return self.request.current_route_path(_query=query_params)
c.journal_pager = Page(
journal, page=p, items_per_page=20, url=url_generator)
c.journal_pager = SqlPage(
journal, page=p, items_per_page=20, url_maker=url_generator)
c.journal_day_aggreagate = self._get_daily_aggregate(c.journal_pager)
c.journal_data = render(
@ -333,13 +333,14 @@ class JournalView(BaseAppView):
journal = self._get_journal_data(c.following, c.search_term)
def url_generator(**kw):
query_params = {}
query_params.update(kw)
def url_generator(page_num):
query_params = {
'page': page_num
}
return self.request.current_route_path(_query=query_params)
c.journal_pager = Page(
journal, page=p, items_per_page=20, url=url_generator)
c.journal_pager = SqlPage(
journal, page=p, items_per_page=20, url_maker=url_generator)
c.journal_day_aggreagate = self._get_daily_aggregate(c.journal_pager)
c.journal_data = render(

View file

@ -28,7 +28,7 @@ from rhodecode.apps._base import BaseAppView
from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired
from rhodecode.lib import helpers as h
from rhodecode.lib.helpers import Page
from rhodecode.lib.helpers import SqlPage
from rhodecode.lib.utils2 import safe_int
from rhodecode.model.db import Notification
from rhodecode.model.notification import NotificationModel
@ -74,13 +74,16 @@ class MyAccountNotificationsView(BaseAppView):
p = safe_int(self.request.GET.get('page', 1), 1)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num
}
_query = self.request.GET.mixed()
_query.update(kw)
return self.request.current_route_path(_query=_query)
query_params.update(_query)
return self.request.current_route_path(_query=query_params)
c.notifications = Page(notifications, page=p, items_per_page=10,
url=url_generator)
c.notifications = SqlPage(notifications, page=p, items_per_page=10,
url_maker=url_generator)
c.unread_type = 'unread'
c.all_type = 'all'

View file

@ -22,6 +22,7 @@ import logging
from pyramid.view import view_config
from rhodecode.apps._base import RepoAppView
from rhodecode.lib.helpers import SqlPage
from rhodecode.lib import helpers as h
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
from rhodecode.lib.utils2 import safe_int
@ -33,8 +34,6 @@ log = logging.getLogger(__name__)
class AuditLogsView(RepoAppView):
def load_default_context(self):
c = self._get_local_tmpl_context()
return c
@LoginRequired()
@ -54,12 +53,15 @@ class AuditLogsView(RepoAppView):
filter_term = self.request.GET.get('filter')
user_log = RepoModel().get_repo_log(c.db_repo, filter_term)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num
}
if filter_term:
kw['filter'] = filter_term
return self.request.current_route_path(_query=kw)
query_params['filter'] = filter_term
return self.request.current_route_path(_query=query_params)
c.audit_logs = h.Page(
user_log, page=p, items_per_page=10, url=url_generator)
c.audit_logs = SqlPage(
user_log, page=p, items_per_page=10, url_maker=url_generator)
c.filter_term = filter_term
return self._get_template_context(c)

View file

@ -121,9 +121,16 @@ class RepoChangelogView(RepoAppView):
self, c, collection, page, chunk_size, branch_name=None,
dynamic=False, f_path=None, commit_id=None):
def url_generator(**kw):
query_params = {}
query_params.update(kw)
def url_generator(page_num):
query_params = {
'page': page_num
}
if branch_name:
query_params.update({
'branch': branch_name
})
if f_path:
# changelog for file
return h.route_path(
@ -139,8 +146,7 @@ class RepoChangelogView(RepoAppView):
c.total_cs = len(collection)
c.showing_commits = min(chunk_size, c.total_cs)
c.pagination = RepoPage(collection, page=page, item_count=c.total_cs,
items_per_page=chunk_size, branch=branch_name,
url=url_generator)
items_per_page=chunk_size, url_maker=url_generator)
c.next_page = c.pagination.next_page
c.prev_page = c.pagination.previous_page

View file

@ -56,11 +56,11 @@ class RepoSummaryView(RepoAppView):
p = safe_int(self.request.GET.get('page'), 1)
size = safe_int(self.request.GET.get('size'), 10)
def url_generator(**kw):
def url_generator(page_num):
query_params = {
'page': page_num,
'size': size
}
query_params.update(kw)
return h.route_path(
'repo_summary_commits',
repo_name=c.rhodecode_db_repo.repo_name, _query=query_params)
@ -73,7 +73,7 @@ class RepoSummaryView(RepoAppView):
collection = self.rhodecode_vcs_repo
c.repo_commits = h.RepoPage(
collection, page=p, items_per_page=size, url=url_generator)
collection, page=p, items_per_page=size, url_maker=url_generator)
page_ids = [x.raw_id for x in c.repo_commits]
c.comments = self.db_repo.get_comments(page_ids)
c.statuses = self.db_repo.statuses(page_ids)

View file

@ -59,11 +59,19 @@ def perform_search(request, tmpl_context, repo_name=None, repo_group_name=None):
except validation_schema.Invalid as e:
errors = e.children
def url_generator(**kw):
def url_generator(page_num):
q = urllib.quote(safe_str(search_query))
return update_params(
"?q=%s&type=%s&max_lines=%s&sort=%s" % (
q, safe_str(search_type), search_max_lines, search_sort), **kw)
query_params = {
'page': page_num,
'q': q,
'type': safe_str(search_type),
'max_lines': search_max_lines,
'sort': search_sort
}
return '?' + urllib.urlencode(query_params)
c = tmpl_context
search_query = search_params.get('search_query')
@ -82,7 +90,7 @@ def perform_search(request, tmpl_context, repo_name=None, repo_group_name=None):
formatted_results = Page(
search_result['results'], page=requested_page,
item_count=search_result['count'],
items_per_page=page_limit, url=url_generator)
items_per_page=page_limit, url_maker=url_generator)
finally:
searcher.cleanup()
@ -100,7 +108,6 @@ def perform_search(request, tmpl_context, repo_name=None, repo_group_name=None):
c.perm_user = c.auth_user
c.repo_name = repo_name
c.repo_group_name = repo_group_name
c.url_generator = url_generator
c.errors = errors
c.formatted_results = formatted_results
c.runtime = execution_time

View file

@ -27,11 +27,11 @@ from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPNotFound
from rhodecode.integrations import integration_type_registry
from rhodecode.apps._base import BaseAppView
from rhodecode.apps._base.navigation import navigation_list
from rhodecode.lib.paginate import PageURL
from rhodecode.lib.auth import (
LoginRequired, CSRFRequired, HasPermissionAnyDecorator,
HasRepoPermissionAnyDecorator, HasRepoGroupPermissionAnyDecorator)
from rhodecode.lib.utils2 import safe_int
from rhodecode.lib.helpers import Page
from rhodecode.lib import helpers as h
from rhodecode.model.db import Repository, RepoGroup, Session, Integration
from rhodecode.model.scm import ScmModel
@ -219,11 +219,16 @@ class IntegrationSettingsViewBase(BaseAppView):
key=lambda x: getattr(x[1], sort_field),
reverse=(sort_dir == 'desc'))
page_url = PageURL(self.request.path, self.request.GET)
def url_generator(page_num):
query_params = {
'page': page_num
}
return self.request.current_route_path(_query=query_params)
page = safe_int(self.request.GET.get('page', 1), 1)
integrations = h.Page(
integrations, page=page, items_per_page=10, url=page_url)
integrations = Page(
integrations, page=page, items_per_page=10, url_maker=url_generator)
c.rev_sort_dir = sort_dir != 'desc' and 'desc' or 'asc'

View file

@ -75,7 +75,7 @@ from webhelpers2.html.tags import (
from webhelpers2.number import format_byte_size
from rhodecode.lib.action_parser import action_parser
from rhodecode.lib.paginate import Page
from rhodecode.lib.pagination import Page, RepoPage, SqlPage
from rhodecode.lib.ext_json import json
from rhodecode.lib.utils import repo_name_slug, get_custom_lexer
from rhodecode.lib.utils2 import (
@ -1309,94 +1309,6 @@ def gravatar_url(email_address, size=30, request=None):
return initials_gravatar(email_address, '', '', size=size)
#==============================================================================
# REPO PAGER, PAGER FOR REPOSITORY
#==============================================================================
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 = int(math.ceil(float(self.item_count) /
self.items_per_page))
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))
self.items = list(self.collection[self.first_item:self.last_item + 1])
# 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, reversed(self.items))
def breadcrumb_repo_link(repo):
"""
Makes a breadcrumbs path link to repo

View file

@ -1,165 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2010-2019 RhodeCode GmbH
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License, version 3
# (only), as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This program is dual-licensed. If you wish to learn more about the
# RhodeCode Enterprise Edition, including its added features, Support services,
# and proprietary license terms, please see https://rhodecode.com/licenses/
import re
from webhelpers.paginate import Page as _Page
from webhelpers.paginate import PageURL
from webhelpers2.html import literal, HTML
class Page(_Page):
"""
Custom pager to match rendering style with paginator
"""
def _get_pos(self, cur_page, max_page, items):
edge = (items / 2) + 1
if (cur_page <= edge):
radius = max(items / 2, items - cur_page)
elif (max_page - cur_page) < edge:
radius = (items - 1) - (max_page - cur_page)
else:
radius = items / 2
left = max(1, (cur_page - (radius)))
right = min(max_page, cur_page + (radius))
return left, cur_page, right
def _range(self, regexp_match):
"""
Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
Arguments:
regexp_match
A "re" (regular expressions) match object containing the
radius of linked pages around the current page in
regexp_match.group(1) as a string
This function is supposed to be called as a callable in
re.sub.
"""
radius = int(regexp_match.group(1))
# Compute the first and last page number within the radius
# e.g. '1 .. 5 6 [7] 8 9 .. 12'
# -> leftmost_page = 5
# -> rightmost_page = 9
leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
self.last_page,
(radius * 2) + 1)
nav_items = []
# Create a link to the first page (unless we are on the first page
# or there would be no need to insert '..' spacers)
if self.page != self.first_page and self.first_page < leftmost_page:
nav_items.append(self._pagerlink(self.first_page, self.first_page))
# Insert dots if there are pages between the first page
# and the currently displayed page range
if leftmost_page - self.first_page > 1:
# Wrap in a SPAN tag if nolink_attr is set
text = '..'
if self.dotdot_attr:
text = HTML.span(c=text, **self.dotdot_attr)
nav_items.append(text)
for thispage in xrange(leftmost_page, rightmost_page + 1):
# Hilight the current page number and do not use a link
if thispage == self.page:
text = '%s' % (thispage,)
# Wrap in a SPAN tag if nolink_attr is set
if self.curpage_attr:
text = HTML.span(c=text, **self.curpage_attr)
nav_items.append(text)
# Otherwise create just a link to that page
else:
text = '%s' % (thispage,)
nav_items.append(self._pagerlink(thispage, text))
# Insert dots if there are pages between the displayed
# page numbers and the end of the page range
if self.last_page - rightmost_page > 1:
text = '..'
# Wrap in a SPAN tag if nolink_attr is set
if self.dotdot_attr:
text = HTML.span(c=text, **self.dotdot_attr)
nav_items.append(text)
# Create a link to the very last page (unless we are on the last
# page or there would be no need to insert '..' spacers)
if self.page != self.last_page and rightmost_page < self.last_page:
nav_items.append(self._pagerlink(self.last_page, self.last_page))
## prerender links
#_page_link = url.current()
#nav_items.append(literal('<link rel="prerender" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
#nav_items.append(literal('<link rel="prefetch" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
return self.separator.join(nav_items)
def pager(self, format='~2~', page_param='page', partial_param='partial',
show_if_single_page=False, separator=' ', onclick=None,
symbol_first='<<', symbol_last='>>',
symbol_previous='<', symbol_next='>',
link_attr={'class': 'pager_link', 'rel': 'prerender'},
curpage_attr={'class': 'pager_curpage'},
dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
self.curpage_attr = curpage_attr
self.separator = separator
self.pager_kwargs = kwargs
self.page_param = page_param
self.partial_param = partial_param
self.onclick = onclick
self.link_attr = link_attr
self.dotdot_attr = dotdot_attr
# Don't show navigator if there is no more than one page
if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
return ''
from string import Template
# Replace ~...~ in token format by range of pages
result = re.sub(r'~(\d+)~', self._range, format)
# Interpolate '%' variables
result = Template(result).safe_substitute({
'first_page': self.first_page,
'last_page': self.last_page,
'page': self.page,
'page_count': self.page_count,
'items_per_page': self.items_per_page,
'first_item': self.first_item,
'last_item': self.last_item,
'item_count': self.item_count,
'link_first': self.page > self.first_page and \
self._pagerlink(self.first_page, symbol_first) or '',
'link_last': self.page < self.last_page and \
self._pagerlink(self.last_page, symbol_last) or '',
'link_previous': self.previous_page and \
self._pagerlink(self.previous_page, symbol_previous) \
or HTML.span(symbol_previous, class_="pg-previous disabled"),
'link_next': self.next_page and \
self._pagerlink(self.next_page, symbol_next) \
or HTML.span(symbol_next, class_="pg-next disabled")
})
return literal(result)

1056
rhodecode/lib/pagination.py Normal file

File diff suppressed because it is too large Load diff

View file

@ -625,8 +625,9 @@ ul#context-pages {
top: 95px;
}
.dataTables_paginate, .pagination-wh {
text-align: left;
.dataTables_paginate,
.pagination-wh {
text-align: center;
display: inline-block;
border-left: 1px solid @grey5;
float: none;
@ -638,10 +639,15 @@ ul#context-pages {
display: inline-block;
padding: @menupadding/4 @menupadding;
border: 1px solid @grey5;
border-left: 0;
margin-left: -1px;
color: @grey2;
cursor: pointer;
float: left;
font-weight: 600;
white-space: nowrap;
vertical-align: middle;
user-select: none;
min-width: 15px;
&:hover {
color: @rcdarkblue;

View file

@ -62,7 +62,7 @@
</table>
<div class="pagination-wh pagination-left">
${c.audit_logs.pager('$link_previous ~2~ $link_next')}
${c.audit_logs.render()}
</div>
%else:
${_('No actions yet')}

View file

@ -188,7 +188,7 @@
</table>
<div class="integrations-paginator">
<div class="pagination-wh pagination-left">
${c.integrations_list.pager('$link_previous ~2~ $link_next')}
${c.integrations_list.render()}
</div>
</div>
</div>

View file

@ -34,7 +34,7 @@
<div class="notification-paginator">
<div class="pagination-wh pagination-left">
${c.notifications.pager('$link_previous ~2~ $link_next')}
${c.notifications.render()}
</div>
</div>

View file

@ -130,7 +130,7 @@
</div>
</div>
<div class="pagination-wh pagination-left">
${c.pagination.pager('$link_previous ~2~ $link_next')}
${c.pagination.render()}
</div>
<div id="commit-counter" data-total=${c.total_cs} class="pull-right">
${_ungettext('showing %d out of %d commit', 'showing %d out of %d commits', c.showing_commits) % (c.showing_commits, c.total_cs)}

View file

@ -37,7 +37,9 @@
<span><a id="refresh" href="${h.route_path('journal')}"><i class="icon-refresh"></i></a></span>
</li>
<li>
<span><a href="${h.route_path('journal_atom', _query=dict(auth_token=c.rhodecode_user.feed_token))}"><i class="icon-rss-sign"></i></a></span>
<span>
<a href="${h.route_path('journal_atom', _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="RSS Feed" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
</span>
</li>
</ul>
</div>
@ -45,14 +47,6 @@
</div>
<script type="text/javascript">
$('#j_filter').autoGrowInput();
$(document).on('pjax:success',function(){
show_more_event();
});
$(document).pjax(
'#refresh', '#journal',
{url: "${request.current_route_path(_query=dict(filter=c.search_term))}", push: false});
$('#j_filter').autoGrowInput();
</script>
</%def>

View file

@ -36,17 +36,10 @@
%endfor
%endfor
<div class="pagination-wh pagination-left" >
${c.journal_pager.pager('$link_previous ~2~ $link_next')}
<div class="pagination-wh pagination-left">
${c.journal_pager.render()}
</div>
<script type="text/javascript">
$(document).pjax('#journal .pager_link','#journal');
$(document).on('pjax:success',function(){
show_more_event();
timeagoActivate();
tooltipActivate();
});
</script>
%else:
<div>
${_('No entries yet')}

View file

@ -65,11 +65,11 @@
<%
if c.sort.startswith('asc:'):
return c.url_generator(sort='desc:{}'.format(field_name))
return h.current_route_path(request, sort='desc:{}'.format(field_name))
elif c.sort.startswith('desc:'):
return c.url_generator(sort='asc:{}'.format(field_name))
return h.current_route_path(request, sort='asc:{}'.format(field_name))
return c.url_generator(sort='asc:{}'.format(field_name))
return h.current_route_path(request, sort='asc:{}'.format(field_name))
%>
</%def>

View file

@ -63,7 +63,7 @@
%if c.cur_query:
<div class="pagination-wh pagination-left">
${c.formatted_results.pager('$link_previous ~2~ $link_next')}
${c.formatted_results.render()}
</div>
%endif

View file

@ -145,7 +145,7 @@
</div>
%if c.cur_query and c.formatted_results:
<div class="pagination-wh pagination-left" >
${c.formatted_results.pager('$link_previous ~2~ $link_next')}
${c.formatted_results.render()}
</div>
%endif

View file

@ -46,7 +46,7 @@
%if c.cur_query:
<div class="pagination-wh pagination-left">
${c.formatted_results.pager('$link_previous ~2~ $link_next')}
${c.formatted_results.render()}
</div>
%endif

View file

@ -107,7 +107,7 @@
</script>
<div class="pagination-wh pagination-left">
${c.repo_commits.pager('$link_previous ~2~ $link_next')}
${c.repo_commits.render()}
</div>
%else: