Merge branch 'develop' into 'master'
Member features into master Closes #103 See merge request vtmk/web2.0!117
This commit is contained in:
+6
-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
|
||||
|
||||
|
||||
@@ -125,6 +124,11 @@ 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')
|
||||
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
|
||||
|
||||
+7
-14
@@ -4,6 +4,7 @@ import django_tables2 as tables
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db.models import F, OuterRef, Subquery
|
||||
from django.utils import timezone
|
||||
|
||||
from members.models import Member, Payment, Request
|
||||
|
||||
@@ -15,10 +16,7 @@ class MemberTable(tables.Table):
|
||||
|
||||
options = tables.TemplateColumn(
|
||||
('<a class="data-table-button btn btn-primary" '
|
||||
'href="/members/edit/{{ record.id }}">') +
|
||||
_('Edit') +
|
||||
'</a>',
|
||||
verbose_name=""
|
||||
'href="/members/edit/{{ record.id }}">') + _('Edit') + '</a>', verbose_name=""
|
||||
)
|
||||
|
||||
class Meta:
|
||||
@@ -28,13 +26,12 @@ class MemberTable(tables.Table):
|
||||
|
||||
def render_last_paid(self, record):
|
||||
try:
|
||||
return record.payments.filter(member=record).latest('date').date.strftime('%e.%m.%Y %H:%M')
|
||||
return timezone.localtime(record.payments.filter(member=record).latest('date').date).strftime('%-d.%-m.%Y %H:%M')
|
||||
except ObjectDoesNotExist:
|
||||
return record.created.strftime('%e.%m.%Y %H:%M') + _(" (not paid)")
|
||||
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)
|
||||
|
||||
|
||||
@@ -45,9 +42,7 @@ class PaymentTable(tables.Table):
|
||||
|
||||
options = tables.TemplateColumn(
|
||||
('<a class="data-table-button btn btn-primary" '
|
||||
'href="/members/edit_payment/{{ record.id }}">') +
|
||||
_('Edit') +
|
||||
'</a>',
|
||||
'href="/members/edit_payment/{{ record.id }}">') + _('Edit') + '</a>',
|
||||
verbose_name=""
|
||||
)
|
||||
|
||||
@@ -62,9 +57,7 @@ class RequestTable(tables.Table):
|
||||
|
||||
options = tables.TemplateColumn(
|
||||
('<a class="data-table-button btn btn-primary" '
|
||||
'href="/members/edit_application/{{ record.id }}">') +
|
||||
_('Edit') +
|
||||
'</a>',
|
||||
'href="/members/edit_application/{{ record.id }}">') + _('Edit') + '</a>',
|
||||
verbose_name=""
|
||||
)
|
||||
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
{% extends "members:base.html" %}
|
||||
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
{% block content %}
|
||||
<div>
|
||||
<div>
|
||||
<h3>{% trans "Error" %}</h3>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-danger">
|
||||
{{ error|safe }}
|
||||
</div>
|
||||
<div>
|
||||
<button onclick="window.history.back();" class="btn btn-primary">{% trans "Back" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
@@ -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)
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ six==1.10.0
|
||||
django-suit==0.2.25
|
||||
telepot==12.3
|
||||
django-password-reset==1.0
|
||||
pyexcel==0.5.7
|
||||
pyexcel==0.5.8
|
||||
pyexcel-xlsx==0.5.5
|
||||
django-import-export==0.7.0
|
||||
openpyxl==2.4.11
|
||||
|
||||
@@ -24,9 +24,22 @@ else:
|
||||
LOGGERLEVEL = logging.DEBUG
|
||||
LOGPATH = os.path.join(BASE_DIR, "logs", "debug.log")
|
||||
|
||||
|
||||
def disable_pyexcel_logs(record):
|
||||
if record.module in ['loader', 'utils', 'source_plugin', 'plugin']:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'filters': {
|
||||
'disable_pyexcel_logs': {
|
||||
'()': 'django.utils.log.CallbackFilter',
|
||||
'callback': disable_pyexcel_logs
|
||||
},
|
||||
},
|
||||
'formatters': {
|
||||
'verbose': {
|
||||
'format': '%(levelname)s %(asctime)s %(module)s: %(message)s'
|
||||
@@ -43,6 +56,7 @@ LOGGING = {
|
||||
'level': 'DEBUG',
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'verbose',
|
||||
'filters': ['disable_pyexcel_logs'],
|
||||
},
|
||||
},
|
||||
'root': {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "members_base.html" %}
|
||||
{% extends "members:base.html" %}
|
||||
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
Reference in New Issue
Block a user