diff --git a/alkator/settings.py b/alkator/settings.py index 408767b..65d602f 100644 --- a/alkator/settings.py +++ b/alkator/settings.py @@ -71,6 +71,7 @@ TEMPLATES = [ WSGI_APPLICATION = 'alkator.wsgi.application' +SESSION_COOKIE_SECURE = True # Database # https://docs.djangoproject.com/en/4.2/ref/settings/#databases @@ -88,7 +89,10 @@ COMGATE_TEST = False COMGATE_SECRET = '4c36b7faf40575073b26570066ca2a9f' +ADMINS = [('Martin Quarda', 'martin@quarda.cz')] + # Email +SERVER_EMAIL = 'info@alkator.cz' DEFAULT_FROM_EMAIL = 'info@alkator.cz' EMAIL_HOST = 'smtp.seznam.cz' EMAIL_PORT = 465 diff --git a/alkatorapi/views.py b/alkatorapi/views.py index d1f676f..b44bf50 100644 --- a/alkatorapi/views.py +++ b/alkatorapi/views.py @@ -3,6 +3,7 @@ from django.http import HttpResponse from django.template.response import TemplateResponse from django.views.decorators.csrf import csrf_exempt from django.contrib.admin.views.decorators import staff_member_required +from django.core.mail import send_mail, mail_admins from datetime import date, datetime, timedelta from urllib.parse import parse_qs import requests @@ -35,6 +36,8 @@ def register(request): return HttpResponse('{"reason":"Telefoní číslo je povinný!"}', status=400, content_type='application/json') if User.objects.filter(email=request.POST['email'], alkator_class=ALKATOR_CLASS): return HttpResponse('{"reason":"Email je již registrován!"}', status=400, content_type='application/json') + if User.objects.filter(alkator_class=ALKATOR_CLASS, paid=True).count() >= 50: + return HttpResponse('{"reason":"Kapacita závodu byla naplněna!"}', status=400, content_type='application/json') try: dat = datetime.strptime(request.POST['date_of_birth'], "%Y-%m-%d").date() if dat > date(2006, 10, 5): @@ -64,19 +67,24 @@ def register(request): address=request.POST['address'], phone=request.POST['phone'], alkator_class=ALKATOR_CLASS, - invoice_id=invoice_id + invoice_id=invoice_id, ) user.save() + if date.today() >= date(2024, 9, 21): + price = 79000 + else: + price = 69000 + payment_data = { 'merchant': COMGATE_MERCHANT, 'test': 'true' if COMGATE_TEST else 'false', - 'price': 69000, + 'price': price, 'curr': 'CZK', 'method': 'ALL', - 'label': 'Startovné', - 'email': request.POST['email'], - 'fullName': f"{request.POST['first_name']} {request.POST['last_name']}", + 'label': 'Startovné na závod Alkátor Race Studené 2024', + 'email': user.email, + 'fullName': f"{user.first_name} {user.last_name}", 'refId': f'{user.invoice_id}', 'secret': COMGATE_SECRET, 'prepareOnly': 'true', @@ -87,7 +95,7 @@ def register(request): if result['code'][0] != '0': user.delete() - return HttpResponse('{"reason":"Chyba na straně platební brány: ' + result['message'][0] + '"}', status=400, content_type='application/json') + return HttpResponse('{"reason":"Chyba na straně platební brány: ' + result['message'][0] + ', zkuste prosím registraci později."}', status=400, content_type='application/json') user.trans_id = result['transId'][0] user.save() @@ -104,21 +112,54 @@ def payment_result(request): test = result['test'][0] != 'false' if not secret_match or test != COMGATE_TEST: return HttpResponse(status=400) - user = User.objects.get(invoice_id=ref_id) + try: + user = User.objects.get(invoice_id=ref_id) + except User.DoesNotExist: + mail_admins('Chyba s platbou!', f'invoice_id={ref_id}&paid={paid}') + return HttpResponse(status=404) if paid == 'PAID': user.paid = True user.save() + send_mail( + "úspěšná registrace do závodu Alkátor race Studené", + f"""Zdravím tě Alkátore, +toto je potvrzovací email o tvé účasti v nezapomenutelném závodě Alkátor-race. +Prosíme kontrolujete si své hromadné schránky a spamy. + +Závod se koná 5.10.2024 na Studeném v Orlických horách, hned u Podskaláku. +Zajištěno je stanování, občerstvení a také večerní after párty. + +Připrav na zkoušku své tělo, játra a tvé mozkové buňky. +Budou tě čekat nevídané překážky. + +O podrobnostech tě budeme informovat emailem. +Nezapomeň nás sledovat na Facebooku, Instagramu, YouTube a TikToku. + +Na tento email není třeba odpovídat, protože je generován automaticky s přijatou platbou. V případě potřeby pište na info@alkator.cz . + +ALKÁTOR TEAM +email: info@alkator.cz +tel: + 420 728 018 088 +web: https://alkator.cz""", + "info@alkator.cz", + [user.email], + ) elif paid == 'CANCELLED' and not user.paid: - user.delete() + #effectively disabling email adress as email address cannot contain ' ' + user.email = ' '+user.email + user.save() return HttpResponse(status=200) def payment_state(request): invoice_id = request.GET['refId'] - if User.objects.get(invoice_id=invoice_id).paid: - return HttpResponse('{"status":"success", "reason":"Úspěšná platba"}', content_type='application/json') - else: - return HttpResponse('{"status":"failed", "reason":"Zatím nemáme informace o provedené platbě. Zkuste reload nebo zkontrolujte email."}', content_type='application/json') + try: + if User.objects.get(invoice_id=invoice_id).paid: + return HttpResponse('{"status":"success", "reason":"Úspěšná platba"}', content_type='application/json') + else: + return HttpResponse('{"status":"failed", "reason":"Zatím nemáme informace o provedené platbě. Zkuste reload nebo zkontrolujte email."}', content_type='application/json') + except User.DoesNotExist: + return HttpResponse('{"status":"failed", "reason":"Uživatel neexistuje, registraci prosím opakujte."}', content_type='application/json') def results(request): @@ -156,11 +197,12 @@ def photos(request): @staff_member_required def invoice(request): + user = User.objects.get(invoice_id=request.GET['invoice_id']) return TemplateResponse( request, 'invoice.html', { - 'user': User.objects.get(invoice_id=request.GET['invoice_id']), + 'user': user, 'paid_date': user.register_date + timedelta(days=1), } ) diff --git a/frontend/public/footer.png b/frontend/public/footer.png new file mode 100644 index 0000000..e9ec1ed Binary files /dev/null and b/frontend/public/footer.png differ diff --git a/frontend/public/obchodni_podminky_alkator.pdf b/frontend/public/obchodni_podminky_alkator.pdf new file mode 100644 index 0000000..a9bce42 Binary files /dev/null and b/frontend/public/obchodni_podminky_alkator.pdf differ diff --git a/frontend/public/ochrana_osobnich_udaju_zhoor.pdf b/frontend/public/ochrana_osobnich_udaju_zhoor.pdf deleted file mode 100644 index df7500e..0000000 Binary files a/frontend/public/ochrana_osobnich_udaju_zhoor.pdf and /dev/null differ diff --git a/frontend/src/index.html b/frontend/src/index.html index 4a212b8..8d3b50f 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -4,6 +4,8 @@
Start závodu je v 10:00, ale check-in se zahájením akce je již od 8:30.
+* S blížícím se závodem bude 21.9. zvednuta cena na 790 kč.
+Rozhodně se podívej na FAQ sekci, zde na stránce, kde najdeš důležité informace týkající se závodu ALKÁTOR RACE.
Sportem ku chlastu!
@@ -296,7 +315,7 @@ class Main extends Component {