This commit is contained in:
Martin Quarda 2024-10-11 10:18:55 +02:00
parent 4198bfe9da
commit 1593c4d599
7 changed files with 79 additions and 13 deletions

0
alkatorapi/forms.py Normal file
View File

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.12 on 2024-10-11 08:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alkatorapi', '0016_profile_alter_user_alkator_class_racer'),
]
operations = [
migrations.AddField(
model_name='racer',
name='register_date',
field=models.DateTimeField(auto_now=True),
),
]

View File

@ -63,6 +63,7 @@ class Racer(models.Model):
team = models.CharField(max_length=120, null=True, blank=True) team = models.CharField(max_length=120, null=True, blank=True)
phone = models.CharField(max_length=120, null=True, blank=True) phone = models.CharField(max_length=120, null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True) date_of_birth = models.DateField(null=True, blank=True)
register_date = models.DateTimeField(auto_now=True)
duration = models.DurationField(null=True, blank=True) duration = models.DurationField(null=True, blank=True)
starting_number = models.IntegerField(null=True, blank=True) starting_number = models.IntegerField(null=True, blank=True)
alkator_category = models.IntegerField(choices=ALKATOR_CHOICES, default=1) alkator_category = models.IntegerField(choices=ALKATOR_CHOICES, default=1)

View File

@ -21,7 +21,7 @@
<tr> <tr>
<td class="tg-7zrl" colspan="6"></td> <td class="tg-7zrl" colspan="6"></td>
<td class="tg-7zrl">Číslo faktury</td> <td class="tg-7zrl">Číslo faktury</td>
<td class="tg-8d8j" colspan="2">{{user.invoice_id}}</td> <td class="tg-8d8j" colspan="2">{{racer.invoice_id}}</td>
</tr> </tr>
<tr> <tr>
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Dodavatel</span></td> <td class="tg-uzm7"><span style="background-color:#BFFE8D">Dodavatel</span></td>
@ -51,7 +51,7 @@
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Jméno</span></td> <td class="tg-uzm7"><span style="background-color:#BFFE8D">Jméno</span></td>
<td class="tg-71pv" colspan="3" rowspan="2">{{user.first_name}} {{user.last_name}}</td> <td class="tg-71pv" colspan="3" rowspan="2">{{user.profile.first_name}} {{user.profile.last_name}}</td>
</tr> </tr>
<tr> <tr>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
@ -67,7 +67,7 @@
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-uzm7"><span style="background-color:#BFFE8D">Adresa</span></td> <td class="tg-uzm7"><span style="background-color:#BFFE8D">Adresa</span></td>
<td class="tg-71pv">{{user.address}}</td> <td class="tg-71pv">{{user.profile.address}}</td>
<td class="tg-kcps"></td> <td class="tg-kcps"></td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
</tr> </tr>
@ -166,7 +166,7 @@
<td class="tg-7zrl" colspan="2">131-2219860207/0100</td> <td class="tg-7zrl" colspan="2">131-2219860207/0100</td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Datum vystavení</span></td> <td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Datum vystavení</span></td>
<td class="tg-2b7s" colspan="2">{{user.register_date|date:"d/m/Y"}}</td> <td class="tg-2b7s" colspan="2">{{racer.register_date|date:"d/m/Y"}}</td>
</tr> </tr>
<tr> <tr>
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Variabilní symbol</span></td> <td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Variabilní symbol</span></td>
@ -217,9 +217,9 @@
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-2b7s">1</td> <td class="tg-2b7s">1</td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-2b7s">{{user.price}},00 Kč</td> <td class="tg-2b7s">{{racer.price}},00 Kč</td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-2b7s">{{user.price}},00 Kč</td> <td class="tg-2b7s">{{racer.price}},00 Kč</td>
</tr> </tr>
<tr> <tr>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
@ -272,7 +272,7 @@
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>
<td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Celkem</span></td> <td class="tg-hvob" colspan="2"><span style="background-color:#A8DEF1">Celkem</span></td>
<td class="tg-kbc9" colspan="2"><span style="font-weight:bold;color:#FFF;background-color:#66B3ED">{{user.price}},00 Kč</span></td> <td class="tg-kbc9" colspan="2"><span style="font-weight:bold;color:#FFF;background-color:#66B3ED">{{racer.price}},00 Kč</span></td>
</tr> </tr>
<tr> <tr>
<td class="tg-7zrl"></td> <td class="tg-7zrl"></td>

View File

@ -7,7 +7,7 @@ from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.models import User as DjangoUser from django.contrib.auth.models import User as DjangoUser
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login, logout as auth_logout from django.contrib.auth import login as auth_login, logout as auth_logout
from django.core.mail import send_mail, mail_admins from django.core.mail import send_mail, mail_admins, EmailMessage
from django.utils.datastructures import MultiValueDictKeyError from django.utils.datastructures import MultiValueDictKeyError
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from urllib.parse import parse_qs from urllib.parse import parse_qs
@ -317,9 +317,9 @@ def payment_result(request):
if paid == 'PAID': if paid == 'PAID':
racer.paid = True racer.paid = True
racer.save() racer.save()
send_mail( mail = EmailMessage(
f"úspěšná registrace do závodu Alkátor race Dolní Čermná ({racer.first_name} {racer.last_name})", subject=f"úspěšná registrace do závodu Alkátor race Dolní Čermná ({racer.first_name} {racer.last_name})",
f"""Zdravím tě Alkátore, body=f"""Zdravím tě Alkátore,
toto je potvrzovací email o účasti v nezapomenutelném závodě Alkátor-race. toto je potvrzovací email o účasti v nezapomenutelném závodě Alkátor-race.
Prosíme kontrolujete si své hromadné schránky a spamy. Prosíme kontrolujete si své hromadné schránky a spamy.
@ -338,9 +338,30 @@ ALKÁTOR TEAM
email: info@alkator.cz email: info@alkator.cz
tel: + 420 728 018 088 tel: + 420 728 018 088
web: https://alkator.cz""", web: https://alkator.cz""",
"info@alkator.cz", from_email="info@alkator.cz",
[racer.profile.user.email, racer.email] if racer.email else [racer.profile.user.email], to=[racer.profile.user.email, racer.email] if racer.email else [racer.profile.user.email],
bcc=[],
cc=[]
) )
user = request.user
template = TemplateResponse(
None,
'invoice.html',
{
'user': user,
'racer': racer,
'paid_date': racer.register_date + timedelta(days=1),
}
)
template.render()
pdf_name = f"invoices/{user.profile.last_name}_{user.profile.first_name}.pdf"
HTML(string=template.content).write_pdf(pdf_name)
attach = open(pdf_name, 'rb')
mail.attach('faktura.pdf', attach.read(), 'application/pdf')
mail.send()
elif paid == 'CANCELLED' and not user.paid: elif paid == 'CANCELLED' and not user.paid:
racer.delete() racer.delete()
return HttpResponse(status=200) return HttpResponse(status=200)

0
invoices/.gitkeep Normal file
View File

26
send_mail.py Normal file
View File

@ -0,0 +1,26 @@
from alkatorapi.models import User
from django.core.mail import send_mail
for user in User.objects.all():
if user.starting_number and user.email:
send_mail(
"Díky ALKÁTORE!",
f"""Milý Alkátore,
kdo zvládne nejen běžet, ale i přemoci pár trestných panáků a piv na trati, zaslouží naše hluboké uznání! Bylo skvělé, že jsi se k nám přidal na tento nezapomenutelný závod. Jsi skutečný šampion nejen na nohách, ale i při zdolávání těch tekutých výzev!
Pokud jsi během závodu pořídil nějaké fotky nebo videa, budeme rádi, když nám je nahraješ přes tento odkaz: https://alkator.cz/#upload_files. Rádi se podíváme na tvoje zážitky a možná je i nasdílíme!
Tak na zdraví a na trénink nezapomínej další běh a panáky čekají!
S pozdravem,
Tým organizátorů
ALKÁTOR TEAM
email: info@alkator.cz
tel: + 420 728 018 088
web: https://alkator.cz""",
"info@alkator.cz",
[user.email],
)
print(f"sent to: {user.email}")