From 882732d0544bf40cc79f4ab093a4d643459f8a21 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sun, 13 May 2018 12:59:50 +0300 Subject: [PATCH 1/2] Show number of paid members in member list Member filtering also applies to this feature. Moved 'last_paid' Subquery to Member method --- members/models.py | 9 +++++++-- members/tables.py | 3 +-- members/templates/member_list.html | 2 +- members/views/members.py | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/members/models.py b/members/models.py index ff023b1..986c9d5 100644 --- a/members/models.py +++ b/members/models.py @@ -3,8 +3,7 @@ from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django.db.models import Q - +from django.db.models import Q, F, OuterRef, Subquery import csv @@ -126,5 +125,11 @@ class Member(BaseMember): return qs + def get_members_with_latest_payment(members_query): + """Return QuerySet of given members QS with last_paid attribute.""" + latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') + return members_query.annotate(last_paid=Subquery(latest.values('date')[:1])) + + # To avoid problems with a cyclical import, this is at the bottom of the file from members.forms import MemberForm # nopep8 diff --git a/members/tables.py b/members/tables.py index a8f65e0..89ecca1 100644 --- a/members/tables.py +++ b/members/tables.py @@ -31,8 +31,7 @@ class MemberTable(tables.Table): return timezone.localtime(record.created).strftime('%-d.%-m.%Y %H:%M') + _(" (not paid)") def order_last_paid(self, queryset, is_descending): - latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') - queryset = queryset.annotate(last_paid=Subquery(latest.values('date')[:1])).order_by(('-' if is_descending else '') + 'last_paid') + queryset = Member.get_members_with_latest_payment(queryset).order_by(('-' if is_descending else '') + 'last_paid') return (queryset, True) diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 8b65bb6..6952362 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -18,7 +18,7 @@ {% endif %}
- {% trans "Members in register:" %} {{ member_count }} + {% trans "Members in register:" %} {{ member_count }} ({{ paid_count }})
diff --git a/members/views/members.py b/members/views/members.py index 4ae9a6b..3589c52 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -7,6 +7,7 @@ from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpRe from django.core.mail import send_mail from django.conf import settings from django.utils.translation import ugettext as _ +from django.utils import timezone from django.forms.models import model_to_dict from dal import autocomplete @@ -44,9 +45,12 @@ def member_list(request, *args, **kwargs): table.paginate(page=request.GET.get('page', 1), per_page=25) table_html = convert_table_to_html(table, request) + + queryset = Member.get_members_with_latest_payment(members) context = { 'table': table_html, 'member_count': len(members), + 'paid_count': len(queryset.exclude(last_paid = None)), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context) From 7aff7c46ee47ef02e4015830845cf85adfd6f718 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sun, 13 May 2018 13:06:19 +0300 Subject: [PATCH 2/2] Fix pycodestyle --- members/models.py | 1 - members/views/members.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/members/models.py b/members/models.py index 986c9d5..64856ba 100644 --- a/members/models.py +++ b/members/models.py @@ -124,7 +124,6 @@ class Member(BaseMember): qs = qs.filter(Q(first_name__icontains=term) | Q(last_name__icontains=term)) return qs - def get_members_with_latest_payment(members_query): """Return QuerySet of given members QS with last_paid attribute.""" latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') diff --git a/members/views/members.py b/members/views/members.py index 3589c52..00a2122 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -50,7 +50,7 @@ def member_list(request, *args, **kwargs): context = { 'table': table_html, 'member_count': len(members), - 'paid_count': len(queryset.exclude(last_paid = None)), + 'paid_count': len(queryset.exclude(last_paid=None)), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context)