From 347455ced756bde231a2ef1abe3bd148a9fc9d4c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 8 Nov 2017 18:11:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_v1/urls.py | 1 + finance/migrations/0007_auto_20171108_1433.py | 20 +++ finance/migrations/0008_auto_20171108_1435.py | 20 +++ finance/models.py | 4 +- finance/serializers.py | 27 ++++ finance/urls.py | 29 +---- finance/views.py | 120 ++++++++++++------ 7 files changed, 158 insertions(+), 63 deletions(-) create mode 100644 finance/migrations/0007_auto_20171108_1433.py create mode 100644 finance/migrations/0008_auto_20171108_1435.py create mode 100644 finance/serializers.py mode change 100755 => 100644 finance/urls.py mode change 100755 => 100644 finance/views.py diff --git a/api_v1/urls.py b/api_v1/urls.py index 5a61b11..a846ccd 100644 --- a/api_v1/urls.py +++ b/api_v1/urls.py @@ -5,4 +5,5 @@ urlpatterns = [ url(r'users/', include('access.urls')), url(r'journals/', include('journals.urls')), url(r'library/', include('library.urls')), + url(r'finance/', include('finance.urls')), ] \ No newline at end of file diff --git a/finance/migrations/0007_auto_20171108_1433.py b/finance/migrations/0007_auto_20171108_1433.py new file mode 100644 index 0000000..0b57dd7 --- /dev/null +++ b/finance/migrations/0007_auto_20171108_1433.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-11-08 14:33 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0006_remove_invoice_out_id'), + ] + + operations = [ + migrations.RenameField( + model_name='invoice', + old_name='bill_method', + new_name='method', + ), + ] diff --git a/finance/migrations/0008_auto_20171108_1435.py b/finance/migrations/0008_auto_20171108_1435.py new file mode 100644 index 0000000..86c70d4 --- /dev/null +++ b/finance/migrations/0008_auto_20171108_1435.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-11-08 14:35 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0007_auto_20171108_1433'), + ] + + operations = [ + migrations.AlterField( + model_name='invoice', + name='key', + field=models.CharField(blank=True, default='', max_length=255, verbose_name='Ключ платежа'), + ), + ] diff --git a/finance/models.py b/finance/models.py index 8cd05ac..82a0588 100755 --- a/finance/models.py +++ b/finance/models.py @@ -42,8 +42,8 @@ class Invoice(models.Model): price = models.IntegerField(verbose_name='Сумма', null=True, blank=True) real_price = models.IntegerField(verbose_name='Полученная сумма', null=True, blank=True, help_text='Сумма, минус комиссия') - bill_method = models.CharField(verbose_name='Способ оплаты', max_length=2, default='Y', choices=BILL_METHOD) - key = models.CharField(verbose_name='Ключ платежа', blank=True, max_length=255, default='', editable=False) + method = models.CharField(verbose_name='Способ оплаты', max_length=2, default='Y', choices=BILL_METHOD) + key = models.CharField(verbose_name='Ключ платежа', blank=True, max_length=255, default='') comment = models.TextField(verbose_name='Комментарий продавца', help_text='Будет показано пользователю', blank=True, editable=False) bill = models.ForeignKey(to=Bill, verbose_name="Связный счёт") diff --git a/finance/serializers.py b/finance/serializers.py new file mode 100644 index 0000000..7c041bb --- /dev/null +++ b/finance/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers + +from finance.models import Bill, Invoice + + +class BillSerializer(serializers.ModelSerializer): + opener = serializers.SerializerMethodField() + user = serializers.SerializerMethodField() + + class Meta: + model = Bill + fields = '__all__' + + @staticmethod + def get_user(self): + return self.user.email + + @staticmethod + def get_opener(self): + return self.opener.email + + +class InvoiceSerializer(serializers.ModelSerializer): + + class Meta: + model = Invoice + exclude = ('bill', ) diff --git a/finance/urls.py b/finance/urls.py old mode 100755 new mode 100644 index 1cdf01e..8bc8fc2 --- a/finance/urls.py +++ b/finance/urls.py @@ -1,28 +1,7 @@ -from finance import views -from finance import api, amo -from finance import yandex_pay from django.conf.urls import url +from finance import views urlpatterns = [ - url(r'pay/result/$', yandex_pay.aviso), - url(r'pay/check/$', yandex_pay.check), - url(r'pay/check_materials_access/$', api.check_materials_access), - #url(r'pay/result/$', pay.result), - #url(r'pay/success/$', pay.success), - #url(r'pay/fail', pay.fail), - url(r'pay/cancel_order/', api.cancel_order), - url(r'pay/sent_order', api.sent_order), - url(r'pay/change_service_request_status', api.change_service_request_status), - url(r'pay/check_service_request', api.check_service_request), - url(r'pay/traffic_map/([0-9]{1,99})', views.traffic_map), - url(r'check_bill$', api.check_bill), - url(r'create_service_request$', api.create_service_request), - url(r'cancel_service_request$', api.cancel_service_request), - url(r'remove_service_request/$', api.remove_service_request), - url(r'pay/reply_bill$', api.reply_bill), - url(r'pay/self_bill/([A-Za-z0-9]{1,99})$', views.self_bill), - url(r'pay/self_bill/$', api.send_self_bill), - url(r'get_user_from_bill_id$', api.get_user_from_bill_id), - url(r'bill_out/([A-Za-z0-9]{1,99})$', views.bill_out), - url(r'amo/new_request$', amo.new_request) -] + url(r'bills/([0-9]{1,99})/$', views.BillDetailView.as_view()), + url(r'bills/$', views.BillListView.as_view()), +] \ No newline at end of file diff --git a/finance/views.py b/finance/views.py old mode 100755 new mode 100644 index 9885df6..9c5abf5 --- a/finance/views.py +++ b/finance/views.py @@ -1,36 +1,84 @@ -# coding=utf-8 -from django.http import Http404 -from lms.decors import response_decor -from courses.models import Course -from finance.models import Price, Bill - - -@response_decor(template='traffic_map.html') -def traffic_map(request, course): - # Страница цен - _course = Course.objects.get(id=course) - return {'course': _course.title, 'traffic': Price.objects.filter(course=_course)} - - -@response_decor(template='selfbill.html', without_auth=True) -def self_bill(request, key): - # Страница формирования собственного счета - try: - req = Price.objects.get(key=key) - except Price.DoesNotExist: - raise Http404 - else: - return {'sum': req.cost, 'name': req.get_name(), 'key': key} - - -@response_decor(template='bill_out.html', without_auth=True) -def bill_out(request, salt): - try: - bill = Bill.objects.get(salt=salt) - except Bill.DoesNotExist: - raise Http404 - else: - if bill.status == 'W': - bill.status = 'P' - bill.save() - return {'data': bill.gen_yandex_data(), 'price': bill.price} +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 finance.models import Bill, Invoice +from finance.serializers import BillSerializer, InvoiceSerializer +from lms.tools import get_real_name + + +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']) + 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'], array=Invoice.BILL_METHOD) + i['status'] = get_real_name(elem=i['status'], array=Invoice.BILL_STATUSES) + i['bill'] = bill_obj + invoice, _is_create = Invoice.objects.update_or_create(**i) + invoices = [j for j in invoices if not j.id == invoice.id] + if invoice.method == 'Y' and invoice.status == 'P': + print("Отправить письмо") + + [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) \ No newline at end of file