From eaa76ae7584d0938db0298714303e2c23b3eacfd Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 9 Sep 2010 13:36:41 -0500 Subject: Improve todo list view page Add total package count and incomplete package count columns. Also reduce the number of total queries by killing the query per row that was happening before. Signed-off-by: Dan McGee --- templates/todolists/list.html | 13 ++++++++++--- todolists/views.py | 15 ++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/templates/todolists/list.html b/templates/todolists/list.html index 29829caa..2e75bdac 100644 --- a/templates/todolists/list.html +++ b/templates/todolists/list.html @@ -20,6 +20,8 @@

Package Todo Lists

Creation Date Creator Description + Package Count + Incomplete Count Status @@ -31,8 +33,10 @@

Package Todo Lists

{{ list.date_added }} {{ list.creator.get_full_name }} {{ list.description|safe }} - {% if list.complete %}Complete - {% else %}Incomplete{% endif %} + {{ list.pkg_count }} + {{ list.incomplete_count }} + {% ifequal list.incomplete_count 0 %}Complete + {% else %}Incomplete{% endifequal %} {% endfor %} @@ -42,7 +46,10 @@

Package Todo Lists

{% endblock %} diff --git a/todolists/views.py b/todolists/views.py index e3663331..25186243 100644 --- a/todolists/views.py +++ b/todolists/views.py @@ -4,6 +4,7 @@ from django.core.mail import send_mail from django.shortcuts import get_object_or_404, redirect from django.contrib.auth.decorators import login_required, permission_required +from django.db.models import Count from django.views.decorators.cache import never_cache from django.views.generic.create_update import delete_object from django.views.generic.simple import direct_to_template @@ -53,10 +54,18 @@ def view(request, listid): @login_required @never_cache def list(request): - lists = Todolist.objects.select_related('creator').order_by('-date_added') + lists = Todolist.objects.select_related('creator').annotate( + pkg_count=Count('todolistpkg')).order_by('-date_added') + incomplete = Todolist.objects.filter(todolistpkg__complete=False).annotate( + Count('todolistpkg')).values_list('id', 'todolistpkg__count') + + # tag each list with an incomplete package count + lookup = {} + for k, v in incomplete: + lookup[k] = v for l in lists: - l.complete = TodolistPkg.objects.filter( - list=l.id,complete=False).count() == 0 + l.incomplete_count = lookup.get(l.id, 0) + return direct_to_template(request, 'todolists/list.html', {'lists': lists}) @permission_required('main.add_todolist') -- cgit v1.2.3-54-g00ecf