Start using django_tables2 for table processing

This commit is contained in:
Jan Tuomi
2017-05-13 00:18:01 +03:00
parent 74746fc0de
commit 9a87ba56b5
9 changed files with 74 additions and 123 deletions
+21
View File
@@ -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
+1 -32
View File
@@ -7,38 +7,7 @@
<h3>{% trans "Member applications" %}</h3>
<div>
<table class="table table-bordered table-hover">
<thead>
<tr class="ui-widget-header">
<th>{% trans "Last name" %}</th>
<th>{% trans "First name" %}</th>
<th>{% trans "Email" %}</th>
<th>{% trans "AYY member" %}</th>
<th>{% trans "JAS recipient" %}</th>
<th>{% trans "Residence" %}</th>
<th>{% trans "Submitted" %}</th>
<th class="table-button-column">{% trans "Application count" %}: {{ application_count }}</th>
</tr>
</thead>
<tbody>
{% for application in application_list %}
<tr>
<td>{{ application.last_name }}</td>
<td>{{ application.first_name }}</td>
<td>{{ application.email }}</td>
<td>{{ application.AYY }}</td>
<td>{{ application.jas }}</td>
<td>{{ application.POR }}</td>
<td>{{ application.submitted }}</td>
<td class="table-button-column">
<a href="/members/accept_application/{{ application.id }}" class="btn btn-success">{% trans "Accept" %}</a>
<a href="/members/decline_application/{{ application.id }}" class="table-button btn btn-danger">{% trans "Decline" %}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ table|safe }}
</div>
</div>
{% endblock content %}
+3 -43
View File
@@ -2,6 +2,8 @@
{% load static %}
{% load i18n %}
{% load django_tables2 %}
{% block content %}
<div>
<a id="filter-collapser" href="#collapse-filters" data-toggle="collapse" class="btn btn-info">
@@ -49,49 +51,7 @@
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
</div>
</div>
<table class="table table-bordered table-hover">
<thead>
<tr class="ui-widget-header">
<th>{% trans "Last name" %}</th>
<th>{% trans "First name" %}</th>
<th>{% trans "Email" %}</th>
<th>{% trans "AYY member" %}</th>
<th>{% trans "JAS recipient" %}</th>
<th>{% trans "Residence" %}</th>
<th>{% trans "Added" %}</th>
<th>{% trans "Paid" %}</th>
<th class="table-button-column">{% trans "Member count" %}: {{ member_count }}</th>
</tr>
</thead>
<tbody>
{% for member_data in member_list %}
<tr>
<td>{{ member_data.member.last_name }}</td>
<td>{{ member_data.member.first_name }}</td>
<td>{{ member_data.member.email }}</td>
<td>{{ member_data.member.AYY }}</td>
<td>{{ member_data.member.jas }}</td>
<td>{{ member_data.member.POR }}</td>
<td>{{ member_data.member.created }}</td>
<td>
{% if member_data.payment %}
{{ member_data.payment.date }}
{% else %}
{% trans "No payment" %}
{% endif %}
</td>
<td class="table-button-column">
<a href="/members/edit/{{ member_data.member.id }}">
<input type="button" value="{% trans "Edit" %}" class="table-button btn btn-info" value="{% trans "Edit" %}" />
</a>
<a href="/members/delete_member_confirm/{{ member_data.member.id }}">
<input type="button" value="{% trans "Delete" %}" class="table-button btn btn-danger" />
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ table|safe }}
</div>
</div>
{% endblock content %}
+2 -33
View File
@@ -49,39 +49,8 @@
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
</div>
</div>
<table class="table table-bordered table-hover">
<thead>
<tr class="ui-widget-header">
<th>{% trans "Date" %}</th>
<th>{% trans "Source" %}</th>
<th>{% trans "Member information" %}</th>
<th class="table-button-column">{% trans "Payment count" %}: {{ payment_count }}</th>
</tr>
</thead>
<tbody>
{% for payment in payment_list %}
<tr>
<td>{{ payment.date }}</td>
<td>{{ payment.source }}</td>
<td>
{% if payment.member %}
{{ payment.member.last_name }} {{ payment.member.first_name }}, {{ payment.member.email }}
{% else %}
{% trans "No member data found" %}
{% endif %}
</td>
<td class="table-button-column">
<a href="/members/edit/{{ payment.id }}">
<input type="button" value="{% trans "Edit" %}" class="table-button btn btn-info" value="{% trans "Edit" %}" />
</a>
<a href="/members/delete_payment_confirm/{{ payment.id }}">
<input type="button" value="{% trans "Delete" %}" class="table-button btn btn-danger" />
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ table|safe }}
</div>
</div>
{% endblock content %}
+41 -15
View File
@@ -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)
+2
View File
@@ -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
+1
View File
@@ -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
+2
View File
@@ -47,6 +47,8 @@ INSTALLED_APPS = [
'rest_framework',
'django_nose',
'bootstrap3',
'django_tables2',
]
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
+1
View File
@@ -47,6 +47,7 @@ INSTALLED_APPS = [
'rest_framework',
'django_nose',
'bootstrap3',
'django_tables2',
]
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'