diff --git a/members/tables.py b/members/tables.py new file mode 100644 index 0000000..484c913 --- /dev/null +++ b/members/tables.py @@ -0,0 +1,21 @@ +import django_tables2 as tables + +from members.models import Member, Payment, Request + + +class MemberTable(tables.Table): + + class Meta: + model = Member + + +class PaymentTable(tables.Table): + + class Meta: + model = Payment + + +class RequestTable(tables.Table): + + class Meta: + model = Request diff --git a/members/templates/application_list.html b/members/templates/application_list.html index e8442f8..929c882 100644 --- a/members/templates/application_list.html +++ b/members/templates/application_list.html @@ -7,38 +7,7 @@

{% trans "Member applications" %}

- - - - - - - - - - - - - - - {% for application in application_list %} - - - - - - - - - - - - {% endfor %} - -
{% trans "Last name" %}{% trans "First name" %}{% trans "Email" %}{% trans "AYY member" %}{% trans "JAS recipient" %}{% trans "Residence" %}{% trans "Submitted" %}{% trans "Application count" %}: {{ application_count }}
{{ application.last_name }}{{ application.first_name }}{{ application.email }}{{ application.AYY }}{{ application.jas }}{{ application.POR }}{{ application.submitted }} - {% trans "Accept" %} - {% trans "Decline" %} -
+ {{ table|safe }}
{% endblock content %} diff --git a/members/templates/member_list.html b/members/templates/member_list.html index 54a67c3..bca9fe7 100644 --- a/members/templates/member_list.html +++ b/members/templates/member_list.html @@ -2,6 +2,8 @@ {% load static %} {% load i18n %} +{% load django_tables2 %} + {% block content %}
@@ -49,49 +51,7 @@
- - - - - - - - - - - - - - - - {% for member_data in member_list %} - - - - - - - - - - - - {% endfor %} - -
{% trans "Last name" %}{% trans "First name" %}{% trans "Email" %}{% trans "AYY member" %}{% trans "JAS recipient" %}{% trans "Residence" %}{% trans "Added" %}{% trans "Paid" %}{% trans "Member count" %}: {{ member_count }}
{{ member_data.member.last_name }}{{ member_data.member.first_name }}{{ member_data.member.email }}{{ member_data.member.AYY }}{{ member_data.member.jas }}{{ member_data.member.POR }}{{ member_data.member.created }} - {% if member_data.payment %} - {{ member_data.payment.date }} - {% else %} - {% trans "No payment" %} - {% endif %} - - - - - - - -
+ {{ table|safe }} {% endblock content %} diff --git a/members/templates/payment_list.html b/members/templates/payment_list.html index 1d4024e..236e902 100644 --- a/members/templates/payment_list.html +++ b/members/templates/payment_list.html @@ -49,39 +49,8 @@ - - - - - - - - - - - {% for payment in payment_list %} - - - - - - - {% endfor %} - -
{% trans "Date" %}{% trans "Source" %}{% trans "Member information" %}{% trans "Payment count" %}: {{ payment_count }}
{{ payment.date }}{{ payment.source }} - {% if payment.member %} - {{ payment.member.last_name }} {{ payment.member.first_name }}, {{ payment.member.email }} - {% else %} - {% trans "No member data found" %} - {% endif %} - - - - - - - -
+ + {{ table|safe }} {% endblock content %} diff --git a/members/views.py b/members/views.py index c0bb194..4fb67e7 100644 --- a/members/views.py +++ b/members/views.py @@ -11,10 +11,14 @@ import json import requests import logging +from django_tables2 import RequestConfig + from members.models import Member, Request, Payment from members.forms import MemberForm, PaymentForm # Logger function, you can use the same idea when implementing other loggers to other apps +from members.tables import MemberTable, PaymentTable, RequestTable + memberlogger = logging.getLogger(__name__) logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH) @@ -48,30 +52,34 @@ def send_mail_wrapper(subject, message): ) +def convert_table_to_html(table, request): + table_as_html = table.as_html(request) + path = request.path + + fixed = table_as_html.replace(r'href="?', r'href="{}?'.format(path)) + return fixed + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def member_list(request, *args, **kwargs): members = Member.objects.all() - member_list = [] - for member in members: - obj = {'member': member, 'payment': None} - member_payments = Payment.objects.filter(member=member.id) - if len(member_payments) > 0: - last_payment = member_payments.aggregate(Max('date')) - print(last_payment) - - obj['payment'] = last_payment['date__max'] - - member_list.append(obj) + table = MemberTable(members, + request=request, + exclude=['id'], + attrs={'class': 'table table-bordered table-hover'}, + ) + table.paginate(page=request.GET.get('page', 1), per_page=25) + table_html = convert_table_to_html(table, request) context = { - 'member_list': member_list, - 'member_count': len(member_list) + 'table': table_html, + 'member_count': len(members) } return render(request, 'member_list.html', context) + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') @@ -157,8 +165,16 @@ def member_delete(request, *args, **kwargs): def application_list(request, *args, **kwargs): applications = Request.objects.all() application_count = len(applications) + table = RequestTable(applications, + request=request, + exclude=['id'], + attrs={'class': 'table table-bordered table-hover'}, + ) + + table.paginate(page=request.GET.get('page', 1), per_page=25) + table_html = convert_table_to_html(table, request) context = { - 'application_list': applications, + 'table': table_html, 'application_count': application_count } return render(request, 'application_list.html', context) @@ -203,8 +219,18 @@ def application_form_success(request, *args, **kwargs): @permission_required('members.change_member', login_url='/login') def payment_list(request, *args, **kwargs): payments = Payment.objects.all() + + table = PaymentTable(payments, + request=request, + exclude=['id'], + attrs={'class': 'table table-bordered table-hover'}, + ) + + table.paginate(page=request.GET.get('page', 1), per_page=25) + table_html = convert_table_to_html(table, request) + context = { - 'payment_list': payments, + 'table': table_html, 'payment_count': len(payments) } return render(request, 'payment_list.html', context) diff --git a/misc/create_dummydata.py b/misc/create_dummydata.py index d694dd2..c989d8a 100644 --- a/misc/create_dummydata.py +++ b/misc/create_dummydata.py @@ -2,6 +2,7 @@ import sys import os import time import random + sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) import django os.environ['DJANGO_SETTINGS_MODULE'] = 'sikweb.settings' @@ -10,6 +11,7 @@ from django.conf import settings django.setup() #django related stuff should be imported below this from members.models import Member, Request +from infoscreen.models import ExternalImageInfoItem, Rotation, InfoInstance from misc.namegenerator import generate_names MEMBERAMOUNT = 30 MEMBERREQUESTAMOUNT = 3 diff --git a/requirements.txt b/requirements.txt index a334cb6..ff27176 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ django-nose==1.4.4 uWSGI==2.0.14 psycopg2==2.7.1 django-bootstrap3==8.2.3 +django-tables2==1.6.1 diff --git a/sikweb/settings-docker-sample.py b/sikweb/settings-docker-sample.py index 0ac2afa..e459656 100644 --- a/sikweb/settings-docker-sample.py +++ b/sikweb/settings-docker-sample.py @@ -47,6 +47,8 @@ INSTALLED_APPS = [ 'rest_framework', 'django_nose', 'bootstrap3', + 'django_tables2', + ] TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' diff --git a/sikweb/settings-sample.py b/sikweb/settings-sample.py index 939a7b7..ca09aee 100644 --- a/sikweb/settings-sample.py +++ b/sikweb/settings-sample.py @@ -47,6 +47,7 @@ INSTALLED_APPS = [ 'rest_framework', 'django_nose', 'bootstrap3', + 'django_tables2', ] TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'