Merge branch 'develop' into 'master'

Member features into master

Closes #103

See merge request vtmk/web2.0!117
This commit is contained in:
Aarni Halinen
2018-05-13 13:35:50 +03:00
8 changed files with 34 additions and 37 deletions
+6 -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
@@ -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
View File
@@ -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=""
)
-18
View File
@@ -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 %}
+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)
+1 -1
View File
@@ -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
+14
View File
@@ -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 -1
View File
@@ -1,4 +1,4 @@
{% extends "members_base.html" %}
{% extends "members:base.html" %}
{% load static %}
{% load i18n %}