Start using django_tables2 for table processing
This commit is contained in:
@@ -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
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -47,6 +47,8 @@ INSTALLED_APPS = [
|
||||
'rest_framework',
|
||||
'django_nose',
|
||||
'bootstrap3',
|
||||
'django_tables2',
|
||||
|
||||
]
|
||||
|
||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||
|
||||
@@ -47,6 +47,7 @@ INSTALLED_APPS = [
|
||||
'rest_framework',
|
||||
'django_nose',
|
||||
'bootstrap3',
|
||||
'django_tables2',
|
||||
]
|
||||
|
||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||
|
||||
Reference in New Issue
Block a user