Add Python 3 support in pagination.

This issue was visible when attempting to view the home page of a MediaGoblin site with more than a single page worth of items, under Python 3.
This commit is contained in:
Ben Sturmfels 2016-08-07 21:48:52 +10:00 committed by Boris Bobrov
parent d37c6f622a
commit 58b3a65e53
2 changed files with 34 additions and 4 deletions

View File

@ -16,10 +16,16 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
try:
import mock
except ImportError:
import unittest.mock as mock
from werkzeug.wrappers import Request from werkzeug.wrappers import Request
from werkzeug.test import EnvironBuilder from werkzeug.test import EnvironBuilder
from mediagoblin.tools.request import decode_request from mediagoblin.tools.request import decode_request
from mediagoblin.tools.pagination import Pagination
class TestDecodeRequest(object): class TestDecodeRequest(object):
"""Test the decode_request function.""" """Test the decode_request function."""
@ -59,3 +65,28 @@ class TestDecodeRequest(object):
request.form = {'foo': 'bar'} request.form = {'foo': 'bar'}
data = decode_request(request) data = decode_request(request)
assert data['foo'] == 'bar' assert data['foo'] == 'bar'
class TestPagination(object):
def setup(self):
mock_cursor = mock.MagicMock()
mock_cursor.count.return_value = 1
self.paginator = Pagination(1, mock_cursor)
def test_creates_valid_page_url_from_explicit_base_url(self):
"""Check that test_page_url_explicit runs.
This is a regression test for a Python 2/3 compatibility fix.
"""
url = self.paginator.get_page_url_explicit(
'http://example.com', [], 1)
assert url == 'http://example.com?page=1'
def test_iter_pages_handes_single_page(self):
"""Check that iter_pages produces the expected result for single page.
This is a regression test for a Python 2/3 compatibility fix.
"""
assert list(self.paginator.iter_pages()) == [1]

View File

@ -14,13 +14,12 @@
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import urllib
import copy import copy
from math import ceil, floor from math import ceil, floor
from itertools import count from itertools import count
from werkzeug.datastructures import MultiDict from werkzeug.datastructures import MultiDict
from six.moves import zip from six.moves import range, urllib, zip
PAGINATION_DEFAULT_PER_PAGE = 30 PAGINATION_DEFAULT_PER_PAGE = 30
@ -86,7 +85,7 @@ class Pagination(object):
def iter_pages(self, left_edge=2, left_current=2, def iter_pages(self, left_edge=2, left_current=2,
right_current=5, right_edge=2): right_current=5, right_edge=2):
last = 0 last = 0
for num in xrange(1, self.pages + 1): for num in range(1, self.pages + 1):
if num <= left_edge or \ if num <= left_edge or \
(num > self.page - left_current - 1 and \ (num > self.page - left_current - 1 and \
num < self.page + right_current) or \ num < self.page + right_current) or \
@ -107,7 +106,7 @@ class Pagination(object):
new_get_params['page'] = page_no new_get_params['page'] = page_no
return "%s?%s" % ( return "%s?%s" % (
base_url, urllib.urlencode(new_get_params)) base_url, urllib.parse.urlencode(new_get_params))
def get_page_url(self, request, page_no): def get_page_url(self, request, page_no):
""" """