From c1dff215cd68f192272a2e3056cde1f09b1d6ad7 Mon Sep 17 00:00:00 2001 From: yomguy Date: Sat, 30 Apr 2011 00:43:38 +0200 Subject: [PATCH] add paginator to item and collection listing --- telemeta/htdocs/css/telemeta.css | 6 +-- telemeta/templates/telemeta/paginator.html | 1 + .../telemeta_default/collection_list.html | 4 +- .../telemeta_default/inc/collection_list.html | 3 +- .../telemeta_default/inc/mediaitem_list.html | 3 +- .../telemeta_default/mediaitem_list.html | 2 +- .../templates/telemeta_default/paginator.html | 23 ++++++++++ telemeta/templatetags/paginator.py | 43 +++++++++++++++++++ telemeta/templatetags/telemeta_utils.py | 35 +++++++++++++++ 9 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 telemeta/templates/telemeta/paginator.html create mode 100644 telemeta/templates/telemeta_default/paginator.html create mode 100644 telemeta/templatetags/paginator.py diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index 92f32905..5765ecfb 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -678,16 +678,16 @@ dl.dublincore dd.caption { margin-top: .7em; margin-bottom: .3em; padding: .3em 0; - font-size: .9em; + font-size: 1em; background-color: #fff; border-bottom: 1px solid #aaa; color: #333; font-weight: bold; } .pagination a { - background-color: #eee; + background-color: #fff; border-bottom: none; - font-size: .9em; + font-size: 1em; padding: .3em; } diff --git a/telemeta/templates/telemeta/paginator.html b/telemeta/templates/telemeta/paginator.html new file mode 100644 index 00000000..98e2779c --- /dev/null +++ b/telemeta/templates/telemeta/paginator.html @@ -0,0 +1 @@ +{% extends "telemeta_default/paginator.html" %} diff --git a/telemeta/templates/telemeta_default/collection_list.html b/telemeta/templates/telemeta_default/collection_list.html index 20bd60e8..6bff068e 100644 --- a/telemeta/templates/telemeta_default/collection_list.html +++ b/telemeta/templates/telemeta_default/collection_list.html @@ -5,9 +5,9 @@ {% block head_title %}{% trans "Media Collections" %} - {{ block.super }}{% endblock %} {% block title%} -

{% trans "Media Collections" %}

+

{% trans "Media Collections" %}

{% endblock %} -{% block title_buttons %} +{% block title_buttons %} {% trans "All" %} {% trans "Unpublished" %} {% trans "Published" %} diff --git a/telemeta/templates/telemeta_default/inc/collection_list.html b/telemeta/templates/telemeta_default/inc/collection_list.html index 84f7e100..e81c9b3f 100644 --- a/telemeta/templates/telemeta_default/inc/collection_list.html +++ b/telemeta/templates/telemeta_default/inc/collection_list.html @@ -5,8 +5,7 @@

{% blocktrans %}Collections {{ first_on_page }} to {{ last_on_page }} on {{ hits }}{% endblocktrans %}    -{% if has_previous %} << {% endif %} -{% if has_next %} >> {% endif %} +{% if is_paginated %}{% load paginator %}{% paginator 5 %}{% endif %}

{% endif %} diff --git a/telemeta/templates/telemeta_default/inc/mediaitem_list.html b/telemeta/templates/telemeta_default/inc/mediaitem_list.html index 6c3ae692..01b7826a 100644 --- a/telemeta/templates/telemeta_default/inc/mediaitem_list.html +++ b/telemeta/templates/telemeta_default/inc/mediaitem_list.html @@ -5,8 +5,7 @@

{% blocktrans %}Items {{ first_on_page }} to {{ last_on_page }} on {{ hits }}{% endblocktrans %}    -{% if has_previous %} << {% endif %} -{% if has_next %} >> {% endif %} +{% if is_paginated %}{% load paginator %}{% paginator 5 %}{% endif %}

{% endif %} diff --git a/telemeta/templates/telemeta_default/mediaitem_list.html b/telemeta/templates/telemeta_default/mediaitem_list.html index ba4c6767..c83cc57a 100644 --- a/telemeta/templates/telemeta_default/mediaitem_list.html +++ b/telemeta/templates/telemeta_default/mediaitem_list.html @@ -5,7 +5,7 @@ {% block head_title %}{% trans "Media Items" %} - {{ block.super }}{% endblock %} {% block title %} -

{% trans "Media Items" %}

+

{% trans "Media Items" %}

{% endblock %} {% block title_buttons %} {% if user.is_authenticated and perms.telemeta.add_mediaitem %} diff --git a/telemeta/templates/telemeta_default/paginator.html b/telemeta/templates/telemeta_default/paginator.html new file mode 100644 index 00000000..415d5fa2 --- /dev/null +++ b/telemeta/templates/telemeta_default/paginator.html @@ -0,0 +1,23 @@ +{% load i18n %} + +{% if has_previous %} + < {% trans "Previous" %} +{% endif %} + +{% if show_first %} +1 ... +{% endif %} +{% for linkpage in page_numbers %} + {% ifequal linkpage page %} + {{ page }} + {% else %} + {{ linkpage }} + {% endifequal %} +{% endfor %} +{% if show_last %} + ... + {{ pages }} +{% endif %} +{% if has_next %} + {% trans "Next" %} > +{% endif %} diff --git a/telemeta/templatetags/paginator.py b/telemeta/templatetags/paginator.py new file mode 100644 index 00000000..9abee1b6 --- /dev/null +++ b/telemeta/templatetags/paginator.py @@ -0,0 +1,43 @@ +from django import template + +register = template.Library() + +def paginator(context, adjacent_pages=2): + """ + To be used in conjunction with the object_list generic view. + + Adds pagination context variables for use in displaying first, adjacent and + last page links in addition to those created by the object_list generic + view. + + Thanks to tummy.com, ltd. + http://www.tummy.com/Community/Articles/django-pagination/ + + """ + startPage = max(context['page'] - adjacent_pages, 1) + if startPage <= 3: startPage = 1 + endPage = context['page'] + adjacent_pages + 1 + if endPage >= context['pages'] - 1: endPage = context['pages'] + 1 + page_numbers = [n for n in range(startPage, endPage) \ + if n > 0 and n <= context['pages']] + page_obj = context['page_obj'] + paginator = context['paginator'] + + return { + 'page_obj': page_obj, + 'paginator': paginator, + 'hits': context['hits'], + 'results_per_page': context['results_per_page'], + 'page': context['page'], + 'pages': context['pages'], + 'page_numbers': page_numbers, + 'next': context['next'], + 'previous': context['previous'], + 'has_next': context['has_next'], + 'has_previous': context['has_previous'], + 'show_first': 1 not in page_numbers, + 'show_last': context['pages'] not in page_numbers, + } + +register.inclusion_tag('telemeta_default/paginator.html', takes_context=True)(paginator) + diff --git a/telemeta/templatetags/telemeta_utils.py b/telemeta/templatetags/telemeta_utils.py index f5984e51..b9bceb08 100644 --- a/telemeta/templatetags/telemeta_utils.py +++ b/telemeta/templatetags/telemeta_utils.py @@ -291,4 +291,39 @@ def set_var(parser, token): raise template.TemplateSyntaxError("'set' tag must be of the form: {% set = %}") return SetVarNode(parts[1], parts[3]) +def paginator(context, adjacent_pages=2): + """ + To be used in conjunction with the object_list generic view. + + Adds pagination context variables for use in displaying first, adjacent and + last page links in addition to those created by the object_list generic + view. + + """ + startPage = max(context['page'] - adjacent_pages, 1) + if startPage <= 3: startPage = 1 + endPage = context['page'] + adjacent_pages + 1 + if endPage >= context['pages'] - 1: endPage = context['pages'] + 1 + page_numbers = [n for n in range(startPage, endPage) \ + if n > 0 and n <= context['pages']] + page_obj = context['page_obj'] + paginator = context['paginator'] + + return { + 'page_obj': page_obj, + 'paginator': paginator, + 'hits': context['hits'], + 'results_per_page': context['results_per_page'], + 'page': context['page'], + 'pages': context['pages'], + 'page_numbers': page_numbers, + 'next': context['next'], + 'previous': context['previous'], + 'has_next': context['has_next'], + 'has_previous': context['has_previous'], + 'show_first': 1 not in page_numbers, + 'show_last': context['pages'] not in page_numbers, + } + +register.inclusion_tag('paginator.html', takes_context=True)(paginator) -- 2.39.5