From f2dc359c8e9dcb7d21d2805ba7802a34f246cb34 Mon Sep 17 00:00:00 2001 From: Martin Quarda Date: Mon, 14 Oct 2024 10:09:18 +0200 Subject: [PATCH] first cart buy --- alkator/urls.py | 4 +-- alkatorapi/views.py | 63 +++++++++++++++++++++++++++++++++++ frontend/src/scripts/index.js | 2 +- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/alkator/urls.py b/alkator/urls.py index 5c1a9ea..df354cc 100644 --- a/alkator/urls.py +++ b/alkator/urls.py @@ -24,7 +24,7 @@ from alkatorapi.views import ( invoice, upload_files, login_status, change_racer, products, cart_add, cart, cart_delete, - cart_decrease, + cart_decrease, cart_buy ) urlpatterns = [ @@ -35,7 +35,6 @@ urlpatterns = [ path('api/login_status', login_status), path('api/logout', logout), path('api/change_racer', change_racer), - #path('api/register', register), path('api/results', results), path('api/photos', photos), path('api/payment_result', payment_result), @@ -47,4 +46,5 @@ urlpatterns = [ path('api/cart', cart), path('api/cart/delete', cart_delete), path('api/cart/decrease', cart_decrease), + path('api/cart/buy', cart_buy) ] diff --git a/alkatorapi/views.py b/alkatorapi/views.py index d578f64..5c81561 100644 --- a/alkatorapi/views.py +++ b/alkatorapi/views.py @@ -9,6 +9,7 @@ from django.contrib.auth import authenticate from django.contrib.auth import login as auth_login, logout as auth_logout from django.core.mail import send_mail, mail_admins, EmailMessage from django.db.utils import IntegrityError +from django.db import transaction from django.utils.datastructures import MultiValueDictKeyError from datetime import date, datetime, timedelta from weasyprint import HTML @@ -374,6 +375,68 @@ def cart_add(request): return HttpResponse('{"status":"success", "reason":"Úspěšně přidáno do košíku."}', status=200) +def select_delivery(request): + pass + + +@csrf_exempt +@transaction.atomic +def cart_buy(request): + cart = request.user.cart + user = request.user + profile = user.profile + cart_products = CartProduct.objects.filter(cart=cart) + + for cp in cart_products: + if cp.quantity > cp.product.quantity: + return HttpResponse('{"status": "failed", "reason": "Nemáme dostatek ' + cp.product.name + ' na skladě!"}', status=400) + + invoice = Invoice( + user=user, + address=user.profile.address, + invoice_id=Invoice.next_invoice_id() + ) + invoice.save() + + for cp in cart_products: + ip = InvoiceProduct( + invoice=invoice, + price=cp.product.price, + quantity=cp.quantity, + product=cp.product, + ) + cp.product.quantity -= cp.quantity + cp.product.save() + ip.save() + + payment_data = { + 'merchant': COMGATE_MERCHANT, + 'test': 'true' if COMGATE_TEST else 'false', + 'price': invoice.calculate_total_price() * 100, + 'curr': 'CZK', + 'method': 'ALL', + 'label': 'Merch Alkátor Race', + 'email': user.email, + 'fullName': f"{profile.first_name} {profile.last_name}", + 'refId': f'{invoice.invoice_id}', + 'secret': COMGATE_SECRET, + 'prepareOnly': 'true', + } + result = requests.post('https://payments.comgate.cz/v1.0/create', data=payment_data) + + result = parse_qs(result.text) + + if result['code'][0] != '0': + racer.delete() + invoice.delete() + return HttpResponse('{"reason":"Chyba na straně platební brány: ' + result['message'][0] + ', zkuste prosím nákup později."}', status=400, content_type='application/json') + + invoice.trans_id = result['transId'][0] + invoice.save() + + return HttpResponse('{"success":"", "redirect":"' + result['redirect'][0] + '"}', content_type='application/json') + + def cart_delete(request): _id = request.GET['id'] user = request.user diff --git a/frontend/src/scripts/index.js b/frontend/src/scripts/index.js index 09f4c8a..82a33d4 100644 --- a/frontend/src/scripts/index.js +++ b/frontend/src/scripts/index.js @@ -338,7 +338,7 @@ class Main extends Component { Celkem {this.calculateTotalPrice()} Kč - +
this.onSubmit(e)}>