Merge branch 'beta'

This commit is contained in:
Martin Quarda 2024-08-22 13:04:22 +02:00
commit 6833eb0a7c
7 changed files with 87 additions and 19 deletions

View File

@ -71,6 +71,7 @@ TEMPLATES = [
WSGI_APPLICATION = 'alkator.wsgi.application' WSGI_APPLICATION = 'alkator.wsgi.application'
SESSION_COOKIE_SECURE = True
# Database # Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases # https://docs.djangoproject.com/en/4.2/ref/settings/#databases
@ -88,7 +89,10 @@ COMGATE_TEST = False
COMGATE_SECRET = '4c36b7faf40575073b26570066ca2a9f' COMGATE_SECRET = '4c36b7faf40575073b26570066ca2a9f'
ADMINS = [('Martin Quarda', 'martin@quarda.cz')]
# Email # Email
SERVER_EMAIL = 'info@alkator.cz'
DEFAULT_FROM_EMAIL = 'info@alkator.cz' DEFAULT_FROM_EMAIL = 'info@alkator.cz'
EMAIL_HOST = 'smtp.seznam.cz' EMAIL_HOST = 'smtp.seznam.cz'
EMAIL_PORT = 465 EMAIL_PORT = 465

View File

@ -3,6 +3,7 @@ from django.http import HttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.contrib.admin.views.decorators import staff_member_required 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 datetime import date, datetime, timedelta
from urllib.parse import parse_qs from urllib.parse import parse_qs
import requests import requests
@ -35,6 +36,8 @@ def register(request):
return HttpResponse('{"reason":"Telefoní číslo je povinný!"}', status=400, content_type='application/json') 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): 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') 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: try:
dat = datetime.strptime(request.POST['date_of_birth'], "%Y-%m-%d").date() dat = datetime.strptime(request.POST['date_of_birth'], "%Y-%m-%d").date()
if dat > date(2006, 10, 5): if dat > date(2006, 10, 5):
@ -64,19 +67,24 @@ def register(request):
address=request.POST['address'], address=request.POST['address'],
phone=request.POST['phone'], phone=request.POST['phone'],
alkator_class=ALKATOR_CLASS, alkator_class=ALKATOR_CLASS,
invoice_id=invoice_id invoice_id=invoice_id,
) )
user.save() user.save()
if date.today() >= date(2024, 9, 21):
price = 79000
else:
price = 69000
payment_data = { payment_data = {
'merchant': COMGATE_MERCHANT, 'merchant': COMGATE_MERCHANT,
'test': 'true' if COMGATE_TEST else 'false', 'test': 'true' if COMGATE_TEST else 'false',
'price': 69000, 'price': price,
'curr': 'CZK', 'curr': 'CZK',
'method': 'ALL', 'method': 'ALL',
'label': 'Startovné', 'label': 'Startovné na závod Alkátor Race Studené 2024',
'email': request.POST['email'], 'email': user.email,
'fullName': f"{request.POST['first_name']} {request.POST['last_name']}", 'fullName': f"{user.first_name} {user.last_name}",
'refId': f'{user.invoice_id}', 'refId': f'{user.invoice_id}',
'secret': COMGATE_SECRET, 'secret': COMGATE_SECRET,
'prepareOnly': 'true', 'prepareOnly': 'true',
@ -87,7 +95,7 @@ def register(request):
if result['code'][0] != '0': if result['code'][0] != '0':
user.delete() 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.trans_id = result['transId'][0]
user.save() user.save()
@ -104,21 +112,54 @@ def payment_result(request):
test = result['test'][0] != 'false' test = result['test'][0] != 'false'
if not secret_match or test != COMGATE_TEST: if not secret_match or test != COMGATE_TEST:
return HttpResponse(status=400) 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': if paid == 'PAID':
user.paid = True user.paid = True
user.save() 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 čekat nevídané překážky.
O podrobnostech 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: 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) return HttpResponse(status=200)
def payment_state(request): def payment_state(request):
invoice_id = request.GET['refId'] invoice_id = request.GET['refId']
if User.objects.get(invoice_id=invoice_id).paid: try:
return HttpResponse('{"status":"success", "reason":"Úspěšná platba"}', content_type='application/json') if User.objects.get(invoice_id=invoice_id).paid:
else: return HttpResponse('{"status":"success", "reason":"Úspěšná platba"}', content_type='application/json')
return HttpResponse('{"status":"failed", "reason":"Zatím nemáme informace o provedené platbě. Zkuste reload nebo zkontrolujte email."}', 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): def results(request):
@ -156,11 +197,12 @@ def photos(request):
@staff_member_required @staff_member_required
def invoice(request): def invoice(request):
user = User.objects.get(invoice_id=request.GET['invoice_id'])
return TemplateResponse( return TemplateResponse(
request, request,
'invoice.html', 'invoice.html',
{ {
'user': User.objects.get(invoice_id=request.GET['invoice_id']), 'user': user,
'paid_date': user.register_date + timedelta(days=1), 'paid_date': user.register_date + timedelta(days=1),
} }
) )

BIN
frontend/public/footer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

View File

@ -4,6 +4,8 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Alkátor Race</title> <title>Alkátor Race</title>
<meta name="description" content="Jedná se o překážkový závod u nás v Orlických horách s pivem a panáky." />
<meta name="author" content="Martin Quarda" />
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@ -31,9 +31,14 @@ class Main extends Component {
this.setState({photos: json}) this.setState({photos: json})
}) })
if(window.location.search){ if(window.location.search){
fetch(addr_prefix + "/api/payment_state" + window.location.search).then(resp => resp.json()).then(json =>{ let searchParams = new URLSearchParams(window.location.search);
this.setState({status: json.status, text: json.reason}) for(const [key, value] of searchParams){
}) if (key == "refId"){
fetch(addr_prefix + "/api/payment_state?refId=" + value).then(resp => resp.json()).then(json =>{
this.setState({status: json.status, text: json.reason})
})
}
}
} }
window.addEventListener("hashchange", (e) => {this.onHashChange(e)}) window.addEventListener("hashchange", (e) => {this.onHashChange(e)})
} }
@ -117,9 +122,21 @@ class Main extends Component {
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#gallery">Galerie</a> <a class="nav-link" href="#gallery">Galerie</a>
</li> </li>
<li class="nav-item">
<a class="nav-link" href="#payment">Platba</a>
</li>
</ul> </ul>
</div> </div>
</nav> </nav>
{this.state.page == "#payment" &&
<div class="container text">
Platební bránu poskytuje firma <a href="https://www.comgate.cz/cz/platebni-brana">Comgate, a.s</a>. Platit je možné pomocí <a href="https://help.comgate.cz/v1/docs/cs/platby-kartou">platební karty</a> nebo <a href="https://help.comgate.cz/docs/bankovni-prevody">bankovním převodem</a>. Podrobnosti a přesný postup platby včetně animací najdete v odkazech.<br />
Kontakt na Comgate, a.s.<br />
Gočárova třída 1754 / 48b, Hradec Králové<br />
E-mail: platby-podpora@comgate.cz<br />
Tel: +420 228 224 267<br />
</div>
}
{this.state.page == "#gallery" && {this.state.page == "#gallery" &&
<div class="container"> <div class="container">
<Gallery photos={photos_gallery} onClick={this.openPhoto}/> <Gallery photos={photos_gallery} onClick={this.openPhoto}/>
@ -209,7 +226,7 @@ class Main extends Component {
<h1 class="col val"> <h1 class="col val">
<b>CENA</b> <b>CENA</b>
<br /> <br />
690 Do 20.9. 690 *
</h1> </h1>
</div> </div>
</div> </div>
@ -232,6 +249,8 @@ class Main extends Component {
<p>Start závodu je v 10:00, ale check-in se zahájením akce je již od 8:30.</p> <p>Start závodu je v 10:00, ale check-in se zahájením akce je již od 8:30.</p>
<p>* S blížícím se závodem bude 21.9. zvednuta cena na 790 .</p>
<p>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.</p> <p>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.</p>
<p>Sportem ku chlastu!</p> <p>Sportem ku chlastu!</p>
</div> </div>
@ -296,7 +315,7 @@ class Main extends Component {
</div> </div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="agreement" name="agreement" /> <input type="checkbox" class="form-check-input" id="agreement" name="agreement" />
<label class="form-check-label" for="agreement">Souhlas se <a href="/public/ochrana_osobnich_udaju.pdf">zpracováním osobních údajů</a> a <a href="/public/reverz.pdf">podmínkami závodu</a>.</label> <label class="form-check-label" for="agreement">Souhlas se <a href="/public/ochrana_osobnich_udaju.pdf">zpracováním osobních údajů</a>, <a href="/public/reverz.pdf">podmínkami závodu</a> a <a href="/public/obchodni_podminky_alkator.pdf">obchodníma podmínkami závodu</a>.</label>
</div> </div>
<button type="submit" class="btn btn-primary">Odeslat a zaplatit</button> <button type="submit" class="btn btn-primary">Odeslat a zaplatit</button>
</form> </form>
@ -317,7 +336,7 @@ class Main extends Component {
<div class="container text"> <div class="container text">
<a href="/public/reverz.pdf">Reverz</a><br /> <a href="/public/reverz.pdf">Reverz</a><br />
<a href="/public/ochrana_osobnich_udaju.pdf">Ochrana osobních údajů</a><br /> <a href="/public/ochrana_osobnich_udaju.pdf">Ochrana osobních údajů</a><br />
<a href="/public/ochrana_osobnich_udaju_zhoor.pdf">Ochrana osobních údajů ve firmě Zhoor s.r.o.</a><br /> <a href="/public/obchodni_podminky_alkator.pdf">Obchodní podmínky závodu alkátor</a><br />
Název společnosti: Zhoor s.r.o.<br /> Název společnosti: Zhoor s.r.o.<br />
: 212 44 863<br /> : 212 44 863<br />
DIČ: Nejsme plátci DPH.<br /> DIČ: Nejsme plátci DPH.<br />
@ -325,6 +344,7 @@ class Main extends Component {
Číslo účtu: 131-2219860207/0100<br /> Číslo účtu: 131-2219860207/0100<br />
E-mail: info@alkator.cz<br /> E-mail: info@alkator.cz<br />
Tel: +420 728 018 088<br /> Tel: +420 728 018 088<br />
<img src="/public/footer.png" style={{"width":"100%","height":"auto"}} />
</div> </div>
</div> </div>
); );