webhelpers: replaced paginate library with custom lib
This commit is contained in:
parent
4057ada739
commit
dbac62326d
26 changed files with 1167 additions and 356 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
1056
rhodecode/lib/pagination.py
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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')}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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)}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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')}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue