Mercurial > hg > bts-webui
changeset 151:534af876ae6d draft
tables: use django Paginator object
This gives us free pagination in all the bug lists using table_widget,
basically everywhere.
author | diegoe-guest |
---|---|
date | Wed, 12 Aug 2009 20:52:01 +0000 |
parents | 5ba30ce86acd |
children | a1be2535c784 |
files | bts_webui/amancay/tables.py bts_webui/amancay/templates/table_widget.html |
diffstat | 2 files changed, 55 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/bts_webui/amancay/tables.py +++ b/bts_webui/amancay/tables.py @@ -1,11 +1,13 @@ # vim: set sw=4 ts=4 sts=4 noet: from django.http import HttpResponse +from django.core.paginator import Paginator, EmptyPage, InvalidPage from django.shortcuts import render_to_response from django.template import RequestContext from django.utils import simplejson from amancay.btsqueries import SoapQueries +PER_PAGE = 4 def _get_bug_list(request, view): """ Process the requested bug list corresponding to a given view. @@ -51,46 +53,64 @@ bugs = queries.get_tagged_bugs(user_emails) + # We use the django Paginator to divide objects in pages but note that + # the actual results are passed to the template as a separate list. + # This is because we would be wasting bandwidth in requesting all the + # objects again and again, only to feed them to the paginator and use its + # object_list property. + paginator = Paginator(bugs, PER_PAGE) + + try: + page = int(request.GET.get('page', '1')) + except ValueError: + page = 1 + + # If page request (9999) is out of range, deliver last page of results. + try: + page = paginator.page(page) + except (EmptyPage, InvalidPage): + page = paginator.page(paginator.num_pages) + + bugs = page.object_list if bugs: - bug_list = queries.get_bugs_status(bugs[:15]) + bug_list = queries.get_bugs_status(bugs) bug_list.sort(key=lambda x: x.package) - return bug_list + return {'bug_list': bug_list, + 'current_view': view, + 'page': page} def received_bugs(request): """ Render a table view for bugs we have received as maintainers. """ - bug_list = _get_bug_list(request, 'received_bugs') + data_dict = _get_bug_list(request, 'received_bugs') + data_dict['title'] = 'Latest received bugs' return render_to_response('table.html', - {'title': 'Latest received bugs', - 'bug_list': bug_list, - 'current_view': 'received_bugs'}, + data_dict, context_instance=RequestContext(request)) def submitted_bugs(request): """ Render a table view for bugs we have submitted ourselves. """ - bug_list = _get_bug_list(request, 'submitted_bugs') + data_dict = _get_bug_list(request, 'submitted_bugs') + data_dict['title'] = 'Latest submitted bugs' return render_to_response('table.html', - {'title': 'Latest submitted bugs', - 'bug_list': bug_list, - 'current_view': 'submitted_bugs'}, + data_dict, context_instance=RequestContext(request)) def selected_bugs(request): """ Render a table view for bugs we are watching. """ - bug_list = _get_bug_list(request, 'selected_bugs') + data_dict = _get_bug_list(request, 'selected_bugs') + data_dict['title'] = 'Latest selected bugs' return render_to_response('table.html', - {'title': 'Latest selected bugs', - 'bug_list': bug_list, - 'current_view': 'selected_bugs'}, + data_dict, context_instance=RequestContext(request)) def package_bugs(request): @@ -102,30 +122,28 @@ else: package_list = request.session.get('package_set', []) - bug_list = _get_bug_list(request, 'package_bugs') + data_dict = _get_bug_list(request, 'package_bugs') + data_dict['title'] = 'Latest bugs on selected packages' - for bug in bug_list: + for bug in data_dict['bug_list']: if bug.package in package_list: bug.pkg_fav = True else: bug.pkg_fav = False return render_to_response('table.html', - {'title': 'Latest bugs on selected packages', - 'bug_list': bug_list, - 'current_view': 'package_bugs'}, + data_dict, context_instance=RequestContext(request)) def tagged_bugs(request): """ Render a table view for bugs we have tagged. """ - bug_list = _get_bug_list(request, 'tagged_bugs') + data_dict = _get_bug_list(request, 'tagged_bugs') + data_dict['title'] = 'Latest tagged bugs' # TODO: fix this, bugs is a dict where every value is a dict of tags and # bugs associated to one mail return render_to_response('table.html', - {'title': 'Latest received bugs', - 'bug_list': bug_list, - 'current_view': 'tagged_bugs'}, + data_dict, context_instance=RequestContext(request))
--- a/bts_webui/amancay/templates/table_widget.html +++ b/bts_webui/amancay/templates/table_widget.html @@ -25,28 +25,26 @@ res.addCallback(toggle_star_cb, img, newimg); } </script> -<input id="current_view" type="hidden" value="{{ current_view }}" /> {% if bug_list %} <span class="table_title">{{ title }}</span> + <div class="pager"> - {% if pages %} - <span class="page_numbers">Pages: - <ul class="page_numbers" id="pager"> - {% for number in pages %} - {% ifequal number current_page %} - <li class="current">{{ number }}</li> - {% else %} - <li class="normal"><a href="{{ url }}&page={{number}}">{{ number }}</a></li> - {% endifequal %} - {% endfor %} - </ul> + <span class="page_numbers"> + {% if page.has_previous %} + <a href="?page={{ contacts.previous_page_number }}">« previous</a> + {% endif %} + + <span class="current"> + Page {{ page.number }} of {{ page.paginator.num_pages }} </span> + + {% if page.has_next %} + <a href="?page={{ page.next_page_number }}">next »</a> {% endif %} - {% if total_bugs %} - <span class="total_bugs">Found {{ total_bugs }} - {% ifequal total_bugs 1 %}bug{% else %}bugs{%endifequal%}</span> - {% endif %} + </span> + <span class="total_bugs">Found {{ page.paginator.count }} bugs</span> </div> + <table class="bugs"> <tr> <th></th>