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'
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

View File

@ -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)
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 č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:
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']
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),
}
)

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 name="viewport" content="width=device-width, initial-scale=1">
<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>
<body>
<div id="root"></div>

View File

@ -31,10 +31,15 @@ class Main extends Component {
this.setState({photos: json})
})
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);
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)})
}
closePhoto = () => {
@ -117,9 +122,21 @@ class Main extends Component {
<li class="nav-item">
<a class="nav-link" href="#gallery">Galerie</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#payment">Platba</a>
</li>
</ul>
</div>
</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" &&
<div class="container">
<Gallery photos={photos_gallery} onClick={this.openPhoto}/>
@ -209,7 +226,7 @@ class Main extends Component {
<h1 class="col val">
<b>CENA</b>
<br />
690
Do 20.9. 690 *
</h1>
</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>* 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>Sportem ku chlastu!</p>
</div>
@ -296,7 +315,7 @@ class Main extends Component {
</div>
<div class="mb-3 form-check">
<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>
<button type="submit" class="btn btn-primary">Odeslat a zaplatit</button>
</form>
@ -317,7 +336,7 @@ class Main extends Component {
<div class="container text">
<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_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 />
: 212 44 863<br />
DIČ: Nejsme plátci DPH.<br />
@ -325,6 +344,7 @@ class Main extends Component {
Číslo účtu: 131-2219860207/0100<br />
E-mail: info@alkator.cz<br />
Tel: +420 728 018 088<br />
<img src="/public/footer.png" style={{"width":"100%","height":"auto"}} />
</div>
</div>
);