From 30bfe55c0c246931040d8519eb03c75cbb1b37c1 Mon Sep 17 00:00:00 2001 From: kolo Date: Sat, 3 Jan 2026 03:04:54 +0300 Subject: [PATCH] Initial commit --- .../application/bot/admin_dialogs/tests.py | 14 +++++- .../application/bot/creator_dialogs/tests.py | 43 ++++++------------- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/trudex/application/bot/admin_dialogs/tests.py b/src/trudex/application/bot/admin_dialogs/tests.py index 5010c2e..e136982 100644 --- a/src/trudex/application/bot/admin_dialogs/tests.py +++ b/src/trudex/application/bot/admin_dialogs/tests.py @@ -147,7 +147,17 @@ async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Confi return { "share_link": share_link, - "qr_media": BufferedInputFile(qr_bytes, filename="qr.png") + } + + +async def qr_media_selector(data: dict, widget, manager: DialogManager): + """Селектор для получения QR-кода из dialog_data""" + qr_bytes = manager.dialog_data.get("qr_bytes") + if not qr_bytes: + return None + return { + "type": ContentType.PHOTO, + "media": BufferedInputFile(qr_bytes, filename="qr.png") } @@ -399,8 +409,8 @@ tests_dialog = Dialog( state=AdminTestsSG.edit_expires, ), Window( - DynamicMedia("qr_media"), Format("🔗 Поделиться тестом\n\n📎 Ссылка на тест:\n{share_link}\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"), + DynamicMedia(selector=qr_media_selector), Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list), state=AdminTestsSG.share_test, getter=get_share_data, diff --git a/src/trudex/application/bot/creator_dialogs/tests.py b/src/trudex/application/bot/creator_dialogs/tests.py index 7ac4730..4e37bc3 100644 --- a/src/trudex/application/bot/creator_dialogs/tests.py +++ b/src/trudex/application/bot/creator_dialogs/tests.py @@ -4,8 +4,10 @@ from datetime import date, datetime import logging from aiogram import Bot +from aiogram.enums import ContentType from aiogram.types import BufferedInputFile, CallbackQuery, Message from aiogram_dialog import Dialog, DialogManager, StartMode, Window +from aiogram_dialog.api.entities import MediaAttachment from aiogram_dialog.widgets.input import MessageInput from aiogram_dialog.widgets.kbd import (Button, Calendar, Column, Row, ScrollingGroup, Select) @@ -112,23 +114,9 @@ async def on_back_to_list(_callback: CallbackQuery, _button: Button, manager: Di await manager.switch_to(CreatorTestsSG.tests_list) -async def on_share_test(_callback: CallbackQuery, _button: Button, manager: DialogManager): - await manager.switch_to(CreatorTestsSG.share_test) - -def debug_getter(func): - @functools.wraps(func) - async def wrapper(*args, **kwargs): - try: - return await func(*args, **kwargs) - except Exception as e: - logging.exception(f"CRASH in getter {func.__name__}: {e}") - raise e # Пробрасываем ошибку дальше, чтобы диалог всё равно упал - return wrapper - -@debug_getter @inject -async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Config], bot_inst: FromDishka[Bot], **_kwargs): - test_id = dialog_manager.dialog_data.get("selected_test_id") +async def on_share_test(_callback: CallbackQuery, _button: Button, manager: DialogManager, config: FromDishka[Config], bot_inst: FromDishka[Bot]): + test_id = manager.dialog_data.get("selected_test_id") if not test_id: return { @@ -150,13 +138,13 @@ async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Confi None, functools.partial(generate_qr_bytes, share_link) ) - - dialog_manager.dialog_data["qr_bytes"] = qr_bytes - - return { - "share_link": share_link, - "qr_media": BufferedInputFile(qr_bytes, filename="qr.png") - } + + assert _callback.message is not None + + await _callback.message.answer_photo( + photo=BufferedInputFile(qr_bytes, filename="qr.png"), + caption=f"🔗 Поделиться тестом\n\n📎 Ссылка на тест:\n{share_link}\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста" + ) async def on_edit_password(_callback: CallbackQuery, _button: Button, manager: DialogManager): @@ -405,13 +393,6 @@ tests_dialog = Dialog( Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list), ), state=CreatorTestsSG.edit_expires, - ), - Window( - DynamicMedia("qr_media"), - Format("🔗 Поделиться тестом\n\n📎 Ссылка на тест:\n{share_link}\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"), - Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list), - state=CreatorTestsSG.share_test, - getter=get_share_data, - ), + ) )