django-pagination-1.0.5/0000755000076500000240000000000011115723655014422 5ustar ericflostaffdjango-pagination-1.0.5/._CONTRIBUTORS.txt0000644000076500000240000000027211036477204017334 0ustar ericflostaffMac OS X  2ATTR""com.macromates.caret{ column = 32; line = 2; }django-pagination-1.0.5/CONTRIBUTORS.txt0000644000076500000240000000014511036477204017116 0ustar ericflostaffEric Florenzano Martin Mahner James Tauber django-pagination-1.0.5/django_pagination.egg-info/0000755000076500000240000000000011115723655021567 5ustar ericflostaffdjango-pagination-1.0.5/django_pagination.egg-info/dependency_links.txt0000644000076500000240000000000111115723655025635 0ustar ericflostaff django-pagination-1.0.5/django_pagination.egg-info/not-zip-safe0000644000076500000240000000000111101003024023765 0ustar ericflostaff django-pagination-1.0.5/django_pagination.egg-info/PKG-INFO0000644000076500000240000001043711115723655022671 0ustar ericflostaffMetadata-Version: 1.0 Name: django-pagination Version: 1.0.5 Summary: django-pagination Home-page: http://django-pagination.googlecode.com/ Author: Eric Florenzano Author-email: floguy@gmail.com License: BSD Description: How to use django-pagination ---------------------------- ``django-pagination`` allows for easy Digg-style pagination without modifying your views. There are really 5 steps to setting it up with your projects (not including installation, which is covered in INSTALL.txt in this same directory.) 1. List this application in the ``INSTALLED_APPS`` portion of your settings file. Your settings file might look something like:: INSTALLED_APPS = ( # ... 'pagination', ) 2. Install the pagination middleware. Your settings file might look something like:: MIDDLEWARE_CLASSES = ( # ... 'pagination.middleware.PaginationMiddleware', ) 3. If it's not already added in your setup, add the request context processor. Note that context processors are set by default implicitly, so to set them explicitly, you need to copy and paste this code into your under the value TEMPLATE_CONTEXT_PROCESSORS:: ("django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.request") 4. Add this line at the top of your template to load the pagination tags: {% load pagination_tags %} 5. Decide on a variable that you would like to paginate, and use the autopaginate tag on that variable before iterating over it. This could take one of two forms (using the canonical ``object_list`` as an example variable): {% autopaginate object_list %} This assumes that you would like to have the default 20 results per page. If you would like to specify your own amount of results per page, you can specify that like so: {% autopaginate object_list 10 %} Note that this replaces ``object_list`` with the list for the current page, so you can iterate over the ``object_list`` like you normally would. 6. Now you want to display the current page and the available pages, so somewhere after having used autopaginate, use the paginate inclusion tag: {% paginate %} This does not take any arguments, but does assume that you have already called autopaginate, so make sure to do so first. That's it! You have now paginated ``object_list`` and given users of the site a way to navigate between the different pages--all without touching your views. Optional Settings ------------------ In django-pagination, there are no required settings. There are, however, a small set of optional settings useful for changing the default behavior of the pagination tags. Here's an overview: ``PAGINATION_DEFAULT_PAGINATION`` The default amount of items to show on a page if no number is specified. ``PAGINATION_DEFAULT_WINDOW`` The number of items to the left and to the right of the current page to display (accounting for ellipses). ``PAGINATION_DEFAULT_ORPHANS`` The number of orphans allowed. According to the Django documentation, orphans are defined as:: The minimum number of items allowed on the last page, defaults to zero. ``PAGINATION_INVALID_PAGE_RAISES_404`` Determines whether an invalid page raises an ``Http404`` or just sets the ``invalid_page`` context variable. ``True`` does the former and ``False`` does the latter. Keywords: pagination,django Platform: UNKNOWN Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Framework :: Django Classifier: Environment :: Web Environment django-pagination-1.0.5/django_pagination.egg-info/requires.txt0000644000076500000240000000001211115723655024160 0ustar ericflostaffsetuptoolsdjango-pagination-1.0.5/django_pagination.egg-info/SOURCES.txt0000644000076500000240000000150611115723655023455 0ustar ericflostaffCONTRIBUTORS.txt LICENSE.txt setup.py django_pagination.egg-info/PKG-INFO django_pagination.egg-info/SOURCES.txt django_pagination.egg-info/dependency_links.txt django_pagination.egg-info/not-zip-safe django_pagination.egg-info/requires.txt django_pagination.egg-info/top_level.txt docs/index.txt docs/install.txt docs/usage.txt pagination/__init__.py pagination/middleware.py pagination/models.py pagination/tests.py pagination/locale/de/LC_MESSAGES/django.mo pagination/locale/de/LC_MESSAGES/django.po pagination/locale/fr/LC_MESSAGES/django.mo pagination/locale/fr/LC_MESSAGES/django.po pagination/locale/pl/LC_MESSAGES/django.mo pagination/locale/pl/LC_MESSAGES/django.po pagination/templates/pagination/pagination.html pagination/templatetags/__init__.py pagination/templatetags/pagination_tags.py tests/runtests.py tests/settings.pydjango-pagination-1.0.5/django_pagination.egg-info/top_level.txt0000644000076500000240000000001311115723655024313 0ustar ericflostaffpagination django-pagination-1.0.5/docs/0000755000076500000240000000000011115723655015352 5ustar ericflostaffdjango-pagination-1.0.5/docs/._index.txt0000644000076500000240000000027011077002720017424 0ustar ericflostaffMac OS X  2ATTRGa  com.macromates.caretxR<[k0?'3/«django-pagination-1.0.5/docs/index.txt0000644000076500000240000000033311077002720017207 0ustar ericflostaff################# django-pagination ################# Django-pagination is a set of utilities for creating robust pagination tools throughout a django application. Contents: .. toctree:: install.txt usage.txtdjango-pagination-1.0.5/docs/._install.txt0000644000076500000240000000027311101551244017764 0ustar ericflostaffMac OS X  2ATTRGa##com.macromates.caret{ column = 13; line = 23; }django-pagination-1.0.5/docs/install.txt0000644000076500000240000000252611101551244017552 0ustar ericflostaffInstalling the latest development version of django-pagination --------------------------------------------------------------- To install, first check out the latest version of the application from subversion: svn co http://django-pagination.googlecode.com/svn/trunk django-pagination Now, link the inner ``pagination`` project to your Python path: sudo ln -s `pwd`/pagination SITE_PACKAGES_DIR/pagination If you don't know the location of your site packages directory, this hack might do the trick for you: sudo ln -s `pwd`/pagination `python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"`/pagination Now it's installed! Please see usage.txt for information on how to use this application in your projects. Installing via setup.py ----------------------- Included with this application is a file named ``setup.py``. It's possible to use this file to install this application to your system, by invoking the following command: sudo python setup.py install Once that's done, you should be able to begin using django-pagination at will. Installing via setuptools ------------------------- If you have setuptools_ installed, you can simply run the following command to install django-pagination: sudo easy_install django-pagination .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptoolsdjango-pagination-1.0.5/docs/._usage.txt0000644000076500000240000000027311115723414017427 0ustar ericflostaffMac OS X  2ATTRG`##com.macromates.caret{ column = 20; line = 95; }django-pagination-1.0.5/docs/usage.txt0000644000076500000240000000652611115723414017221 0ustar ericflostaffHow to use django-pagination ---------------------------- ``django-pagination`` allows for easy Digg-style pagination without modifying your views. There are really 5 steps to setting it up with your projects (not including installation, which is covered in INSTALL.txt in this same directory.) 1. List this application in the ``INSTALLED_APPS`` portion of your settings file. Your settings file might look something like:: INSTALLED_APPS = ( # ... 'pagination', ) 2. Install the pagination middleware. Your settings file might look something like:: MIDDLEWARE_CLASSES = ( # ... 'pagination.middleware.PaginationMiddleware', ) 3. If it's not already added in your setup, add the request context processor. Note that context processors are set by default implicitly, so to set them explicitly, you need to copy and paste this code into your under the value TEMPLATE_CONTEXT_PROCESSORS:: ("django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.request") 4. Add this line at the top of your template to load the pagination tags: {% load pagination_tags %} 5. Decide on a variable that you would like to paginate, and use the autopaginate tag on that variable before iterating over it. This could take one of two forms (using the canonical ``object_list`` as an example variable): {% autopaginate object_list %} This assumes that you would like to have the default 20 results per page. If you would like to specify your own amount of results per page, you can specify that like so: {% autopaginate object_list 10 %} Note that this replaces ``object_list`` with the list for the current page, so you can iterate over the ``object_list`` like you normally would. 6. Now you want to display the current page and the available pages, so somewhere after having used autopaginate, use the paginate inclusion tag: {% paginate %} This does not take any arguments, but does assume that you have already called autopaginate, so make sure to do so first. That's it! You have now paginated ``object_list`` and given users of the site a way to navigate between the different pages--all without touching your views. Optional Settings ------------------ In django-pagination, there are no required settings. There are, however, a small set of optional settings useful for changing the default behavior of the pagination tags. Here's an overview: ``PAGINATION_DEFAULT_PAGINATION`` The default amount of items to show on a page if no number is specified. ``PAGINATION_DEFAULT_WINDOW`` The number of items to the left and to the right of the current page to display (accounting for ellipses). ``PAGINATION_DEFAULT_ORPHANS`` The number of orphans allowed. According to the Django documentation, orphans are defined as:: The minimum number of items allowed on the last page, defaults to zero. ``PAGINATION_INVALID_PAGE_RAISES_404`` Determines whether an invalid page raises an ``Http404`` or just sets the ``invalid_page`` context variable. ``True`` does the former and ``False`` does the latter.django-pagination-1.0.5/._LICENSE.txt0000644000076500000240000000027011023407773016457 0ustar ericflostaffMac OS X  2ATTR  com.macromates.caretxR<[k0?'3/«django-pagination-1.0.5/LICENSE.txt0000644000076500000240000000276111023407773016251 0ustar ericflostaffCopyright (c) 2008, Eric Florenzano 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. django-pagination-1.0.5/pagination/0000755000076500000240000000000011115723655016553 5ustar ericflostaffdjango-pagination-1.0.5/pagination/.___init__.py0000644000076500000240000000027011023407773021076 0ustar ericflostaffMac OS X  2ATTR  com.macromates.caretxR<[k0?'3/«django-pagination-1.0.5/pagination/__init__.py0000644000076500000240000000000111023407773020651 0ustar ericflostaff django-pagination-1.0.5/pagination/locale/0000755000076500000240000000000011115723655020012 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/de/0000755000076500000240000000000011115723655020402 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/de/LC_MESSAGES/0000755000076500000240000000000011115723655022167 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/de/LC_MESSAGES/django.mo0000644000076500000240000000066411100276041023756 0ustar ericflostaff4L`af5onextpreviousProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2008-10-24 00:41-0700 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit weiterzurückdjango-pagination-1.0.5/pagination/locale/de/LC_MESSAGES/django.po0000644000076500000240000000144011100276036023756 0ustar ericflostaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-10-24 00:41-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: templates/pagination/pagination.html:5 #: templates/pagination/pagination.html:7 msgid "previous" msgstr "zurück" #: templates/pagination/pagination.html:21 #: templates/pagination/pagination.html:23 msgid "next" msgstr "weiter" django-pagination-1.0.5/pagination/locale/fr/0000755000076500000240000000000011115723655020421 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/fr/LC_MESSAGES/0000755000076500000240000000000011115723655022206 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/fr/LC_MESSAGES/django.mo0000644000076500000240000000070411100276041023770 0ustar ericflostaff4L`af>o nextpreviousProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2008-10-24 00:41-0700 PO-Revision-Date: 2008-10-19 10:19+0200 Last-Translator: Julien Demoor Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit suivanteprécédentedjango-pagination-1.0.5/pagination/locale/fr/LC_MESSAGES/._django.po0000644000076500000240000000057211100276036024217 0ustar ericflostaffMac OS X  2HzATTRI Pz%com.apple.metadata:kMDItemWhereFromsbplist00_`http://django-pagination.googlecode.com/issues/attachment?aid=2373999384177438596&name=django.po_>http://code.google.com/p/django-pagination/issues/detail?id=25 ndjango-pagination-1.0.5/pagination/locale/fr/LC_MESSAGES/django.po0000644000076500000240000000146411100276036024003 0ustar ericflostaff# django-pagination French translation. # Copyright (C) 2008, Julien Demoor # This file is distributed under the same license as the django-pagination package. # Julien Demoor , 2008 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-10-24 00:41-0700\n" "PO-Revision-Date: 2008-10-19 10:19+0200\n" "Last-Translator: Julien Demoor \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: templates/pagination/pagination.html:5 #: templates/pagination/pagination.html:7 msgid "previous" msgstr "précédente" #: templates/pagination/pagination.html:21 #: templates/pagination/pagination.html:23 msgid "next" msgstr "suivante" django-pagination-1.0.5/pagination/locale/pl/0000755000076500000240000000000011115723655020425 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/pl/LC_MESSAGES/0000755000076500000240000000000011115723655022212 5ustar ericflostaffdjango-pagination-1.0.5/pagination/locale/pl/LC_MESSAGES/django.mo0000644000076500000240000000066211100276041023777 0ustar ericflostaff4L`af-o  nextpreviousProject-Id-Version: 1.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-10-24 00:41-0700 PO-Revision-Date: 2008-10-20 20:52+0200 Last-Translator: Jarek Zgoda Language-Team: PL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit następnapoprzedniadjango-pagination-1.0.5/pagination/locale/pl/LC_MESSAGES/._django.po0000644000076500000240000000057311100276036024224 0ustar ericflostaffMac OS X  2I{ATTRI ={%com.apple.metadata:kMDItemWhereFromsbplist00_ahttp://django-pagination.googlecode.com/issues/attachment?aid=-2279539620633765597&name=django.po_>http://code.google.com/p/django-pagination/issues/detail?id=23 odjango-pagination-1.0.5/pagination/locale/pl/LC_MESSAGES/django.po0000644000076500000240000000147111100276036024005 0ustar ericflostaff# Polish translation of django-pagination. # Copyright (C) 2008, django-pagination team # This file is distributed under the same license as the django-pagination package. # Jarek Zgoda , 2008. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-10-24 00:41-0700\n" "PO-Revision-Date: 2008-10-20 20:52+0200\n" "Last-Translator: Jarek Zgoda \n" "Language-Team: PL \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: templates/pagination/pagination.html:5 #: templates/pagination/pagination.html:7 msgid "previous" msgstr "poprzednia" #: templates/pagination/pagination.html:21 #: templates/pagination/pagination.html:23 msgid "next" msgstr "następna" django-pagination-1.0.5/pagination/._middleware.py0000644000076500000240000000027211056306431021451 0ustar ericflostaffMac OS X  2ATTR+?%""com.macromates.caret{ column = 47; line = 8; }django-pagination-1.0.5/pagination/middleware.py0000644000076500000240000000060411056306431021233 0ustar ericflostaffclass PaginationMiddleware(object): """ Inserts a variable representing the current page onto the request object if it exists in either **GET** or **POST** portions of the request. """ def process_request(self, request): try: request.page = int(request.REQUEST['page']) except (KeyError, ValueError, TypeError): request.page = 1django-pagination-1.0.5/pagination/._models.py0000644000076500000240000000027111023407773020623 0ustar ericflostaffMac OS X  2ATTR!!com.macromates.caret{ column = 0; line = 1; }django-pagination-1.0.5/pagination/models.py0000644000076500000240000000000111023407773020375 0ustar ericflostaff django-pagination-1.0.5/pagination/templates/0000755000076500000240000000000011115723655020551 5ustar ericflostaffdjango-pagination-1.0.5/pagination/templates/pagination/0000755000076500000240000000000011115723655022702 5ustar ericflostaffdjango-pagination-1.0.5/pagination/templates/pagination/pagination.html0000644000076500000240000000173611076751505025731 0ustar ericflostaff{% if is_paginated %} {% load i18n %} {% endif %} django-pagination-1.0.5/pagination/templatetags/0000755000076500000240000000000011115723655021245 5ustar ericflostaffdjango-pagination-1.0.5/pagination/templatetags/.___init__.py0000644000076500000240000000027011023407772023567 0ustar ericflostaffMac OS X  2ATTRq  com.macromates.caretxR<[k0?'3/«django-pagination-1.0.5/pagination/templatetags/__init__.py0000644000076500000240000000000111023407772023342 0ustar ericflostaff django-pagination-1.0.5/pagination/templatetags/._pagination_tags.py0000644000076500000240000000027311115722101025166 0ustar ericflostaffMac OS X  2ATTR4 ##com.macromates.caret{ column = 75; line = 93; }django-pagination-1.0.5/pagination/templatetags/pagination_tags.py0000644000076500000240000002126611115722101024756 0ustar ericflostafftry: set except NameError: from sets import Set as set from django import template from django.http import Http404 from django.core.paginator import Paginator, InvalidPage from django.conf import settings register = template.Library() DEFAULT_PAGINATION = getattr(settings, 'PAGINATION_DEFAULT_PAGINATION', 20) DEFAULT_WINDOW = getattr(settings, 'PAGINATION_DEFAULT_WINDOW', 4) DEFAULT_ORPHANS = getattr(settings, 'PAGINATION_DEFAULT_ORPHANS', 0) INVALID_PAGE_RAISES_404 = getattr(settings, 'PAGINATION_INVALID_PAGE_RAISES_404', False) def do_autopaginate(parser, token): """ Splits the arguments to the autopaginate tag and formats them correctly. """ split = token.split_contents() as_index = None context_var = None for i, bit in enumerate(split): if bit == 'as': as_index = i break if as_index is not None: try: context_var = split[as_index + 1] except IndexError: raise template.TemplateSyntaxError("Context variable assignment " +\ "must take the form of {%% %r object.example_set.all ... as " +\ "context_var_name %%}" % split[0]) del split[as_index:as_index + 2] if len(split) == 2: return AutoPaginateNode(split[1]) elif len(split) == 3: return AutoPaginateNode(split[1], paginate_by=split[2], context_var=context_var) elif len(split) == 4: try: orphans = int(split[3]) except ValueError: raise template.TemplateSyntaxError(u'Got %s, but expected integer.' % split[3]) return AutoPaginateNode(split[1], paginate_by=split[2], orphans=orphans, context_var=context_var) else: raise template.TemplateSyntaxError('%r tag takes one required ' + \ 'argument and one optional argument' % split[0]) class AutoPaginateNode(template.Node): """ Emits the required objects to allow for Digg-style pagination. First, it looks in the current context for the variable specified, and using that object, it emits a simple ``Paginator`` and the current page object into the context names ``paginator`` and ``page_obj``, respectively. It will then replace the variable specified with only the objects for the current page. .. note:: It is recommended to use *{% paginate %}* after using the autopaginate tag. If you choose not to use *{% paginate %}*, make sure to display the list of available pages, or else the application may seem to be buggy. """ def __init__(self, queryset_var, paginate_by=DEFAULT_PAGINATION, orphans=DEFAULT_ORPHANS, context_var=None): self.queryset_var = template.Variable(queryset_var) if isinstance(paginate_by, int): self.paginate_by = paginate_by else: self.paginate_by = template.Variable(paginate_by) self.orphans = orphans self.context_var = context_var def render(self, context): key = self.queryset_var.var value = self.queryset_var.resolve(context) if isinstance(self.paginate_by, int): paginate_by = self.paginate_by else: paginate_by = self.paginate_by.resolve(context) paginator = Paginator(value, paginate_by, self.orphans) try: page_obj = paginator.page(context['request'].page) except InvalidPage: if INVALID_PAGE_RAISES_404: raise Http404('Invalid page requested. If DEBUG were set to ' + 'False, an HTTP 404 page would have been shown instead.') context[key] = [] context['invalid_page'] = True return u'' if self.context_var is not None: context[self.context_var] = page_obj.object_list else: context[key] = page_obj.object_list context['paginator'] = paginator context['page_obj'] = page_obj return u'' def paginate(context, window=DEFAULT_WINDOW): """ Renders the ``pagination/pagination.html`` template, resulting in a Digg-like display of the available pages, given the current page. If there are too many pages to be displayed before and after the current page, then elipses will be used to indicate the undisplayed gap between page numbers. Requires one argument, ``context``, which should be a dictionary-like data structure and must contain the following keys: ``paginator`` A ``Paginator`` or ``QuerySetPaginator`` object. ``page_obj`` This should be the result of calling the page method on the aforementioned ``Paginator`` or ``QuerySetPaginator`` object, given the current page. This same ``context`` dictionary-like data structure may also include: ``getvars`` A dictionary of all of the **GET** parameters in the current request. This is useful to maintain certain types of state, even when requesting a different page. """ try: paginator = context['paginator'] page_obj = context['page_obj'] page_range = paginator.page_range # First and last are simply the first *n* pages and the last *n* pages, # where *n* is the current window size. first = set(page_range[:window]) last = set(page_range[-window:]) # Now we look around our current page, making sure that we don't wrap # around. current_start = page_obj.number-1-window if current_start < 0: current_start = 0 current_end = page_obj.number-1+window if current_end < 0: current_end = 0 current = set(page_range[current_start:current_end]) pages = [] # If there's no overlap between the first set of pages and the current # set of pages, then there's a possible need for elusion. if len(first.intersection(current)) == 0: first_list = list(first) first_list.sort() second_list = list(current) second_list.sort() pages.extend(first_list) diff = second_list[0] - first_list[-1] # If there is a gap of two, between the last page of the first # set and the first page of the current set, then we're missing a # page. if diff == 2: pages.append(second_list[0] - 1) # If the difference is just one, then there's nothing to be done, # as the pages need no elusion and are correct. elif diff == 1: pass # Otherwise, there's a bigger gap which needs to be signaled for # elusion, by pushing a None value to the page list. else: pages.append(None) pages.extend(second_list) else: unioned = list(first.union(current)) unioned.sort() pages.extend(unioned) # If there's no overlap between the current set of pages and the last # set of pages, then there's a possible need for elusion. if len(current.intersection(last)) == 0: second_list = list(last) second_list.sort() diff = second_list[0] - pages[-1] # If there is a gap of two, between the last page of the current # set and the first page of the last set, then we're missing a # page. if diff == 2: pages.append(second_list[0] - 1) # If the difference is just one, then there's nothing to be done, # as the pages need no elusion and are correct. elif diff == 1: pass # Otherwise, there's a bigger gap which needs to be signaled for # elusion, by pushing a None value to the page list. else: pages.append(None) pages.extend(second_list) else: differenced = list(last.difference(current)) differenced.sort() pages.extend(differenced) to_return = { 'pages': pages, 'page_obj': page_obj, 'paginator': paginator, 'is_paginated': paginator.count > paginator.per_page, } if 'request' in context: getvars = context['request'].GET.copy() if 'page' in getvars: del getvars['page'] if len(getvars.keys()) > 0: to_return['getvars'] = "&%s" % getvars.urlencode() else: to_return['getvars'] = '' return to_return except KeyError, AttributeError: return {} register.inclusion_tag('pagination/pagination.html', takes_context=True)(paginate) register.tag('autopaginate', do_autopaginate) django-pagination-1.0.5/pagination/._tests.py0000644000076500000240000000027311100305510020462 0ustar ericflostaffMac OS X  2ATTR!##com.macromates.caret{ column = 73; line = 58; }django-pagination-1.0.5/pagination/tests.py0000644000076500000240000000437211100305510020251 0ustar ericflostaff""" >>> from django.core.paginator import Paginator >>> from pagination.templatetags.pagination_tags import paginate >>> from django.template import Template, Context >>> p = Paginator(range(15), 2) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2, 3, 4, 5, 6, 7, 8] >>> p = Paginator(range(17), 2) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> p = Paginator(range(19), 2) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2, 3, 4, None, 7, 8, 9, 10] >>> p = Paginator(range(21), 2) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2, 3, 4, None, 8, 9, 10, 11] # Testing orphans >>> p = Paginator(range(5), 2, 1) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2] >>> p = Paginator(range(21), 2, 1) >>> paginate({'paginator': p, 'page_obj': p.page(1)})['pages'] [1, 2, 3, 4, None, 7, 8, 9, 10] >>> t = Template("{% load pagination_tags %}{% autopaginate var 2 %}{% paginate %}") # WARNING: Please, please nobody read this portion of the code! >>> class GetProxy(object): ... def __iter__(self): yield self.__dict__.__iter__ ... def copy(self): return self ... def urlencode(self): return u'' ... def keys(self): return [] >>> class RequestProxy(object): ... page = 1 ... GET = GetProxy() >>> # ENDWARNING >>> t.render(Context({'var': range(21), 'request': RequestProxy()})) u'\\n\\n