Merge branch 'beta'
This commit is contained in:
commit
6833eb0a7c
@ -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
|
||||||
|
@ -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 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:
|
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
BIN
frontend/public/footer.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
frontend/public/obchodni_podminky_alkator.pdf
Normal file
BIN
frontend/public/obchodni_podminky_alkator.pdf
Normal file
Binary file not shown.
Binary file not shown.
@ -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>
|
||||||
|
@ -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 kč
|
Do 20.9. 690 kč*
|
||||||
</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 kč.</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 />
|
||||||
IČ: 212 44 863<br />
|
IČ: 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>
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user