Show number of paid members in member list

Member filtering also applies to this feature. Moved 'last_paid' Subquery to Member method
This commit is contained in:
Aarni Halinen
2018-05-13 12:59:50 +03:00
parent 9e0d911f7b
commit 882732d054
4 changed files with 13 additions and 5 deletions
+7 -2
View File
@@ -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
+1 -2
View File
@@ -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)
+1 -1
View File
@@ -18,7 +18,7 @@
{% endif %}
<div class="member_count">
<span>{% trans "Members in register:" %} {{ member_count }}</span>
<span>{% trans "Members in register:" %} {{ member_count }} ({{ paid_count }})</span>
</div>
<div>
+4
View File
@@ -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)