mirror of
https://github.com/koloideal/Quizzi.git
synced 2026-06-10 10:25:28 +03:00
Initial commit
This commit is contained in:
@@ -147,7 +147,17 @@ async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Confi
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
"share_link": share_link,
|
"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,
|
state=AdminTestsSG.edit_expires,
|
||||||
),
|
),
|
||||||
Window(
|
Window(
|
||||||
DynamicMedia("qr_media"),
|
|
||||||
Format("<b>🔗 Поделиться тестом</b>\n\n📎 <b>Ссылка на тест:</b>\n<code>{share_link}</code>\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"),
|
Format("<b>🔗 Поделиться тестом</b>\n\n📎 <b>Ссылка на тест:</b>\n<code>{share_link}</code>\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"),
|
||||||
|
DynamicMedia(selector=qr_media_selector),
|
||||||
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list),
|
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list),
|
||||||
state=AdminTestsSG.share_test,
|
state=AdminTestsSG.share_test,
|
||||||
getter=get_share_data,
|
getter=get_share_data,
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ from datetime import date, datetime
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from aiogram import Bot
|
from aiogram import Bot
|
||||||
|
from aiogram.enums import ContentType
|
||||||
from aiogram.types import BufferedInputFile, CallbackQuery, Message
|
from aiogram.types import BufferedInputFile, CallbackQuery, Message
|
||||||
from aiogram_dialog import Dialog, DialogManager, StartMode, Window
|
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.input import MessageInput
|
||||||
from aiogram_dialog.widgets.kbd import (Button, Calendar, Column, Row,
|
from aiogram_dialog.widgets.kbd import (Button, Calendar, Column, Row,
|
||||||
ScrollingGroup, Select)
|
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)
|
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
|
@inject
|
||||||
async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Config], bot_inst: FromDishka[Bot], **_kwargs):
|
async def on_share_test(_callback: CallbackQuery, _button: Button, manager: DialogManager, config: FromDishka[Config], bot_inst: FromDishka[Bot]):
|
||||||
test_id = dialog_manager.dialog_data.get("selected_test_id")
|
test_id = manager.dialog_data.get("selected_test_id")
|
||||||
|
|
||||||
if not test_id:
|
if not test_id:
|
||||||
return {
|
return {
|
||||||
@@ -150,13 +138,13 @@ async def get_share_data(dialog_manager: DialogManager, config: FromDishka[Confi
|
|||||||
None,
|
None,
|
||||||
functools.partial(generate_qr_bytes, share_link)
|
functools.partial(generate_qr_bytes, share_link)
|
||||||
)
|
)
|
||||||
|
|
||||||
dialog_manager.dialog_data["qr_bytes"] = qr_bytes
|
assert _callback.message is not None
|
||||||
|
|
||||||
return {
|
await _callback.message.answer_photo(
|
||||||
"share_link": share_link,
|
photo=BufferedInputFile(qr_bytes, filename="qr.png"),
|
||||||
"qr_media": BufferedInputFile(qr_bytes, filename="qr.png")
|
caption=f"<b>🔗 Поделиться тестом</b>\n\n📎 <b>Ссылка на тест:</b>\n<code>{share_link}</code>\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"
|
||||||
}
|
)
|
||||||
|
|
||||||
|
|
||||||
async def on_edit_password(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
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),
|
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list),
|
||||||
),
|
),
|
||||||
state=CreatorTestsSG.edit_expires,
|
state=CreatorTestsSG.edit_expires,
|
||||||
),
|
)
|
||||||
Window(
|
|
||||||
DynamicMedia("qr_media"),
|
|
||||||
Format("<b>🔗 Поделиться тестом</b>\n\n📎 <b>Ссылка на тест:</b>\n<code>{share_link}</code>\n\n💡 Отправьте эту ссылку или QR-код пользователям для прохождения теста"),
|
|
||||||
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_list),
|
|
||||||
state=CreatorTestsSG.share_test,
|
|
||||||
getter=get_share_data,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user