diff --git a/DjangoFiles/ApiBillet/templates/ticket/example_flight_ticket.html b/DjangoFiles/ApiBillet/templates/ticket/example_flight_ticket.html new file mode 100644 index 0000000..c6eb5d4 --- /dev/null +++ b/DjangoFiles/ApiBillet/templates/ticket/example_flight_ticket.html @@ -0,0 +1,231 @@ + + + {% load static %} + + +{# #} + + Boarding ticket + + + + + + +
+

{{ ticket.first_name }} {{ ticket.last_name }}

+

{{ ticket.reservation.event.name }}

+
+
Flight
+
DL31
+
Gate
+
29
+
Seat
+
26E
+
Zone
+
4
+
+ +
+ +
+

1257797706706

+

{{ ticket.first_name }} {{ ticket.last_name }}

+
+
Flight
+
DL31
+
Gate
+
29
+
Seat
+
26E
+
Zone
+
4
+
+ +
+ + + diff --git a/DjangoFiles/ApiBillet/templates/ticket/qrtest.html b/DjangoFiles/ApiBillet/templates/ticket/qrtest.html index ed94776..ab06af6 100644 --- a/DjangoFiles/ApiBillet/templates/ticket/qrtest.html +++ b/DjangoFiles/ApiBillet/templates/ticket/qrtest.html @@ -2,7 +2,14 @@ {{ img_svg | safe }} +{##} +{# fallback#} +{##} - +{#
#} +{# {{ bar_svg | safe }}#} +{#
#} + + fallback diff --git a/DjangoFiles/ApiBillet/templates/ticket/ticket.html b/DjangoFiles/ApiBillet/templates/ticket/ticket.html index 786b6a4..0089a02 100644 --- a/DjangoFiles/ApiBillet/templates/ticket/ticket.html +++ b/DjangoFiles/ApiBillet/templates/ticket/ticket.html @@ -1,235 +1,24 @@ - {% load static %} - - Boarding ticket - -
- {{ img_svg | safe }} -
- -
-

{{ ticket.first_name }} {{ ticket.last_name }}

-

{{ ticket.reservation.event.name }}

-
-
IMG
-
Prout
-
Gate
-
img_svg
-
Seat
-
26E
-
Zone
-
4
-
- -
-
-

proutproutprout

-

{{ ticket.first_name }} {{ ticket.last_name }}

-
-
Flight
-
DL31
-
Gate
-
29
-
Seat
-
26E
-
Zone
-
4
-
- -
+

{{ ticket.first_name }} {{ ticket.last_name }}

+

{{ config.organisation }}

+

{{ ticket.reservation.event.name }}

+

{{ ticket.reservation.event.datetime }}

+

Siège : {{ ticket.seat }}

+

Numéro de billet : {{ ticket.numero_uuid }}

+
{{ img_svg | safe }}
+
{{ bar_svg | safe }}
+ + diff --git a/DjangoFiles/BaseBillet/models.py b/DjangoFiles/BaseBillet/models.py index 8e2f6b9..71ad109 100644 --- a/DjangoFiles/BaseBillet/models.py +++ b/DjangoFiles/BaseBillet/models.py @@ -449,6 +449,9 @@ class Ticket(models.Model): datetime.short_description = 'Date de reservation' datetime.admin_order_field = 'reservation__datetime' + def numero_uuid(self): + return f"{self.uuid}".split('-')[0] + class meta: ordering = ('-datetime',) diff --git a/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-bold.otf b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-bold.otf new file mode 100644 index 0000000..514fc07 Binary files /dev/null and b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-bold.otf differ diff --git a/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-light.otf b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-light.otf new file mode 100644 index 0000000..1a261b5 Binary files /dev/null and b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-light.otf differ diff --git a/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-regular.otf b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-regular.otf new file mode 100644 index 0000000..d8932c8 Binary files /dev/null and b/DjangoFiles/BaseBillet/static/ticket/barlowcondensed-regular.otf differ diff --git a/DjangoFiles/BaseBillet/static/ticket/librebarcode128-regular.ttf b/DjangoFiles/BaseBillet/static/ticket/librebarcode128-regular.ttf new file mode 100644 index 0000000..15ff2ba Binary files /dev/null and b/DjangoFiles/BaseBillet/static/ticket/librebarcode128-regular.ttf differ diff --git a/DjangoFiles/BaseBillet/static/ticket/qrtest.html b/DjangoFiles/BaseBillet/static/ticket/qrtest.html new file mode 100644 index 0000000..ebaa76d --- /dev/null +++ b/DjangoFiles/BaseBillet/static/ticket/qrtest.html @@ -0,0 +1,15 @@ +
+ {{ img_svg | safe }} +
+ +{##} +{# fallback#} +{##} + +
+ {{ bar_svg | safe }} +
+ +{##} +{# fallback#} +{##} diff --git a/DjangoFiles/BaseBillet/static/ticket/ticket.css b/DjangoFiles/BaseBillet/static/ticket/ticket.css new file mode 100644 index 0000000..a181e21 --- /dev/null +++ b/DjangoFiles/BaseBillet/static/ticket/ticket.css @@ -0,0 +1,151 @@ +@font-face { + font-family: Libre Barcode; + src: url(librebarcode128-regular.ttf); +} +@font-face { + font-family: Barlow Condensed; + src: url(barlowcondensed-regular.otf); +} +@font-face { + font-family: Barlow Condensed; + font-weight: 300; + src: url(barlowcondensed-light.otf); +} +@font-face { + font-family: Barlow Condensed; + font-weight: 700; + src: url(barlowcondensed-bold.otf); +} + +@page { + margin: 0; + size: landscape; +} + +html { + align-content: center; + align-items: center; + background: #fff; + display: flex; + font-family: Barlow Condensed, sans-serif; + height: 100%; + justify-content: center; +} +body { + background: #eef1f5; + + box-sizing: border-box; + color: #2A3239; + display: flex; + flex-wrap: wrap; + height: 8cm; + justify-content: space-between; + margin: 0; + width: 25cm; +} + +section { + box-sizing: border-box; +} + +dl { + columns: 4; + text-align: center; +} +dt { + font-size: 9pt; + font-weight: 700; + text-transform: uppercase; +} +dd { + margin-left: 0; +} +ul { + align-items: center; + display: flex; + list-style: none; + margin: 0; + padding-left: 0; +} +li { + font-weight: 700; + text-transform: uppercase; +} + +#informations { + flex: 1; + padding: 0; + position: relative; +} +#informations h1 { + display: inline-block; + font-size: 25pt; + font-weight: 300; + text-transform: uppercase; +} +#informations #name { + margin-left: 1cm; +} +#informations #destination { + position: absolute; + right: 1cm; +} +#informations dl { + background: #2A3239; + color: #fff; + margin: 0; + padding: 1cm 0; +} +#informations dd { + border-left: 1pt solid #fff; + font-size: 35pt; +} +#informations dd:first-of-type { + border-left: 0; +} +#informations ul { + margin-left: 1cm; +} +#informations li { + font-weight: 300; + padding: 0.15cm; +} +#informations li:first-of-type { + background: #2A3239; + border-radius: 4pt; + color: #fff; +} +#informations li:last-of-type { + font-family: Libre Barcode, cursive; + color: black; + font-size: 25pt; + margin-left: auto; + padding-right: 1cm; + padding-top: 0.5cm; +} + +#ticket { + border-left: 1pt dashed #2A3239; + display: flex; + flex-direction: column; + height: 8cm; + justify-content: space-around; + padding: 0 1cm; +} +#ticket h2 { + font-weight: 300; + margin: 0; + text-transform: uppercase; +} +#ticket p { + font-family: Libre Barcode, cursive; + font-size: 25pt; + margin: 0; + text-align: center; +} +#ticket dl { + margin: 0; +} +#ticket li { + margin: 0 0.25cm; +} diff --git a/DjangoFiles/BaseBillet/static/ticket/ticket.html b/DjangoFiles/BaseBillet/static/ticket/ticket.html new file mode 100644 index 0000000..f0eb250 --- /dev/null +++ b/DjangoFiles/BaseBillet/static/ticket/ticket.html @@ -0,0 +1,231 @@ + + + {% load static %} + + +{# #} + + Boarding ticket + + + + + + +
+

{{ ticket.first_name }} {{ ticket.last_name }}

+

{{ ticket.reservation.event.name }}

+
+
Flight
+
DL31
+
Gate
+
29
+
Seat
+
26E
+
Zone
+
4
+
+ +
+ +
+

1257797706706

+

{{ ticket.first_name }} {{ ticket.last_name }}

+
+
Flight
+
DL31
+
Gate
+
29
+
Seat
+
26E
+
Zone
+
4
+
+ +
+ + + diff --git a/DjangoFiles/BaseBillet/static/ticket/ticket.pdf b/DjangoFiles/BaseBillet/static/ticket/ticket.pdf new file mode 100644 index 0000000..a3b3f0f Binary files /dev/null and b/DjangoFiles/BaseBillet/static/ticket/ticket.pdf differ diff --git a/DjangoFiles/BaseBillet/tasks.py b/DjangoFiles/BaseBillet/tasks.py index b70bb58..85dd38f 100644 --- a/DjangoFiles/BaseBillet/tasks.py +++ b/DjangoFiles/BaseBillet/tasks.py @@ -1,7 +1,9 @@ +import base64 import os from io import BytesIO -import base64 import segno +import barcode +from djoser import utils from weasyprint import HTML, CSS from weasyprint.text.fonts import FontConfiguration @@ -35,6 +37,7 @@ class CeleryMailerClass(): self.config = Configuration.get_solo() self.context = context self.attached_files = attached_files + self.sended = None if template and context: self.html = render_to_string(template, context=context) @@ -68,9 +71,11 @@ class CeleryMailerClass(): mail_return = mail.send(fail_silently=False) if mail_return == 1: + self.sended = True logger.info(f' mail envoyé : {mail_return} - {self.email}') else: logger.error(f' mail non envoyé : {mail_return} - {self.email}') + return mail_return else: logger.error(f'Pas de contenu HTML ou de configuration email valide') @@ -79,32 +84,38 @@ class CeleryMailerClass(): def create_ticket_pdf(ticket: Ticket): - qr = segno.make(f'{ticket.uuid}') - - buffer_png = BytesIO() - qr.save(buffer_png, kind='PNG', scale=15) - img_str = base64.b64encode(buffer_png.getvalue()).decode('utf-8') + qr = segno.make(f"{ticket.uuid}", micro=False) buffer_svg = BytesIO() - qr.save(buffer_svg, kind='svg', scale=10) + qr.save(buffer_svg, kind='svg', scale=8) + CODE128 = barcode.get_barcode_class('code128') + bar_svg = BytesIO() + bar_secret = utils.encode_uid(f"{ticket.uuid}".split('-')[4]) + + bar = CODE128(f"{bar_secret}") + options = { + 'module_height': 30, + 'module_width': 0.6, + 'font_size': 10, + } + bar.write(bar_svg, options = options) context = { 'ticket': ticket, 'config': Configuration.get_solo(), - 'img_str': base64.b64encode(buffer_png.getvalue()).decode('utf-8'), 'img_svg': buffer_svg.getvalue().decode('utf-8'), - 'img_svg64': base64.b64encode(buffer_svg.getvalue()).decode('utf-8'), + 'bar_svg': bar_svg.getvalue().decode('utf-8'), + # 'bar_svg64': base64.b64encode(bar_svg.getvalue()).decode('utf-8'), } template_name = 'ticket/ticket.html' - # template_name = 'ticket/qrtest.html' + # template_name = 'ticket/example_flight_ticket.html' font_config = FontConfiguration() - template = get_template(template_name) - html = template.render(context) + css = CSS(string= ''' @font-face { @@ -130,7 +141,7 @@ def create_ticket_pdf(ticket: Ticket): pdf_binary = HTML(string=html).write_pdf( stylesheets=[css], - font_config=font_config + font_config=font_config, ) return pdf_binary @@ -138,11 +149,6 @@ def create_ticket_pdf(ticket: Ticket): @app.task def ticket_celery_mailer(reservation_uuid: str): - ''' - for ticket in reservation.tickets.filter(status=Ticket.NOT_SCANNED): - response = requests.get(ticket.pdf_url()) - print(response.status_code) - ''' config = Configuration.get_solo() reservation = Reservation.objects.get(pk=reservation_uuid) @@ -163,7 +169,13 @@ def ticket_celery_mailer(reservation_uuid: str): attached_files=attached_files, ) mail.send() - return True + + logger.info(f"mail.sended : {mail.sended}") + if mail.sended : + reservation.mail_send = True + reservation.status = Reservation.VALID + reservation.save() + except Exception as e: logger.error(f"{timezone.now()} Erreur envoie de mail pour reservation {reservation} : {e}") raise Exception diff --git a/DjangoFiles/BaseBillet/views.py b/DjangoFiles/BaseBillet/views.py index 3c3c3e6..88bf067 100644 --- a/DjangoFiles/BaseBillet/views.py +++ b/DjangoFiles/BaseBillet/views.py @@ -10,6 +10,9 @@ from BaseBillet.models import Configuration, Event, Ticket import base64 import segno +import barcode +from djoser import utils + from io import StringIO, BytesIO from django.template import engines @@ -47,20 +50,31 @@ class Ticket_html_view(APIView): ticket = get_object_or_404(Ticket, uuid=pk_uuid) - qr = segno.make(f'{ticket.uuid}') - - buffer_png = BytesIO() - qr.save(buffer_png, kind='PNG', scale=3) + qr = segno.make(f"{ticket.uuid}", micro=False) buffer_svg = BytesIO() - qr.save(buffer_svg, kind='svg', scale=10) + qr.save(buffer_svg, kind='svg', scale=8) + + CODE128 = barcode.get_barcode_class('code128') + buffer_barcode_SVG = BytesIO() + bar_secret = utils.encode_uid(f"{ticket.uuid}".split('-')[4]) + + bar = CODE128(f"{bar_secret}") + options = { + 'module_height': 30, + 'module_width': 0.6, + 'font_size': 10, + } + bar.write(buffer_barcode_SVG, options=options) context = { 'ticket': ticket, 'config': Configuration.get_solo(), - 'img_str': base64.b64encode(buffer_png.getvalue()).decode('utf-8'), 'img_svg': buffer_svg.getvalue().decode('utf-8'), - 'img_svg64': base64.b64encode(buffer_svg.getvalue()).decode('utf-8'), + # 'img_svg64': base64.b64encode(buffer_svg.getvalue()).decode('utf-8'), + 'bar_svg': buffer_barcode_SVG.getvalue().decode('utf-8'), + # 'bar_svg64': base64.b64encode(buffer_barcode_SVG.getvalue()).decode('utf-8'), + } return render(request, 'ticket/ticket.html', context=context) diff --git a/Docker/Dockerfile/dockerfile b/Docker/Dockerfile/dockerfile index a81a54d..1df7104 100644 --- a/Docker/Dockerfile/dockerfile +++ b/Docker/Dockerfile/dockerfile @@ -75,6 +75,7 @@ RUN pip install redis RUN pip install tenant-schemas-celery RUN pip install segno +RUN pip install python-barcode RUN apt-get -y clean