Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.

This commit is contained in:
2025-09-06 18:35:12 +03:00
parent 50be010026
commit 596a2fa813
111 changed files with 16847 additions and 65 deletions

118
keyboards/reply.py Normal file
View File

@@ -0,0 +1,118 @@
"""
Reply клавиатуры для бота
"""
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from services.auth.auth_new import AuthService
from dependencies import get_auth
def get_main_keyboard(user_id: int = None, auth: AuthService = None) -> ReplyKeyboardMarkup:
"""
Основная клавиатура бота
Args:
user_id: ID пользователя для проверки роли
auth: Сервис авторизации для проверки роли
Returns:
Reply клавиатура
"""
builder = ReplyKeyboardBuilder()
builder.add(
KeyboardButton(text="📋 Мои вопросы"),
KeyboardButton(text="🔗 Моя ссылка")
)
builder.add(
KeyboardButton(text="🚫 Заблокированные"),
KeyboardButton(text=" Помощь")
)
# Добавляем кнопку статистики только для администраторов
if user_id and auth and auth.is_admin(user_id):
builder.add(KeyboardButton(text="📊 Статистика"))
builder.adjust(2, 2, 1) # 2 кнопки в первом ряду, 2 во втором, 1 в третьем
else:
builder.adjust(2, 2) # 2 кнопки в первом ряду, 2 во втором
return builder.as_markup(
resize_keyboard=True,
one_time_keyboard=False,
input_field_placeholder="Выберите действие или отправьте вопрос..."
)
def get_main_keyboard_for_user(user_id: int, auth: AuthService = None) -> ReplyKeyboardMarkup:
"""
Основная клавиатура бота для конкретного пользователя
Args:
user_id: ID пользователя для проверки роли
auth: Сервис авторизации для проверки роли (опционально, если не передан, будет получен через DI)
Returns:
Reply клавиатура
"""
if auth is None:
auth = get_auth()
return get_main_keyboard(user_id, auth)
def get_admin_reply_keyboard() -> ReplyKeyboardMarkup:
"""
Reply клавиатура для администраторов
Returns:
Reply клавиатура для админов
"""
builder = ReplyKeyboardBuilder()
builder.add(
KeyboardButton(text="📋 Мои вопросы"),
KeyboardButton(text="🔗 Моя ссылка")
)
builder.add(
KeyboardButton(text="🚫 Заблокированные"),
KeyboardButton(text=" Помощь")
)
builder.add(
KeyboardButton(text="📊 Статистика"),
KeyboardButton(text="⚙️ Админ панель")
)
builder.adjust(2, 2, 2) # 2 кнопки в каждом ряду
return builder.as_markup(
resize_keyboard=True,
one_time_keyboard=False,
input_field_placeholder="Выберите действие или отправьте вопрос..."
)
def get_cancel_keyboard() -> ReplyKeyboardMarkup:
"""
Клавиатура с кнопкой отмены
Returns:
Reply клавиатура
"""
builder = ReplyKeyboardBuilder()
builder.add(
KeyboardButton(text="❌ Отмена")
)
return builder.as_markup(
resize_keyboard=True,
one_time_keyboard=True,
input_field_placeholder="Отправьте текст или нажмите 'Отмена'"
)