From: Zygmunt Krynicki Date: Wed, 6 Jan 2016 10:16:21 +0000 (+0100) Subject: Merge pull request #34 from atugushev/master X-Git-Tag: 2.2.0~2 X-Git-Url: https://git.mdrn.pl/django-pagination.git/commitdiff_plain/5432e8fe148352116ca3c7cbdc96d8cf7e677dc5?hp=cc09a6ef903c38873717ae435843adfce4dba6e6 Merge pull request #34 from atugushev/master Convert doctests to django unittests and add travis-ci support --- diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..4d555f6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,67 @@ +language: python +python: + - "2.7" + - "3.2" + - "3.3" + - "3.4" + - "3.5" +env: + matrix: + - DJANGO_VERSION=1.2 + - DJANGO_VERSION=1.3 + - DJANGO_VERSION=1.4 + - DJANGO_VERSION=1.5 + - DJANGO_VERSION=1.6 + - DJANGO_VERSION=1.7 + - DJANGO_VERSION=1.8 + - DJANGO_VERSION=1.9 +install: + - pip install 'coverage<4' # coverage>=4 has issues with python3 + - pip install -q Django==$DJANGO_VERSION coveralls + - python setup.py egg_info +script: coverage run --source='linaro_django_pagination' --omit *runner*,*test_project* setup.py test +after_success: + - coveralls +matrix: + include: + - python: "2.6" + env: DJANGO_VERSION=1.4 + - python: "2.6" + env: DJANGO_VERSION=1.5 + - python: "2.6" + env: DJANGO_VERSION=1.6 + exclude: + - python: "3.2" + env: DJANGO_VERSION=1.2 # Unsupported + - python: "3.2" + env: DJANGO_VERSION=1.3 # Unsupported + - python: "3.2" + env: DJANGO_VERSION=1.4 # Unsupported + - python: "3.2" + env: DJANGO_VERSION=1.9 # Unsupported + - python: "3.3" + env: DJANGO_VERSION=1.9 # ImportError: cannot import name find_spec + - python: "3.3" + env: DJANGO_VERSION=1.2 # Unsupported + - python: "3.3" + env: DJANGO_VERSION=1.3 # Unsupported + - python: "3.3" + env: DJANGO_VERSION=1.4 # Unsupported + - python: "3.4" + env: DJANGO_VERSION=1.2 # Unsupported + - python: "3.4" + env: DJANGO_VERSION=1.3 # Unsupported + - python: "3.4" + env: DJANGO_VERSION=1.4 # Unsupported + - python: "3.5" + env: DJANGO_VERSION=1.2 # Unsupported + - python: "3.5" + env: DJANGO_VERSION=1.3 # Unsupported + - python: "3.5" + env: DJANGO_VERSION=1.4 # Unsupported + - python: "3.5" + env: DJANGO_VERSION=1.5 # Unsupported + - python: "3.5" + env: DJANGO_VERSION=1.7 # AttributeError: module 'html.parser' has no attribute 'HTMLParseError' + - python: "3.5" + env: DJANGO_VERSION=1.6 # AttributeError: module 'html.parser' has no attribute 'HTMLParseError' diff --git a/README b/README deleted file mode 100644 index ff4d063..0000000 --- a/README +++ /dev/null @@ -1,37 +0,0 @@ -About the fork --------------- - -This project is a fork of apparently dead "django-pagination" project -originally written by 'Eric Florenzano'. It is maintained by the Linaro -Validation/Infrastructure team. Latest releases can be found on launchpad and -pypi. - -We are in the process of deciding how to properly host and manage the project. -Feel free to hop to #linaro on irc.freenode.net and ask either 'zyga' or -'mwhudson' about this. - - -About top-level package name change ------------------------------------ -The top level package name was changed from `pagination` to -`linaro-django-pagination`. I did this to ensure that existing users of the -original package could easily transition, on their own terms. Since both -packages are co-installable you are free to check things out and see if the new -pagination code works well for you or not. - -Also, since the implementation of the actual tags was rewritten I would not -feel entirely confident that the new package is a drop-in replacement. - - -Contributors ------------- - -We would like to welcome any and all contributors. Please use the pull request -feature on github. - - -How to use linaro-django-pagination ------------------------------------ - -See our official documentation for more details. -http://packages.python.org/linaro-django-pagination/ diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..190dc82 --- /dev/null +++ b/README.rst @@ -0,0 +1,48 @@ +======================== +Linaro Django Pagination +======================== + +.. image:: https://travis-ci.org/zyga/django-pagination.svg?branch=master + :target: https://travis-ci.org/zyga/django-pagination + +.. image:: https://coveralls.io/repos/zyga/django-pagination/badge.svg?branch=master&service=github + :target: https://coveralls.io/github/zyga/django-pagination?branch=master + + +About the fork +-------------- + +This project is a fork of apparently dead "django-pagination" project +originally written by 'Eric Florenzano'. It is maintained by the Linaro +Validation/Infrastructure team. Latest releases can be found on launchpad and +pypi. + +We are in the process of deciding how to properly host and manage the project. +Feel free to hop to #linaro on irc.freenode.net and ask either 'zyga' or +'mwhudson' about this. + + +About top-level package name change +----------------------------------- +The top level package name was changed from `pagination` to +`linaro-django-pagination`. I did this to ensure that existing users of the +original package could easily transition, on their own terms. Since both +packages are co-installable you are free to check things out and see if the new +pagination code works well for you or not. + +Also, since the implementation of the actual tags was rewritten I would not +feel entirely confident that the new package is a drop-in replacement. + + +Contributors +------------ + +We would like to welcome any and all contributors. Please use the pull request +feature on github. + + +How to use linaro-django-pagination +----------------------------------- + +See our official documentation for more details. +http://packages.python.org/linaro-django-pagination/ diff --git a/linaro_django_pagination/templatetags/pagination_tags.py b/linaro_django_pagination/templatetags/pagination_tags.py index da22e95..f106942 100644 --- a/linaro_django_pagination/templatetags/pagination_tags.py +++ b/linaro_django_pagination/templatetags/pagination_tags.py @@ -140,7 +140,11 @@ class AutoPaginateNode(Node): self.multiple_paginations = multiple_paginations def render(self, context): - if self.multiple_paginations or getattr(context, "paginator", None): + # Save multiple_paginations state in context + if self.multiple_paginations and 'multiple_paginations' not in context: + context['multiple_paginations'] = True + + if context.get('multiple_paginations') or getattr(context, "paginator", None): page_suffix = '_%s' % self.queryset_var else: page_suffix = '' @@ -170,7 +174,7 @@ class AutoPaginateNode(Node): 'False, an HTTP 404 page would have been shown instead.') context[key] = [] context['invalid_page'] = True - return u'' + return '' if self.context_var is not None: context[self.context_var] = page_obj.object_list else: @@ -178,7 +182,7 @@ class AutoPaginateNode(Node): context['paginator'] = paginator context['page_obj'] = page_obj context['page_suffix'] = page_suffix - return u'' + return '' class PaginateNode(Node): @@ -264,7 +268,7 @@ def paginate(context, window=DEFAULT_WINDOW, margin=DEFAULT_MARGIN): paginator = context['paginator'] page_obj = context['page_obj'] page_suffix = context.get('page_suffix', '') - page_range = paginator.page_range + page_range = list(paginator.page_range) # Calculate the record range in the current page for display. records = {'first': 1 + (page_obj.number - 1) * paginator.per_page} records['last'] = records['first'] + paginator.per_page - 1 @@ -280,7 +284,7 @@ def paginate(context, window=DEFAULT_WINDOW, margin=DEFAULT_MARGIN): window_end = window_end - window_start window_start = 0 if window_end > paginator.num_pages: - window_start = window_start - (window_end - paginator.num_pages) + window_start = max(0, window_start - (window_end - paginator.num_pages)) window_end = paginator.num_pages pages = page_range[window_start:window_end] diff --git a/linaro_django_pagination/tests.py b/linaro_django_pagination/tests.py deleted file mode 100644 index 90468d5..0000000 --- a/linaro_django_pagination/tests.py +++ /dev/null @@ -1,270 +0,0 @@ -# Copyright (c) 2008, Eric Florenzano -# Copyright (c) 2010, 2011 Linaro Limited -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of the author nor the names of other -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -""" ->>> from django.core.paginator import Paginator ->>> from linaro_django_pagination.templatetags.pagination_tags import paginate ->>> from django.template import Template, Context - ->>> p = Paginator(range(15), 2) ->>> pg = paginate({'paginator': p, 'page_obj': p.page(1)}) ->>> pg['pages'] -[1, 2, 3, 4, 5, 6, 7, 8] ->>> pg['records']['first'] -1 ->>> pg['records']['last'] -2 - ->>> p = Paginator(range(15), 2) ->>> pg = paginate({'paginator': p, 'page_obj': p.page(8)}) ->>> pg['pages'] -[1, 2, 3, 4, 5, 6, 7, 8] ->>> pg['records']['first'] -15 ->>> pg['records']['last'] -15 - ->>> p = Paginator(range(17), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1, 2, 3, 4, 5, 6, 7, 8, 9] - - -# on start -# moving the window from 1 ... to end -# window size = 2, margin = 2 -# [1] 2 3 4 5 ... 15, 16 -# 1 [2] 3 4 5 ... 15, 16 -# 1 2 [3] 4 5 ... 15, 16 -# 1 2 3 [4] 5 6 ... 15, 16 -# 1 2 3 4 [5] 6 7 ... 15, 16 -# 1 2 3 4 5 [6] 7 8 ... 15, 16 -# 1 2 ... 5 6 [7] 8 9 ... 15, 16 - -# window = 2 -> show 5 pages ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)}, 2, 2)['pages'] -[1, 2, 3, 4, 5, None, 15, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(2)}, 2, 2)['pages'] -[1, 2, 3, 4, 5, None, 15, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(3)}, 2, 2)['pages'] -[1, 2, 3, 4, 5, None, 15, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(4)}, 2, 2)['pages'] -[1, 2, 3, 4, 5, 6, None, 15, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(5)}, 2, 2)['pages'] -[1, 2, 3, 4, 5, 6, 7, None, 15, 16] - -# in the middle ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(7)}, 2, 2)['pages'] -[1, 2, None, 5, 6, 7, 8, 9, None, 15, 16] - -# on end ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(16)}, 2, 2)['pages'] -[1, 2, None, 12, 13, 14, 15, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(13)}, 2, 2)['pages'] -[1, 2, None, 11, 12, 13, 14, 15, 16] - - ->>> p = Paginator(range(0), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] -[1] - - - -# no margin ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(3)}, 2, 0)['pages'] -[1, 2, 3, 4, 5, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(5)}, 2, 0)['pages'] -[None, 3, 4, 5, 6, 7, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(16)}, 2, 0)['pages'] -[None, 12, 13, 14, 15, 16] - - -# special -# zero window, zero margin ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(1)}, 0, 0)['pages'] -[1, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(2)}, 0, 0)['pages'] -[None, 2, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(3)}, 0, 0)['pages'] -[None, 3, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(10)}, 0, 0)['pages'] -[None, 10, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(14)}, 0, 0)['pages'] -[None, 14, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(15)}, 0, 0)['pages'] -[None, 15, None] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(16)}, 0, 0)['pages'] -[None, 16] - ->>> p = Paginator(range(31), 2) ->>> paginate({'paginator': p, 'page_obj': p.page(5)}, 0, 1)['pages'] -[1, None, 5, None, 16] - ->>> p = Paginator(range(21), 2, 1) ->>> paginate({'paginator': p, 'page_obj': p.page(1)}, 0, 4)['pages'] -[1, 2, 3, 4, None, 7, 8, 9, 10] - -# Testing template rendering - ->>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}") - ->>> from django.http import HttpRequest as DjangoHttpRequest ->>> class HttpRequest(DjangoHttpRequest): -... page = lambda self, suffix: 1 - ->>> t.render(Context({'var': range(21), 'request': HttpRequest()})) -u'\\n...\\n...