Update: admin panel, SMTP/EWS/Outlook mail modes, QR fix, event folders, security improvements

This commit is contained in:
Admin
2026-08-31 12:35:02 +03:00
parent a69abb948f
commit 76a42f14d0
32 changed files with 1474 additions and 116 deletions
+16 -6
View File
@@ -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="Иванович",