Initial commit of server-side datatables. Filtering needs more work.

This commit is contained in:
Rick Backley 2017-08-26 10:34:21 -05:00
parent 690e0235d2
commit 66268dc733
6 changed files with 56 additions and 23 deletions

View File

@ -2,8 +2,8 @@
{% load static %}
{% block extra_media %}
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/t/bs/jqc-1.12.0,dt-1.10.11/datatables.min.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/t/bs/jqc-1.12.0,dt-1.10.11/datatables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs-3.3.7/jq-2.2.4/dt-1.10.15/datatables.min.css"/>
<script type="text/javascript" src="https://cdn.datatables.net/v/bs-3.3.7/jq-2.2.4/dt-1.10.15/datatables.min.js"></script>
{% endblock %}
{% block title %}karma{% endblock %}
@ -23,19 +23,14 @@
<th>Score</th>
</tr>
</tfoot>
<tbody>
{% for entry in entries %}
<tr>
<td><a href="{% url 'karma_key_detail' entry.key %}">{{ entry.key }}</a></td>
<td>{{ entry.score }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#karma').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "{% url 'karma_key_data_tables' %}",
"order": [[ 1, "desc" ]],
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
} );

View File

@ -3,14 +3,17 @@
from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter
from karma.views import key_detail, index, KarmaKeyViewSet
from karma.views import key_detail, IndexView, KarmaKeyViewSet, KarmaKeyListJson
router = DefaultRouter()
router.register(r'keys', KarmaKeyViewSet)
urlpatterns = [
url(r'^$', index, name='karma_index'),
url(r'^$', IndexView.as_view(), name='karma_index'),
url(r'^key/(?P<karma_key>.+)/', key_detail, name='karma_key_detail'),
url(r'^api/', include(router.urls)),
# json pages for DataTables
url(r'^datatables/key/$', KarmaKeyListJson.as_view(), name='karma_key_data_tables'),
]

View File

@ -2,7 +2,9 @@
import logging
from django.shortcuts import get_object_or_404, render
from django.shortcuts import get_object_or_404, render, reverse
from django.views.generic import TemplateView
from django_datatables_view.base_datatable_view import BaseDatatableView
from rest_framework import viewsets
from karma.models import KarmaKey
@ -11,11 +13,9 @@ from karma.serializers import KarmaKeySerializer
log = logging.getLogger('karma.views')
def index(request):
"""Display all karma keys."""
entries = KarmaKey.objects.all().order_by('key')
return render(request, 'karma/index.html', {'entries': entries})
class IndexView(TemplateView):
""" Routes to the index template using the generic view """
template_name = 'karma/index.html'
def key_detail(request, karma_key):
@ -30,3 +30,32 @@ class KarmaKeyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = KarmaKey.objects.all()
serializer_class = KarmaKeySerializer
class KarmaKeyListJson(BaseDatatableView):
""" Provide list of KarmaKeys in snazzy JSON format that DataTables enjoys """
model = KarmaKey
max_display_length = 500
columns = ['key', 'current_score']
# maintain order from columns
order_columns = ['key', 'current_score']
def get_initial_queryset(self):
""" Add another column that operates like score() """
return KarmaKey.objects.extra(select={
'current_score':
'SELECT SUM(kle.delta) FROM karma_karmalogentry kle WHERE kle.key_id = karma_karmakey.id'
})
def prepare_results(self, qs):
# prepare list with output column data
# queryset is already paginated here
json_data = []
for kk in qs:
json_data.append([
'<a href="{}">{}</a>'.format(reverse('karma_key_detail', args=[kk.key]), kk.key),
kk.current_score,
])
return json_data

View File

@ -4,11 +4,13 @@
#
# pip-compile --output-file requirements-dev.txt requirements-dev.in
#
appdirs==1.4.0 # via setuptools
astroid==1.4.9 # via pylint, pylint-celery, pylint-flask, pylint-plugin-utils, requirements-detector
backports.functools-lru-cache==1.4 # via jaraco.functools, pylint
click==6.7 # via pip-tools
configparser==3.5.0 # via pylint
django-adminplus==0.5
django-bootstrap3==8.1.0
django-datatables-view==1.14.0
django-extensions==1.7.6
django-registration-redux==1.4
django==1.10.5
@ -31,7 +33,6 @@ logilab-common==1.3.0
mccabe==0.6.1 # via prospector, pylint
more-itertools==2.5.0 # via irc, jaraco.functools, jaraco.itertools
oauthlib==2.0.1 # via requests-oauthlib
packaging==16.8 # via setuptools
parsedatetime==2.2
pep8-naming==0.4.1 # via prospector
pip-tools==1.8.0
@ -46,7 +47,6 @@ pylint-django==0.7.2 # via prospector
pylint-flask==0.5 # via prospector
pylint-plugin-utils==0.2.4 # via prospector, pylint-celery, pylint-django, pylint-flask
pylint==1.6.5 # via prospector, pylint-celery, pylint-common, pylint-django, pylint-flask, pylint-plugin-utils
pyparsing==2.1.10 # via packaging
python-dateutil==2.6.0
python-gitlab==0.18
python-mpd2==0.5.5
@ -56,10 +56,10 @@ requests-oauthlib==0.7.0 # via twython
requests==2.13.0 # via python-gitlab, requests-oauthlib, twython
requirements-detector==0.5.2 # via prospector
setoptconf==0.2.0 # via prospector
six==1.10.0 # via astroid, django-extensions, irc, jaraco.classes, jaraco.collections, jaraco.itertools, jaraco.logging, jaraco.stream, logilab-common, more-itertools, packaging, pip-tools, pylint, python-dateutil, python-gitlab, setuptools, tempora
six==1.10.0 # via astroid, django-extensions, irc, jaraco.classes, jaraco.collections, jaraco.itertools, jaraco.logging, jaraco.stream, logilab-common, more-itertools, pip-tools, pylint, python-dateutil, python-gitlab, tempora
tempora==1.6.1 # via irc, jaraco.logging
twython==3.4.0
wrapt==1.10.8 # via astroid
# The following packages are considered to be unsafe in a requirements file:
# setuptools # via logilab-common
# setuptools # via django-datatables-view, logilab-common

View File

@ -1,6 +1,7 @@
Django # core
django-adminplus # admin.site.register_view
django-bootstrap3 # bootstrap layout
django-datatables-view # easy server-side datatables
django-extensions # more commands
django-registration-redux # registration views/forms
djangorestframework # dispatch WS API

View File

@ -4,8 +4,10 @@
#
# pip-compile --output-file requirements.txt requirements.in
#
backports.functools-lru-cache==1.4 # via jaraco.functools
django-adminplus==0.5
django-bootstrap3==8.1.0
django-datatables-view==1.14.0
django-extensions==1.7.6
django-registration-redux==1.4
django==1.10.5
@ -33,3 +35,6 @@ requests==2.13.0 # via python-gitlab, requests-oauthlib, twython
six==1.10.0 # via django-extensions, irc, jaraco.classes, jaraco.collections, jaraco.itertools, jaraco.logging, jaraco.stream, more-itertools, python-dateutil, python-gitlab, tempora
tempora==1.6.1 # via irc, jaraco.logging
twython==3.4.0
# The following packages are considered to be unsafe in a requirements file:
# setuptools # via django-datatables-view