dr.botzo/karma/views.py

62 lines
1.9 KiB
Python

"""Present karma data."""
import logging
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
from karma.serializers import KarmaKeySerializer
log = logging.getLogger('karma.views')
class IndexView(TemplateView):
""" Routes to the index template using the generic view """
template_name = 'karma/index.html'
def key_detail(request, karma_key):
"""Display the requested karma key."""
entry = get_object_or_404(KarmaKey, key=karma_key.lower())
return render(request, 'karma/karma_key.html', {'entry': entry, 'entry_history': entry.history(mode='date')})
class KarmaKeyViewSet(viewsets.ReadOnlyModelViewSet):
"""Provide list and detail actions for karma keys."""
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