feat: update admin panel keyboard structure and registration button logic

- Updated admin panel keyboard to match admin_panel.py handlers
- Changed registration button logic: show only for unregistered non-admins
- Added missing methods to IBotController interface
- Updated get_main_keyboard to accept is_registered parameter
- Simplified admin panel structure with proper callback routing
- Removed test callback button from production UI
- Created ADMIN_PANEL_STRUCTURE.md and ADMIN_PANEL_TESTING.md documentation
This commit is contained in:
2025-11-17 07:50:08 +09:00
parent 0dc0ae8111
commit 0fdf01d1c7
8 changed files with 582 additions and 33 deletions

View File

@@ -8,14 +8,16 @@ from src.core.models import Lottery, Winner
class KeyboardBuilderImpl(IKeyboardBuilder):
"""Реализация построителя клавиатур"""
def get_main_keyboard(self, is_admin: bool = False):
def get_main_keyboard(self, is_admin: bool = False, is_registered: bool = False):
"""Получить главную клавиатуру"""
buttons = [
[InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="active_lotteries")],
[InlineKeyboardButton(text="📝 Зарегистрироваться", callback_data="start_registration")],
[InlineKeyboardButton(text="🧪 ТЕСТ КОЛБЭК", callback_data="test_callback")]
[InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="active_lotteries")]
]
# Показываем кнопку регистрации только незарегистрированным пользователям (не админам)
if not is_admin and not is_registered:
buttons.append([InlineKeyboardButton(text="📝 Зарегистрироваться", callback_data="start_registration")])
if is_admin:
buttons.extend([
[InlineKeyboardButton(text="⚙️ Админ панель", callback_data="admin_panel")],
@@ -27,18 +29,11 @@ class KeyboardBuilderImpl(IKeyboardBuilder):
def get_admin_keyboard(self):
"""Получить админскую клавиатуру"""
buttons = [
[
InlineKeyboardButton(text="👥 Пользователи", callback_data="user_management"),
InlineKeyboardButton(text="💳 Счета", callback_data="account_management")
],
[
InlineKeyboardButton(text="🎯 Розыгрыши", callback_data="lottery_management"),
InlineKeyboardButton(text="💬 Чат", callback_data="chat_management")
],
[
InlineKeyboardButton(text="📊 Статистика", callback_data="stats"),
InlineKeyboardButton(text="⚙️ Настройки", callback_data="settings")
],
[InlineKeyboardButton(text="🎲 Управление розыгрышами", callback_data="admin_lotteries")],
[InlineKeyboardButton(text="<EFBFBD> Управление участниками", callback_data="admin_participants")],
[InlineKeyboardButton(text="👑 Управление победителями", callback_data="admin_winners")],
[InlineKeyboardButton(text="📊 Статистика", callback_data="admin_stats")],
[InlineKeyboardButton(text="⚙️ Настройки", callback_data="admin_settings")],
[InlineKeyboardButton(text="🔙 Назад", callback_data="back_to_main")]
]
return InlineKeyboardMarkup(inline_keyboard=buttons)
@@ -46,18 +41,12 @@ class KeyboardBuilderImpl(IKeyboardBuilder):
def get_lottery_management_keyboard(self):
"""Получить клавиатуру управления розыгрышами"""
buttons = [
[
InlineKeyboardButton(text="📋 Все розыгрыши", callback_data="all_lotteries"),
InlineKeyboardButton(text="🎲 Активные", callback_data="active_lotteries_admin")
],
[
InlineKeyboardButton(text="✅ Завершенные", callback_data="completed_lotteries"),
InlineKeyboardButton(text=" Создать", callback_data="create_lottery")
],
[
InlineKeyboardButton(text="🎯 Провести розыгрыш", callback_data="conduct_lottery_admin"),
InlineKeyboardButton(text="🔄 Переросыгрыш", callback_data="admin_redraw")
],
[InlineKeyboardButton(text=" Создать розыгрыш", callback_data="admin_create_lottery")],
[InlineKeyboardButton(text="📝 Редактировать розыгрыш", callback_data="admin_edit_lottery")],
[InlineKeyboardButton(text="🎭 Настройка отображения победителей", callback_data="admin_winner_display_settings")],
[InlineKeyboardButton(text="📋 Список всех розыгрышей", callback_data="admin_list_all_lotteries")],
[InlineKeyboardButton(text="<EFBFBD> Завершить розыгрыш", callback_data="admin_finish_lottery")],
[InlineKeyboardButton(text="<EFBFBD> Удалить розыгрыш", callback_data="admin_delete_lottery")],
[InlineKeyboardButton(text="🔙 Назад", callback_data="admin_panel")]
]
return InlineKeyboardMarkup(inline_keyboard=buttons)

View File

@@ -49,7 +49,10 @@ class BotController(IBotController):
else:
welcome_text += "📝 Для участия в розыгрышах необходимо зарегистрироваться."
keyboard = self.keyboard_builder.get_main_keyboard(self.is_admin(message.from_user.id))
keyboard = self.keyboard_builder.get_main_keyboard(
is_admin=self.is_admin(message.from_user.id),
is_registered=user.is_registered
)
await message.answer(
welcome_text,
@@ -119,7 +122,7 @@ class BotController(IBotController):
async def handle_active_lotteries(self, callback: CallbackQuery):
"""Показать активные розыгрыши"""
lotteries = await self.lottery_service.get_active_lotteries()
lotteries = await self.lottery_repo.get_active()
if not lotteries:
await callback.answer("❌ Нет активных розыгрышей", show_alert=True)
@@ -132,7 +135,18 @@ class BotController(IBotController):
lottery_info = self.message_formatter.format_lottery_info(lottery, participants_count)
text += lottery_info + "\n" + "="*30 + "\n\n"
keyboard = self.keyboard_builder.get_main_keyboard(self.is_admin(callback.from_user.id))
# Получаем информацию о регистрации пользователя
user = await self.user_service.get_or_create_user(
telegram_id=callback.from_user.id,
username=callback.from_user.username,
first_name=callback.from_user.first_name,
last_name=callback.from_user.last_name
)
keyboard = self.keyboard_builder.get_main_keyboard(
is_admin=self.is_admin(callback.from_user.id),
is_registered=user.is_registered
)
await callback.message.edit_text(
text,

View File

@@ -134,6 +134,26 @@ class IBotController(ABC):
async def handle_admin_panel(self, callback):
"""Обработать admin panel"""
pass
@abstractmethod
async def handle_lottery_management(self, callback):
"""Обработать управление розыгрышами"""
pass
@abstractmethod
async def handle_conduct_lottery_admin(self, callback):
"""Обработать выбор розыгрыша для проведения"""
pass
@abstractmethod
async def handle_active_lotteries(self, callback):
"""Обработать показ активных розыгрышей"""
pass
@abstractmethod
async def handle_conduct_lottery(self, callback):
"""Обработать проведение конкретного розыгрыша"""
pass
class IMessageFormatter(ABC):
@@ -154,7 +174,7 @@ class IKeyboardBuilder(ABC):
"""Интерфейс создания клавиатур"""
@abstractmethod
def get_main_keyboard(self, is_admin: bool):
def get_main_keyboard(self, is_admin: bool, is_registered: bool = False):
"""Получить главную клавиатуру"""
pass