diff --git a/access/init_group.py b/access/init_group.py index 79cf9bd..cbf81f0 100644 --- a/access/init_group.py +++ b/access/init_group.py @@ -16,4 +16,5 @@ if __name__ == '__main__': Group.objects.get_or_create(name='curators') Group.objects.get_or_create(name='partners') Group.objects.get_or_create(name='supports') + Group.objects.get_or_create(name='finance') Group.objects.get_or_create(name='project_managers') \ No newline at end of file diff --git a/finance/models.py b/finance/models.py index bde80ae..4ccff33 100755 --- a/finance/models.py +++ b/finance/models.py @@ -53,6 +53,7 @@ class Invoice(models.Model): blank=True, editable=False) bill = models.ForeignKey(to=Bill, verbose_name="Связный счёт") is_open = models.BooleanField(default=True, verbose_name="Открывает ли платёж курс") + date = models.DateTimeField(auto_now_add=True) def __str__(self): return '%s:%s %s' % (self.id, self.get_status_display(), self.bill.user) diff --git a/finance/views.py b/finance/views.py index f154040..bd295ed 100644 --- a/finance/views.py +++ b/finance/views.py @@ -7,6 +7,8 @@ from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from django.db.models import Q from django.shortcuts import redirect +import csv +from django.http import HttpResponse, HttpResponseForbidden from yandex_money.models import Payment from finance.models import Bill, Invoice @@ -118,3 +120,36 @@ class YandexPay(APIView): return Response('Payment not found', status=404) +def get_pay_stat(request, pk): + if not request.user.is_authenticated and (request.user.groups.filter(name="finance") or request.user.is_superuser): + return HttpResponseForbidden() + + date_from = request.GET.get('from', None) + date_to = request.GET.get('to', None) + + file_name = "teacher_%s" % pk + file_name = file_name + "__from_%s" % date_from if date_from else file_name + file_name = file_name + "__to_%s" % date_to if date_to else file_name + + invoices = Invoice.objects.filter() + invoices = invoices.filter(date__lt=date_to) if date_to else invoices + invoices = invoices.filter(date__gte=date_from) if date_from else invoices + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="%s"' % file_name + + writer = csv.writer(response) + writer.writerow(['student_email', 'full_name', 'course', 'theme', 'task_id', 'date']) + + for i in invoices.order_by('-date'): + student = get_user_model().objects.get(id=i.thread.key.split('user_')[1].split('__vertex')[0]) + writer.writerow([ + student.email, + student.get_full_name(), + i.content_object.course.title, + i.content_object.vertex_set.all()[0].title, + i.content_object.id, + i.date.date() + ]) + + return response \ No newline at end of file diff --git a/journals/urls.py b/journals/urls.py index 54907b2..e763d07 100644 --- a/journals/urls.py +++ b/journals/urls.py @@ -3,5 +3,6 @@ from journals import views as views urlpatterns = [ url(r'thread/$', views.ThreadAdminListView.as_view()), + url(r'pay-stat/([0-9]{1,99})/$', views.get_pay_stat), url(r'thread/(?P[-\w]+)/$', views.ThreadDetailView.as_view()), ] \ No newline at end of file diff --git a/journals/views.py b/journals/views.py index 3bb9d2b..89964f4 100644 --- a/journals/views.py +++ b/journals/views.py @@ -1,10 +1,11 @@ +from django.contrib.auth import get_user_model from rest_framework.views import APIView from rest_framework.renderers import JSONRenderer from rest_framework.response import Response -from django.db.models import Q -from lms.global_decorators import transaction_decorator +import csv +from django.http import HttpResponse, HttpResponseForbidden -from journals.models import Thread +from journals.models import Thread, Journal from journals.serilizers import ThreadDetailSerializer, ThreadAdminSerializer @@ -31,9 +32,9 @@ class ThreadDetailView(APIView): thread.x = request.JSON.get('x', thread.x) thread.y = request.JSON.get('y', thread.y) thread.save() - return Response(ThreadAdminSerializer(thread).data, self.status_code,) + return Response(ThreadAdminSerializer(thread).data, self.status_code, ) except Thread.DoesNotExist: - return Response("Thread doesn't exist.", self.status_code,) + return Response("Thread doesn't exist.", self.status_code, ) @staticmethod def get(request, key): @@ -44,4 +45,39 @@ class ThreadDetailView(APIView): return Response("permission denied", status=403) except Thread.DoesNotExist: - return Response("Thread not found", status=404) \ No newline at end of file + return Response("Thread not found", status=404) + + +def get_pay_stat(request, pk): + if not request.user.is_authenticated and (request.user.groups.filter(name="supports") or request.user.is_superuser): + return HttpResponseForbidden() + + date_from = request.GET.get('from', None) + date_to = request.GET.get('to', None) + + file_name = "teacher_%s" % pk + file_name = file_name + "__from_%s" % date_from if date_from else file_name + file_name = file_name + "__to_%s" % date_to if date_to else file_name + + journals = Journal.objects.filter(user_id=pk, action_type="yes") + journals = journals.filter(date__lt=date_to) if date_to else journals + journals = journals.filter(date__gte=date_from) if date_from else journals + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="%s"' % file_name + + writer = csv.writer(response) + writer.writerow(['student_email', 'full_name', 'course', 'theme', 'task_id', 'date']) + + for i in journals.order_by('-date'): + student = get_user_model().objects.get(id=i.thread.key.split('user_')[1].split('__vertex')[0]) + writer.writerow([ + student.email, + student.get_full_name(), + i.content_object.course.title, + i.content_object.vertex_set.all()[0].title, + i.content_object.id, + i.date.date() + ]) + + return response