stats
[wolnelektury.git] / src / club / views.py
index 1ae16ce..177989e 100644 (file)
@@ -1,10 +1,11 @@
 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
+from datetime import date, timedelta
 from django.conf import settings
 from django.contrib.auth.decorators import login_required, permission_required
 from django.db.models import Sum
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
 from django.shortcuts import get_object_or_404, render
 from django.urls import reverse
 from django.utils.decorators import method_decorator
@@ -30,6 +31,7 @@ class ClubView(TemplateView):
 
 
 
+@method_decorator(never_cache, name='dispatch')
 class DonationStep1(UpdateView):
     queryset = models.Schedule.objects.filter(payed_at=None)
     form_class = forms.DonationStep1Form
@@ -46,6 +48,7 @@ class DonationStep1(UpdateView):
         return reverse('donation_step2', args=[self.object.key])
 
 
+@method_decorator(never_cache, name='dispatch')
 class DonationStep2(UpdateView):
     queryset = models.Schedule.objects.filter(payed_at=None)
     form_class = forms.DonationStep2Form
@@ -59,6 +62,17 @@ class DonationStep2(UpdateView):
         return c
 
 
+def set_monthly(request, key):
+    schedule = get_object_or_404(models.Schedule, payed_at=None, key=key)
+    if request.POST:
+        schedule.monthly = request.POST.get('monthly') == 'true'
+        schedule.save(update_fields=['monthly'])
+    return JsonResponse({
+        "amount": schedule.amount,
+        "monthly": schedule.monthly,
+    })
+    
+
 class JoinView(CreateView):
     form_class = forms.DonationStep1Form
     template_name = 'club/donation_step1.html'
@@ -254,12 +268,15 @@ def member_verify(request):
 @permission_required('club.schedule_view')
 def receipt(request):
     email = request.POST.get('email')
-    year = int(request.POST.get('year'))
+    try:
+        year = int(request.POST.get('year'))
+    except:
+        return HttpResponse('no content')
 
     receipt = models.PayUOrder.generate_receipt(email, year)
     if receipt:
         content, optout, payments = receipt
-    if not content:
+    else:
         return HttpResponse('no content')
     return HttpResponse(
         content,
@@ -269,3 +286,27 @@ def receipt(request):
         }
     )
 
+
+@permission_required('club.schedule_view')
+def stats(request):
+    acq = {}
+    today = date.today()
+    start = today - timedelta(365)
+    for schedule in models.Schedule.objects.filter(
+        payed_at__gte=start,
+    ):
+        d = schedule.payed_at.date()
+        m = schedule.method.replace('-', '_')
+        acq.setdefault(d, {})
+        acq[d].setdefault(m, 0)
+        acq[d][m] += schedule.amount
+        
+    days = []
+    d = today
+    while d >= start:
+        days.append((d.isoformat(), acq.get(d, {})))
+        d -= timedelta(1)
+
+    return render(request, 'club/stats.html',
+                  {'days': days})
+