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>
|
<h3>{% trans "Member applications" %}</h3>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<table class="table table-bordered table-hover">
|
{{ table|safe }}
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load django_tables2 %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
<div>
|
||||||
<a id="filter-collapser" href="#collapse-filters" data-toggle="collapse" class="btn btn-info">
|
<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()"/>
|
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-bordered table-hover">
|
{{ table|safe }}
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -49,39 +49,8 @@
|
|||||||
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
|
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-bordered table-hover">
|
|
||||||
<thead>
|
{{ table|safe }}
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
+41
-15
@@ -11,10 +11,14 @@ import json
|
|||||||
import requests
|
import requests
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from django_tables2 import RequestConfig
|
||||||
|
|
||||||
from members.models import Member, Request, Payment
|
from members.models import Member, Request, Payment
|
||||||
from members.forms import MemberForm, PaymentForm
|
from members.forms import MemberForm, PaymentForm
|
||||||
|
|
||||||
# Logger function, you can use the same idea when implementing other loggers to other apps
|
# 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__)
|
memberlogger = logging.getLogger(__name__)
|
||||||
logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH)
|
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
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@permission_required('members.change_member', login_url='/login')
|
@permission_required('members.change_member', login_url='/login')
|
||||||
def member_list(request, *args, **kwargs):
|
def member_list(request, *args, **kwargs):
|
||||||
members = Member.objects.all()
|
members = Member.objects.all()
|
||||||
|
|
||||||
member_list = []
|
table = MemberTable(members,
|
||||||
for member in members:
|
request=request,
|
||||||
obj = {'member': member, 'payment': None}
|
exclude=['id'],
|
||||||
member_payments = Payment.objects.filter(member=member.id)
|
attrs={'class': 'table table-bordered table-hover'},
|
||||||
if len(member_payments) > 0:
|
)
|
||||||
last_payment = member_payments.aggregate(Max('date'))
|
table.paginate(page=request.GET.get('page', 1), per_page=25)
|
||||||
print(last_payment)
|
table_html = convert_table_to_html(table, request)
|
||||||
|
|
||||||
obj['payment'] = last_payment['date__max']
|
|
||||||
|
|
||||||
member_list.append(obj)
|
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'member_list': member_list,
|
'table': table_html,
|
||||||
'member_count': len(member_list)
|
'member_count': len(members)
|
||||||
}
|
}
|
||||||
return render(request, 'member_list.html', context)
|
return render(request, 'member_list.html', context)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@permission_required('members.change_member', login_url='/login')
|
@permission_required('members.change_member', login_url='/login')
|
||||||
@@ -157,8 +165,16 @@ def member_delete(request, *args, **kwargs):
|
|||||||
def application_list(request, *args, **kwargs):
|
def application_list(request, *args, **kwargs):
|
||||||
applications = Request.objects.all()
|
applications = Request.objects.all()
|
||||||
application_count = len(applications)
|
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 = {
|
context = {
|
||||||
'application_list': applications,
|
'table': table_html,
|
||||||
'application_count': application_count
|
'application_count': application_count
|
||||||
}
|
}
|
||||||
return render(request, 'application_list.html', context)
|
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')
|
@permission_required('members.change_member', login_url='/login')
|
||||||
def payment_list(request, *args, **kwargs):
|
def payment_list(request, *args, **kwargs):
|
||||||
payments = Payment.objects.all()
|
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 = {
|
context = {
|
||||||
'payment_list': payments,
|
'table': table_html,
|
||||||
'payment_count': len(payments)
|
'payment_count': len(payments)
|
||||||
}
|
}
|
||||||
return render(request, 'payment_list.html', context)
|
return render(request, 'payment_list.html', context)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
|
|
||||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
|
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
|
||||||
import django
|
import django
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'sikweb.settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'sikweb.settings'
|
||||||
@@ -10,6 +11,7 @@ from django.conf import settings
|
|||||||
django.setup()
|
django.setup()
|
||||||
#django related stuff should be imported below this
|
#django related stuff should be imported below this
|
||||||
from members.models import Member, Request
|
from members.models import Member, Request
|
||||||
|
from infoscreen.models import ExternalImageInfoItem, Rotation, InfoInstance
|
||||||
from misc.namegenerator import generate_names
|
from misc.namegenerator import generate_names
|
||||||
MEMBERAMOUNT = 30
|
MEMBERAMOUNT = 30
|
||||||
MEMBERREQUESTAMOUNT = 3
|
MEMBERREQUESTAMOUNT = 3
|
||||||
|
|||||||
@@ -19,3 +19,4 @@ django-nose==1.4.4
|
|||||||
uWSGI==2.0.14
|
uWSGI==2.0.14
|
||||||
psycopg2==2.7.1
|
psycopg2==2.7.1
|
||||||
django-bootstrap3==8.2.3
|
django-bootstrap3==8.2.3
|
||||||
|
django-tables2==1.6.1
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ INSTALLED_APPS = [
|
|||||||
'rest_framework',
|
'rest_framework',
|
||||||
'django_nose',
|
'django_nose',
|
||||||
'bootstrap3',
|
'bootstrap3',
|
||||||
|
'django_tables2',
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ INSTALLED_APPS = [
|
|||||||
'rest_framework',
|
'rest_framework',
|
||||||
'django_nose',
|
'django_nose',
|
||||||
'bootstrap3',
|
'bootstrap3',
|
||||||
|
'django_tables2',
|
||||||
]
|
]
|
||||||
|
|
||||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||||
|
|||||||
Reference in New Issue
Block a user