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:
+7
-2
@@ -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
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user