parent
faa1a76e15
commit
347455ced7
7 changed files with 158 additions and 63 deletions
@ -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', |
||||||
|
), |
||||||
|
] |
||||||
@ -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='Ключ платежа'), |
||||||
|
), |
||||||
|
] |
||||||
@ -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', ) |
||||||
@ -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 django.conf.urls import url |
||||||
|
from finance import views |
||||||
|
|
||||||
urlpatterns = [ |
urlpatterns = [ |
||||||
url(r'pay/result/$', yandex_pay.aviso), |
url(r'bills/([0-9]{1,99})/$', views.BillDetailView.as_view()), |
||||||
url(r'pay/check/$', yandex_pay.check), |
url(r'bills/$', views.BillListView.as_view()), |
||||||
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) |
|
||||||
] |
] |
||||||
@ -1,36 +1,84 @@ |
|||||||
# coding=utf-8 |
from django.contrib.auth import get_user_model |
||||||
from django.http import Http404 |
|
||||||
from lms.decors import response_decor |
|
||||||
from courses.models import Course |
from courses.models import Course |
||||||
from finance.models import Price, Bill |
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 |
||||||
|
|
||||||
@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)} |
|
||||||
|
|
||||||
|
class BillListView(APIView): |
||||||
|
renderer_classes = (JSONRenderer,) |
||||||
|
|
||||||
@response_decor(template='selfbill.html', without_auth=True) |
@staticmethod |
||||||
def self_bill(request, key): |
def get(request): |
||||||
# Страница формирования собственного счета |
if request.user.is_authenticated: |
||||||
try: |
return Response( |
||||||
req = Price.objects.get(key=key) |
[BillSerializer(i).data for i in Bill.objects.filter(Q(user=request.user) | Q(opener=request.user))], |
||||||
except Price.DoesNotExist: |
status=200, |
||||||
raise Http404 |
) |
||||||
else: |
return Response("Permission denied", status=403) |
||||||
return {'sum': req.cost, 'name': req.get_name(), 'key': key} |
|
||||||
|
@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) |
||||||
|
|
||||||
@response_decor(template='bill_out.html', without_auth=True) |
return Response("Bill not set", status=400) |
||||||
def bill_out(request, salt): |
|
||||||
|
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: |
try: |
||||||
bill = Bill.objects.get(salt=salt) |
bill = Bill.objects.get(id=pk) |
||||||
except Bill.DoesNotExist: |
except Bill.DoesNotExist: |
||||||
raise Http404 |
return Response("Bill not found", status=404) |
||||||
else: |
|
||||||
if bill.status == 'W': |
res = { |
||||||
bill.status = 'P' |
"bill": BillSerializer(bill).data, |
||||||
bill.save() |
"children": [InvoiceSerializer(i).data for i in bill.invoice_set.all()], |
||||||
return {'data': bill.gen_yandex_data(), 'price': bill.price} |
} |
||||||
|
|
||||||
|
return Response( |
||||||
|
res, |
||||||
|
status=self.status_code, |
||||||
|
) |
||||||
|
return Response("Permission denied", status=403) |
||||||
Loading…
Reference in new issue