"""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([ '{}'.format(reverse('karma_key_detail', args=[kk.key]), kk.key), kk.current_score, ]) return json_data