From 58b3a65e53c70d6e0bffb8645cb947e17773fc0f Mon Sep 17 00:00:00 2001 From: Ben Sturmfels Date: Sun, 7 Aug 2016 21:48:52 +1000 Subject: [PATCH] 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. --- mediagoblin/tests/test_tools.py | 31 +++++++++++++++++++++++++++++++ mediagoblin/tools/pagination.py | 7 +++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/mediagoblin/tests/test_tools.py b/mediagoblin/tests/test_tools.py index 6d3dd475..30232e24 100644 --- a/mediagoblin/tests/test_tools.py +++ b/mediagoblin/tests/test_tools.py @@ -16,10 +16,16 @@ from __future__ import absolute_import, unicode_literals +try: + import mock +except ImportError: + import unittest.mock as mock + from werkzeug.wrappers import Request from werkzeug.test import EnvironBuilder from mediagoblin.tools.request import decode_request +from mediagoblin.tools.pagination import Pagination class TestDecodeRequest(object): """Test the decode_request function.""" @@ -59,3 +65,28 @@ class TestDecodeRequest(object): request.form = {'foo': 'bar'} data = decode_request(request) 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] diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py index a525caf7..db5f69fb 100644 --- a/mediagoblin/tools/pagination.py +++ b/mediagoblin/tools/pagination.py @@ -14,13 +14,12 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import urllib import copy from math import ceil, floor from itertools import count from werkzeug.datastructures import MultiDict -from six.moves import zip +from six.moves import range, urllib, zip PAGINATION_DEFAULT_PER_PAGE = 30 @@ -86,7 +85,7 @@ class Pagination(object): def iter_pages(self, left_edge=2, left_current=2, right_current=5, right_edge=2): last = 0 - for num in xrange(1, self.pages + 1): + for num in range(1, self.pages + 1): if num <= left_edge or \ (num > self.page - left_current - 1 and \ num < self.page + right_current) or \ @@ -107,7 +106,7 @@ class Pagination(object): new_get_params['page'] = page_no 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): """ -- 2.25.1