mirror of
https://github.com/koloideal/Quizzi.git
synced 2026-06-10 18:35:28 +03:00
Initial commit
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
from aiogram.types import CallbackQuery, Message
|
||||
from aiogram_dialog import Dialog, DialogManager, StartMode, Window
|
||||
from aiogram_dialog.widgets.input import MessageInput
|
||||
from aiogram_dialog.widgets.kbd import Button, Column, Row, ScrollingGroup, Select
|
||||
from aiogram_dialog.widgets.text import Const, Format
|
||||
from dishka.integrations.aiogram import CONTAINER_NAME
|
||||
|
||||
from trudex.application.bot.admin_dialogs.states import AdminGroupsSG, AdminMenuSG
|
||||
from trudex.infrastructure.database.dao.group import GroupDAO
|
||||
|
||||
|
||||
async def on_group_click(_callback: CallbackQuery, _widget, _manager: DialogManager, _item_id: str):
|
||||
await _callback.answer("ℹ️ Для удаления используйте кнопку 'Удалить группу'")
|
||||
|
||||
|
||||
async def get_groups_data(dialog_manager: DialogManager, **_kwargs):
|
||||
container = dialog_manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
success_message = dialog_manager.dialog_data.pop("success_message", None)
|
||||
|
||||
message_text = "<b>👥 Управление группами</b>\n\n"
|
||||
if success_message:
|
||||
message_text += f"{success_message}\n\n"
|
||||
message_text += f"📊 <b>Всего групп:</b> {len(groups)}\n\n<b>Список групп:</b>"
|
||||
|
||||
return {
|
||||
"groups": [(str(g.id), str(g.number)) for g in groups],
|
||||
"groups_count": len(groups),
|
||||
"message_text": message_text,
|
||||
}
|
||||
|
||||
|
||||
async def on_add_group(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(AdminGroupsSG.add_group_input_number)
|
||||
|
||||
|
||||
async def on_delete_group(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(AdminGroupsSG.delete_groups_list)
|
||||
|
||||
|
||||
async def on_back_to_menu(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.start(AdminMenuSG.main, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_group_number_input(message: Message, _widget: MessageInput, manager: DialogManager):
|
||||
if not message.text:
|
||||
await message.answer("❌ Номер группы не может быть пустым")
|
||||
return
|
||||
|
||||
number_str = message.text.strip()
|
||||
|
||||
if not number_str.isdigit():
|
||||
await message.answer("❌ Номер группы должен содержать только цифры")
|
||||
return
|
||||
|
||||
number = int(number_str)
|
||||
|
||||
if number < 1000 or number > 9999:
|
||||
await message.answer("❌ Номер группы должен быть четырехзначным (1000-9999)")
|
||||
return
|
||||
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
existing = await group_dao.get_by_number(number)
|
||||
if existing:
|
||||
await message.answer(f"❌ Группа с номером {number} уже существует")
|
||||
return
|
||||
|
||||
try:
|
||||
await group_dao.create(number=number)
|
||||
manager.dialog_data["success_message"] = f"✅ Группа {number} создана"
|
||||
except Exception as e:
|
||||
await message.answer(f"❌ Ошибка создания группы: {e}")
|
||||
return
|
||||
|
||||
await manager.switch_to(AdminGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def on_cancel_add(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(AdminGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def get_delete_groups_data(dialog_manager: DialogManager, **_kwargs):
|
||||
container = dialog_manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
return {
|
||||
"groups": [(str(g.id), f"{g.number}") for g in groups],
|
||||
"groups_count": len(groups),
|
||||
}
|
||||
|
||||
|
||||
async def on_select_group_to_delete(_callback: CallbackQuery, _widget, manager: DialogManager, item_id: str):
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
group = await group_dao.get_by_id(int(item_id))
|
||||
if not group:
|
||||
await _callback.answer("❌ Группа не найдена", show_alert=True)
|
||||
return
|
||||
|
||||
manager.dialog_data["delete_group_id"] = group.id
|
||||
manager.dialog_data["delete_group_number"] = group.number
|
||||
await manager.switch_to(AdminGroupsSG.delete_confirm)
|
||||
|
||||
|
||||
async def get_delete_confirm_data(dialog_manager: DialogManager, **_kwargs):
|
||||
number = dialog_manager.dialog_data.get("delete_group_number", "")
|
||||
|
||||
return {
|
||||
"group_info": str(number)
|
||||
}
|
||||
|
||||
|
||||
async def on_confirm_delete(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
group_id = manager.dialog_data.get("delete_group_id")
|
||||
|
||||
await group_dao.delete(group_id)
|
||||
|
||||
manager.dialog_data["success_message"] = "✅ Группа удалена"
|
||||
await manager.switch_to(AdminGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def on_cancel_delete(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(AdminGroupsSG.delete_groups_list)
|
||||
|
||||
|
||||
groups_dialog = Dialog(
|
||||
Window(
|
||||
Format("{message_text}"),
|
||||
ScrollingGroup(
|
||||
Select(
|
||||
Format("{item[1]}"),
|
||||
id="groups",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="groups",
|
||||
on_click=on_group_click,
|
||||
),
|
||||
id="groups_scroll",
|
||||
width=2,
|
||||
height=7,
|
||||
),
|
||||
Column(
|
||||
Button(Const("➕ Добавить группу"), id="add", on_click=on_add_group),
|
||||
Button(Const("🗑 Удалить группу"), id="delete", on_click=on_delete_group),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_menu),
|
||||
),
|
||||
state=AdminGroupsSG.groups_list,
|
||||
getter=get_groups_data,
|
||||
),
|
||||
Window(
|
||||
Const("<b>➕ Добавление группы</b>\n\n🔢 <b>Введите номер группы</b> (четырехзначное число 1000-9999):"),
|
||||
MessageInput(on_group_number_input),
|
||||
Button(Const("◀️ Отмена"), id="cancel", on_click=on_cancel_add),
|
||||
state=AdminGroupsSG.add_group_input_number,
|
||||
),
|
||||
Window(
|
||||
Format("<b>🗑 Удаление группы</b>\n\n<b>Выберите группу для удаления:</b>\n\n📊 <b>Всего групп:</b> {groups_count}"),
|
||||
ScrollingGroup(
|
||||
Select(
|
||||
Format("{item[1]}"),
|
||||
id="delete_groups",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="groups",
|
||||
on_click=on_select_group_to_delete,
|
||||
),
|
||||
id="delete_groups_scroll",
|
||||
width=2,
|
||||
height=7,
|
||||
),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_cancel_add),
|
||||
state=AdminGroupsSG.delete_groups_list,
|
||||
getter=get_delete_groups_data,
|
||||
),
|
||||
Window(
|
||||
Format("<b>⚠️ Подтверждение удаления</b>\n\n<b>Точно хотите удалить группу?</b>\n\n👥 {group_info}"),
|
||||
Row(
|
||||
Button(Const("✅ Да, удалить"), id="confirm", on_click=on_confirm_delete),
|
||||
Button(Const("❌ Отмена"), id="cancel", on_click=on_cancel_delete),
|
||||
),
|
||||
state=AdminGroupsSG.delete_confirm,
|
||||
getter=get_delete_confirm_data,
|
||||
),
|
||||
)
|
||||
@@ -3,7 +3,7 @@ from aiogram_dialog import Dialog, DialogManager, Window, StartMode
|
||||
from aiogram_dialog.widgets.kbd import Button, Column
|
||||
from aiogram_dialog.widgets.text import Const
|
||||
|
||||
from trudex.application.bot.admin_dialogs.states import AdminMenuSG, AdminUsersSG, AdminTestsSG, AdminBroadcastSG
|
||||
from trudex.application.bot.admin_dialogs.states import AdminMenuSG, AdminUsersSG, AdminTestsSG, AdminBroadcastSG, AdminGroupsSG
|
||||
|
||||
|
||||
async def on_tests_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
@@ -14,6 +14,10 @@ async def on_users_clicked(_callback: CallbackQuery, _button: Button, manager: D
|
||||
await manager.start(AdminUsersSG.users_list, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_groups_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
await manager.start(AdminGroupsSG.groups_list, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_broadcast_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
await manager.start(AdminBroadcastSG.broadcast_input, mode=StartMode.RESET_STACK)
|
||||
|
||||
@@ -24,6 +28,7 @@ admin_menu_dialog = Dialog(
|
||||
Column(
|
||||
Button(Const("📝 Тесты"), id="tests", on_click=on_tests_clicked),
|
||||
Button(Const("👥 Пользователи"), id="users", on_click=on_users_clicked),
|
||||
Button(Const("🎓 Группы"), id="groups", on_click=on_groups_clicked),
|
||||
Button(Const("📢 Рассылка"), id="broadcast", on_click=on_broadcast_clicked),
|
||||
),
|
||||
state=AdminMenuSG.main,
|
||||
|
||||
@@ -18,3 +18,10 @@ class AdminTestsSG(StatesGroup):
|
||||
class AdminBroadcastSG(StatesGroup):
|
||||
broadcast_input = State()
|
||||
broadcast_confirm = State()
|
||||
|
||||
|
||||
class AdminGroupsSG(StatesGroup):
|
||||
groups_list = State()
|
||||
add_group_input_number = State()
|
||||
delete_groups_list = State()
|
||||
delete_confirm = State()
|
||||
|
||||
@@ -3,12 +3,13 @@ from datetime import date, datetime
|
||||
from aiogram.types import CallbackQuery, ContentType, Message
|
||||
from aiogram_dialog import Dialog, DialogManager, Window, StartMode
|
||||
from aiogram_dialog.widgets.input import MessageInput
|
||||
from aiogram_dialog.widgets.kbd import Button, Calendar, Cancel, Column, Row, Select
|
||||
from aiogram_dialog.widgets.kbd import Button, Calendar, Cancel, Column, Row, ScrollingGroup, Select
|
||||
from aiogram_dialog.widgets.text import Const, Format
|
||||
from dishka.integrations.aiogram import CONTAINER_NAME
|
||||
from dishka.integrations.aiogram_dialog import inject
|
||||
|
||||
from trudex.application.bot.creator_dialogs.states import CreateTestSG, CreatorTestsSG
|
||||
from trudex.infrastructure.database.dao.group import GroupDAO
|
||||
from trudex.infrastructure.database.dao.option import OptionDAO
|
||||
from trudex.infrastructure.database.dao.question import QuestionDAO
|
||||
from trudex.infrastructure.database.dao.test import TestDAO
|
||||
@@ -66,12 +67,29 @@ async def on_password_input(message: Message, _widget: MessageInput, manager: Di
|
||||
return
|
||||
|
||||
manager.dialog_data["password"] = password
|
||||
await manager.switch_to(CreateTestSG.input_expires_at)
|
||||
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
if len(groups) == 0:
|
||||
manager.dialog_data["for_group"] = None
|
||||
await manager.switch_to(CreateTestSG.confirm_test_info)
|
||||
else:
|
||||
await manager.switch_to(CreateTestSG.input_expires_at)
|
||||
|
||||
|
||||
async def on_skip_password(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
manager.dialog_data["password"] = None
|
||||
await manager.switch_to(CreateTestSG.input_expires_at)
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
if len(groups) == 0:
|
||||
manager.dialog_data["for_group"] = None
|
||||
await manager.switch_to(CreateTestSG.confirm_test_info)
|
||||
else:
|
||||
await manager.switch_to(CreateTestSG.input_expires_at)
|
||||
|
||||
|
||||
async def on_date_selected(_callback, _widget, manager: DialogManager, selected_date: date):
|
||||
@@ -84,13 +102,19 @@ async def on_skip_expires(_callback: CallbackQuery, _button: Button, manager: Di
|
||||
await manager.switch_to(CreateTestSG.input_for_group)
|
||||
|
||||
|
||||
async def on_group_input(message: Message, _widget: MessageInput, manager: DialogManager):
|
||||
text = (message.text or "").strip()
|
||||
if text.isdigit() and len(text) == 4:
|
||||
manager.dialog_data["for_group"] = int(text)
|
||||
await manager.switch_to(CreateTestSG.confirm_test_info)
|
||||
else:
|
||||
await message.answer("❌ Группа должна быть 4-значным числом")
|
||||
async def get_groups_for_test(dialog_manager: DialogManager, **_kwargs):
|
||||
container = dialog_manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
return {
|
||||
"groups": [(str(g.number), str(g.number)) for g in groups],
|
||||
}
|
||||
|
||||
|
||||
async def on_group_selected(_callback: CallbackQuery, _widget, manager: DialogManager, item_id: str):
|
||||
manager.dialog_data["for_group"] = int(item_id)
|
||||
await manager.switch_to(CreateTestSG.confirm_test_info)
|
||||
|
||||
|
||||
async def on_skip_group(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
@@ -183,7 +207,7 @@ async def get_question_type_data(**_kwargs):
|
||||
return {
|
||||
"question_types": [
|
||||
("single", "📌 Один правильный ответ"),
|
||||
("multiple", "� Ннесколько правильных ответов"),
|
||||
("multiple", "� Несколько правильных ответов"),
|
||||
("input", "✏️ Ввод текста"),
|
||||
]
|
||||
}
|
||||
@@ -423,10 +447,22 @@ create_test_dialog = Dialog(
|
||||
state=CreateTestSG.input_expires_at,
|
||||
),
|
||||
Window(
|
||||
Const("<b>👥 Группа</b>\n\n🎓 <b>Введите номер группы</b> (4 цифры) или пропустите для всех:"),
|
||||
MessageInput(on_group_input),
|
||||
Const("<b>👥 Группа</b>\n\n🎓 <b>Выберите группу</b> или пропустите для всех:"),
|
||||
ScrollingGroup(
|
||||
Select(
|
||||
Format("{item[1]}"),
|
||||
id="groups",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="groups",
|
||||
on_click=on_group_selected,
|
||||
),
|
||||
id="groups_scroll",
|
||||
width=2,
|
||||
height=7,
|
||||
),
|
||||
Button(Const("⏭️ Для всех"), id="skip_group", on_click=on_skip_group),
|
||||
state=CreateTestSG.input_for_group,
|
||||
getter=get_groups_for_test,
|
||||
),
|
||||
Window(
|
||||
Format("{info}\n\n<b>✅ Подтвердите создание теста:</b>"),
|
||||
@@ -454,13 +490,13 @@ create_test_dialog = Dialog(
|
||||
),
|
||||
Window(
|
||||
Const("<b>📋 Тип вопроса</b>\n\n🎯 <b>Выберите тип вопроса:</b>"),
|
||||
Select(
|
||||
Column(Select(
|
||||
Format("{item[1]}"),
|
||||
id="question_type",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="question_types",
|
||||
on_click=on_question_type_selected,
|
||||
),
|
||||
)),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_cancel_question),
|
||||
state=CreateTestSG.select_question_type,
|
||||
getter=get_question_type_data,
|
||||
@@ -481,13 +517,13 @@ create_test_dialog = Dialog(
|
||||
),
|
||||
Window(
|
||||
Const("<b>✅ Правильные ответы</b>\n\n<b>Отметьте правильные варианты ответов:</b>"),
|
||||
Select(
|
||||
Column(Select(
|
||||
Format("{item[1]}"),
|
||||
id="options",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="options",
|
||||
on_click=on_option_toggle,
|
||||
),
|
||||
)),
|
||||
Button(Const("✅ Подтвердить выбор"), id="confirm", on_click=on_confirm_correct),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_cancel_question),
|
||||
state=CreateTestSG.mark_correct_options,
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
from aiogram.types import CallbackQuery, Message
|
||||
from aiogram_dialog import Dialog, DialogManager, StartMode, Window
|
||||
from aiogram_dialog.widgets.input import MessageInput
|
||||
from aiogram_dialog.widgets.kbd import Button, Column, Row, ScrollingGroup, Select
|
||||
from aiogram_dialog.widgets.text import Const, Format
|
||||
from dishka.integrations.aiogram import CONTAINER_NAME
|
||||
|
||||
from trudex.application.bot.creator_dialogs.states import CreatorGroupsSG
|
||||
from trudex.infrastructure.database.dao.group import GroupDAO
|
||||
|
||||
|
||||
async def on_group_click(_callback: CallbackQuery, _widget, _manager: DialogManager, _item_id: str):
|
||||
await _callback.answer("ℹ️ Для удаления используйте кнопку 'Удалить группу'")
|
||||
|
||||
|
||||
async def get_groups_data(dialog_manager: DialogManager, **_kwargs):
|
||||
container = dialog_manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
success_message = dialog_manager.dialog_data.pop("success_message", None)
|
||||
|
||||
message_text = "<b>👥 Управление группами</b>\n\n"
|
||||
if success_message:
|
||||
message_text += f"{success_message}\n\n"
|
||||
message_text += f"📊 <b>Всего групп:</b> {len(groups)}\n\n<b>Список групп:</b>"
|
||||
|
||||
return {
|
||||
"groups": [(str(g.id), str(g.number)) for g in groups],
|
||||
"groups_count": len(groups),
|
||||
"message_text": message_text,
|
||||
}
|
||||
|
||||
|
||||
async def on_add_group(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(CreatorGroupsSG.add_group_input_number)
|
||||
|
||||
|
||||
async def on_delete_group(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(CreatorGroupsSG.delete_groups_list)
|
||||
|
||||
|
||||
async def on_back_to_menu(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
from trudex.application.bot.creator_dialogs.states import CreatorMenuSG
|
||||
await manager.start(CreatorMenuSG.main, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_group_number_input(message: Message, _widget: MessageInput, manager: DialogManager):
|
||||
if not message.text:
|
||||
await message.answer("❌ Номер группы не может быть пустым")
|
||||
return
|
||||
|
||||
number_str = message.text.strip()
|
||||
|
||||
if not number_str.isdigit():
|
||||
await message.answer("❌ Номер группы должен содержать только цифры")
|
||||
return
|
||||
|
||||
number = int(number_str)
|
||||
|
||||
if number < 1000 or number > 9999:
|
||||
await message.answer("❌ Номер группы должен быть четырехзначным (1000-9999)")
|
||||
return
|
||||
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
existing = await group_dao.get_by_number(number)
|
||||
if existing:
|
||||
await message.answer(f"❌ Группа с номером {number} уже существует")
|
||||
return
|
||||
|
||||
try:
|
||||
await group_dao.create(number=number)
|
||||
manager.dialog_data["success_message"] = f"✅ Группа {number} создана"
|
||||
except Exception as e:
|
||||
await message.answer(f"❌ Ошибка создания группы: {e}")
|
||||
return
|
||||
|
||||
await manager.switch_to(CreatorGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def on_cancel_add(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(CreatorGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def get_delete_groups_data(dialog_manager: DialogManager, **_kwargs):
|
||||
container = dialog_manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
groups = await group_dao.get_all()
|
||||
|
||||
return {
|
||||
"groups": [(str(g.id), str(g.number)) for g in groups],
|
||||
"groups_count": len(groups),
|
||||
}
|
||||
|
||||
|
||||
async def on_select_group_to_delete(_callback: CallbackQuery, _widget, manager: DialogManager, item_id: str):
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
group = await group_dao.get_by_id(int(item_id))
|
||||
if not group:
|
||||
await _callback.answer("❌ Группа не найдена", show_alert=True)
|
||||
return
|
||||
|
||||
manager.dialog_data["delete_group_id"] = group.id
|
||||
manager.dialog_data["delete_group_number"] = group.number
|
||||
await manager.switch_to(CreatorGroupsSG.delete_confirm)
|
||||
|
||||
|
||||
async def get_delete_confirm_data(dialog_manager: DialogManager, **_kwargs):
|
||||
number = dialog_manager.dialog_data.get("delete_group_number", "")
|
||||
|
||||
return {
|
||||
"group_info": str(number)
|
||||
}
|
||||
|
||||
|
||||
async def on_confirm_delete(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
container = manager.middleware_data[CONTAINER_NAME]
|
||||
group_dao = await container.get(GroupDAO)
|
||||
|
||||
group_id = manager.dialog_data.get("delete_group_id")
|
||||
|
||||
await group_dao.delete(group_id)
|
||||
|
||||
manager.dialog_data["success_message"] = "✅ Группа удалена"
|
||||
await manager.switch_to(CreatorGroupsSG.groups_list)
|
||||
|
||||
|
||||
async def on_cancel_delete(_callback: CallbackQuery, _button: Button, manager: DialogManager):
|
||||
await manager.switch_to(CreatorGroupsSG.delete_groups_list)
|
||||
|
||||
|
||||
groups_dialog = Dialog(
|
||||
Window(
|
||||
Format("{message_text}"),
|
||||
ScrollingGroup(
|
||||
Select(
|
||||
Format("{item[1]}"),
|
||||
id="groups",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="groups",
|
||||
on_click=on_group_click,
|
||||
),
|
||||
id="groups_scroll",
|
||||
width=2,
|
||||
height=7,
|
||||
),
|
||||
Column(
|
||||
Button(Const("➕ Добавить группу"), id="add", on_click=on_add_group),
|
||||
Button(Const("🗑 Удалить группу"), id="delete", on_click=on_delete_group),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_back_to_menu),
|
||||
),
|
||||
state=CreatorGroupsSG.groups_list,
|
||||
getter=get_groups_data,
|
||||
),
|
||||
Window(
|
||||
Const("<b>➕ Добавление группы</b>\n\n🔢 <b>Введите номер группы</b> (четырехзначное число 1000-9999):"),
|
||||
MessageInput(on_group_number_input),
|
||||
Button(Const("◀️ Отмена"), id="cancel", on_click=on_cancel_add),
|
||||
state=CreatorGroupsSG.add_group_input_number,
|
||||
),
|
||||
Window(
|
||||
Format("<b>🗑 Удаление группы</b>\n\n<b>Выберите группу для удаления:</b>\n\n📊 <b>Всего групп:</b> {groups_count}"),
|
||||
ScrollingGroup(
|
||||
Select(
|
||||
Format("{item[1]}"),
|
||||
id="delete_groups",
|
||||
item_id_getter=lambda x: x[0],
|
||||
items="groups",
|
||||
on_click=on_select_group_to_delete,
|
||||
),
|
||||
id="delete_groups_scroll",
|
||||
width=2,
|
||||
height=7,
|
||||
),
|
||||
Button(Const("◀️ Назад"), id="back", on_click=on_cancel_add),
|
||||
state=CreatorGroupsSG.delete_groups_list,
|
||||
getter=get_delete_groups_data,
|
||||
),
|
||||
Window(
|
||||
Format("<b>⚠️ Подтверждение удаления</b>\n\n<b>Точно хотите удалить группу?</b>\n\n👥 {group_info}"),
|
||||
Row(
|
||||
Button(Const("✅ Да, удалить"), id="confirm", on_click=on_confirm_delete),
|
||||
Button(Const("❌ Отмена"), id="cancel", on_click=on_cancel_delete),
|
||||
),
|
||||
state=CreatorGroupsSG.delete_confirm,
|
||||
getter=get_delete_confirm_data,
|
||||
),
|
||||
)
|
||||
@@ -3,7 +3,7 @@ from aiogram_dialog import Dialog, DialogManager, Window, StartMode
|
||||
from aiogram_dialog.widgets.kbd import Button, Column
|
||||
from aiogram_dialog.widgets.text import Const
|
||||
|
||||
from trudex.application.bot.creator_dialogs.states import CreatorMenuSG, CreatorUsersSG, CreatorTestsSG, CreatorBroadcastSG
|
||||
from trudex.application.bot.creator_dialogs.states import CreatorMenuSG, CreatorUsersSG, CreatorTestsSG, CreatorBroadcastSG, CreatorGroupsSG
|
||||
|
||||
|
||||
async def on_tests_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
@@ -14,6 +14,10 @@ async def on_users_clicked(_callback: CallbackQuery, _button: Button, manager: D
|
||||
await manager.start(CreatorUsersSG.users_list, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_groups_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
await manager.start(CreatorGroupsSG.groups_list, mode=StartMode.RESET_STACK)
|
||||
|
||||
|
||||
async def on_broadcast_clicked(_callback: CallbackQuery, _button: Button, manager: DialogManager) -> None:
|
||||
await manager.start(CreatorBroadcastSG.broadcast_input, mode=StartMode.RESET_STACK)
|
||||
|
||||
@@ -24,6 +28,7 @@ creator_menu_dialog = Dialog(
|
||||
Column(
|
||||
Button(Const("📝 Тесты"), id="tests", on_click=on_tests_clicked),
|
||||
Button(Const("👥 Пользователи"), id="users", on_click=on_users_clicked),
|
||||
Button(Const("🎓 Группы"), id="groups", on_click=on_groups_clicked),
|
||||
Button(Const("📢 Рассылка"), id="broadcast", on_click=on_broadcast_clicked),
|
||||
),
|
||||
state=CreatorMenuSG.main,
|
||||
|
||||
@@ -21,6 +21,13 @@ class CreatorBroadcastSG(StatesGroup):
|
||||
broadcast_confirm = State()
|
||||
|
||||
|
||||
class CreatorGroupsSG(StatesGroup):
|
||||
groups_list = State()
|
||||
add_group_input_number = State()
|
||||
delete_groups_list = State()
|
||||
delete_confirm = State()
|
||||
|
||||
|
||||
class CreateTestSG(StatesGroup):
|
||||
input_title = State()
|
||||
input_description = State()
|
||||
|
||||
Reference in New Issue
Block a user