from django.contrib.auth import get_user_model from courses.models import Course from lms.global_decorators import transaction_decorator 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 django.shortcuts import redirect import csv from django.http import HttpResponse, HttpResponseForbidden from yandex_money.models import Payment from finance.models import Bill, Invoice from finance.serializers import BillSerializer, InvoiceSerializer from lms.tools import get_real_name import requests class BillListView(APIView): renderer_classes = (JSONRenderer,) @staticmethod def get(request): if request.user.is_authenticated: return Response( [BillSerializer(i).data for i in Bill.objects.filter(Q(user=request.user) | Q(opener=request.user))], status=200, ) return Response("Permission denied", status=403) @transaction_decorator def post(self, request): if request.user.is_authenticated and (request.user.groups.filter(name__in=['managers','lead_managers']).exists() or request.user.is_superuser): bill = request.JSON.get('bill') children = request.JSON.get('children', []) if bill: bill['user'] = get_user_model().objects.get(email=bill['user']) bill['opener'] = get_user_model().objects.get(email=bill['opener']) bill['course'] = Course.objects.get(title=bill['course'][0]) bill_obj, is_create = Bill.objects.update_or_create(**bill) invoices = bill_obj.invoice_set.all() for i in children: i['method'] = get_real_name(elem=i['method'][0], array=Invoice.BILL_METHOD) i['status'] = get_real_name(elem=i['status'][0], array=Invoice.BILL_STATUSES) i['bill'] = bill_obj i['yandex_pay'] = None invoice, _is_create = Invoice.objects.update_or_create(**i) if i['method'] == 'Y': yandex_pay, _is_create = Payment.objects.get_or_create( order_amount=i['price'], order_number=invoice.id, customer_number=bill_obj.user.id, user=bill_obj.user, cps_email=bill_obj.user.email, ) invoice.yandex_pay = yandex_pay invoice.save() invoices = [j for j in invoices if not j.id == invoice.id] [i.delete() for i in invoices] res = { "bill": BillSerializer(bill_obj).data, "children": [InvoiceSerializer(i).data for i in bill_obj.invoice_set.all()], } return Response(res, status=200) return Response("Bill not set", status=400) return Response("Course detail access only for manager users", status=403) class BillDetailView(APIView): renderer_classes = (JSONRenderer,) status_code = 200 def get(self, request, pk): if request.user.is_authenticated: try: bill = Bill.objects.get(id=pk) except Bill.DoesNotExist: return Response("Bill not found", status=404) res = { "bill": BillSerializer(bill).data, "children": [InvoiceSerializer(i).data for i in bill.invoice_set.all()], } return Response( res, status=self.status_code, ) return Response("Permission denied", status=403) class YandexPay(APIView): renderer_classes = (JSONRenderer,) @staticmethod def get(request, pk): try: pay = Payment.objects.get(id=pk) r = requests.post('https://money.yandex.ru/eshop.xml', data={ 'shopId': pay.shop_id, 'scid': pay.scid, 'sum': pay.order_amount, 'customerNumber': pay.customer_number, 'orderNumber': pay.order_number, 'cps_email': pay.cps_email, }) return redirect(r.url) except Payment.DoesNotExist: return Response('Payment not found', status=404) def get_invoices(request): 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 = "invoices" 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(method="Y", status="F") 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(['date', 'student_email', 'full_name', 'course', 'price', 'real_price', 'key']) for i in invoices.order_by('-date'): writer.writerow([ i.date, i.bill.user.email, i.bill.user.get_full_name(), i.bill.course.title, i.price, i.real_price, i.key, ]) return response