Update: admin panel, SMTP/EWS/Outlook mail modes, QR fix, event folders, security improvements
This commit is contained in:
@@ -5,6 +5,8 @@ from PIL import Image, ImageDraw, ImageFont
|
||||
from flask import current_app
|
||||
|
||||
from app.services.qr_service import generate_qr_for_guest
|
||||
from app.utils.timezone import utc_to_local
|
||||
from app.utils.paths import event_logo_folder, event_tickets_folder, event_photo_folder, event_qr_folder
|
||||
|
||||
|
||||
TICKET_SIZE = (650, 1150)
|
||||
@@ -49,7 +51,7 @@ def _draw_logo_centered(img, event, y, max_width):
|
||||
if not event.logo_filename:
|
||||
return y
|
||||
|
||||
logo_path = Path(current_app.config["LOGO_FOLDER"]) / event.logo_filename
|
||||
logo_path = event_logo_folder(event.id) / event.logo_filename
|
||||
if not logo_path.exists():
|
||||
current_app.logger.warning(f"Логотип не найден: {logo_path}")
|
||||
return y
|
||||
@@ -292,8 +294,9 @@ def generate_ticket_image(guest, event, output_path=None):
|
||||
_draw_ornament(draw, y, width, accent_color)
|
||||
y += 25
|
||||
if event.event_date:
|
||||
date_value = event.event_date.strftime("%d.%m.%Y")
|
||||
time_value = event.event_date.strftime("%H:%M")
|
||||
local_event_date = utc_to_local(event.event_date)
|
||||
date_value = local_event_date.strftime("%d.%m.%Y")
|
||||
time_value = local_event_date.strftime("%H:%M")
|
||||
y = _draw_info_row(draw, "Дата", date_value, x_content, y, content_width, label_font, body_font, text_color)
|
||||
y = _draw_info_row(draw, "Время", time_value, x_content, y, content_width, label_font, body_font, text_color)
|
||||
if event.location:
|
||||
@@ -302,7 +305,10 @@ def generate_ticket_image(guest, event, output_path=None):
|
||||
# QR-код
|
||||
if event.ticket_show_qr:
|
||||
y += 15
|
||||
qr_path = Path(current_app.config["QR_FOLDER"]) / guest.qr_filename
|
||||
qr_path = event_qr_folder(guest.event_id) / guest.qr_filename
|
||||
if not qr_path.exists():
|
||||
# fallback на старую корневую папку
|
||||
qr_path = Path(current_app.config["QR_FOLDER"]) / guest.qr_filename
|
||||
if qr_path.exists():
|
||||
qr_size = 200
|
||||
qr_img = Image.open(str(qr_path)).convert("RGB")
|
||||
@@ -314,7 +320,10 @@ def generate_ticket_image(guest, event, output_path=None):
|
||||
|
||||
# Фото гостя
|
||||
if event.ticket_show_photo and guest.photo_filename:
|
||||
photo_path = Path(current_app.config["PHOTO_FOLDER"]) / guest.photo_filename
|
||||
photo_path = event_photo_folder(guest.event_id) / guest.photo_filename
|
||||
if not photo_path.exists():
|
||||
# fallback на старую корневую папку
|
||||
photo_path = Path(current_app.config["PHOTO_FOLDER"]) / guest.photo_filename
|
||||
if photo_path.exists():
|
||||
photo_img = Image.open(str(photo_path)).convert("RGB")
|
||||
photo_img.thumbnail((130, 130))
|
||||
@@ -339,7 +348,7 @@ def generate_ticket_image(guest, event, output_path=None):
|
||||
|
||||
# Сохранение
|
||||
if output_path is None:
|
||||
tickets_folder = Path(current_app.config["UPLOAD_FOLDER"]) / "tickets"
|
||||
tickets_folder = event_tickets_folder(event.id)
|
||||
tickets_folder.mkdir(parents=True, exist_ok=True)
|
||||
output_path = tickets_folder / f"ticket_{event.id}_{guest.token}.png"
|
||||
|
||||
@@ -352,6 +361,7 @@ def generate_preview_ticket(event, sample_guest=None):
|
||||
if sample_guest is None:
|
||||
from app.models import Guest
|
||||
sample_guest = Guest(
|
||||
event_id=event.id,
|
||||
last_name="Иванов",
|
||||
first_name="Иван",
|
||||
middle_name="Иванович",
|
||||
|
||||
Reference in New Issue
Block a user