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

View File

@@ -0,0 +1,141 @@
"""
Декораторы для проверки разрешений
"""
from functools import wraps
from typing import Callable, Any, Union
from aiogram.types import Message, CallbackQuery
from services.infrastructure.logger import get_logger
from .registry import get_permission_checker
logger = get_logger(__name__)
def require_permission(permission_name: str, error_message: str = "У вас нет прав для выполнения этой команды."):
"""
Декоратор для проверки разрешения пользователя
Args:
permission_name: Имя разрешения для проверки
error_message: Сообщение об ошибке при отсутствии разрешения
"""
def decorator(func: Callable) -> Callable:
@wraps(func)
async def wrapper(*args, **kwargs):
# Извлекаем объект события (Message или CallbackQuery)
event = None
for arg in args:
if isinstance(arg, (Message, CallbackQuery)):
event = arg
break
if not event:
logger.error("Не удалось найти объект события для проверки разрешения")
return await func(*args, **kwargs)
# Получаем проверщик разрешений
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return await func(*args, **kwargs)
# Проверяем разрешение
user_id = event.from_user.id
has_permission = await checker.has_permission(user_id, permission_name)
if not has_permission:
if isinstance(event, Message):
await event.answer(error_message)
elif isinstance(event, CallbackQuery):
await event.answer(error_message, show_alert=True)
return
# Выполняем оригинальную функцию
return await func(*args, **kwargs)
return wrapper
return decorator
def require_admin(error_message: str = "У вас нет прав администратора."):
"""
Декоратор для проверки прав администратора
Args:
error_message: Сообщение об ошибке при отсутствии прав администратора
"""
return require_permission("admin", error_message)
def require_superuser(error_message: str = "У вас нет прав суперпользователя."):
"""
Декоратор для проверки прав суперпользователя
Args:
error_message: Сообщение об ошибке при отсутствии прав суперпользователя
"""
return require_permission("superuser", error_message)
def require_admin_or_superuser(error_message: str = "У вас нет прав для выполнения этой команды."):
"""
Декоратор для проверки прав администратора или суперпользователя
Args:
error_message: Сообщение об ошибке при отсутствии прав
"""
def decorator(func: Callable) -> Callable:
@wraps(func)
async def wrapper(*args, **kwargs):
# Извлекаем объект события (Message или CallbackQuery)
event = None
for arg in args:
if isinstance(arg, (Message, CallbackQuery)):
event = arg
break
if not event:
logger.error("Не удалось найти объект события для проверки разрешения")
return await func(*args, **kwargs)
# Получаем проверщик разрешений
checker = get_permission_checker()
if not checker:
logger.error("Проверщик разрешений не инициализирован")
return await func(*args, **kwargs)
# Проверяем права администратора или суперпользователя
user_id = event.from_user.id
has_permission = await checker.has_any_permission(user_id, ["admin", "superuser"])
if not has_permission:
if isinstance(event, Message):
await event.answer(error_message)
elif isinstance(event, CallbackQuery):
await event.answer(error_message, show_alert=True)
return
# Выполняем оригинальную функцию
return await func(*args, **kwargs)
return wrapper
return decorator
def require_active_user(error_message: str = "❌ Ваш аккаунт неактивен."):
"""
Декоратор для проверки активности пользователя
Args:
error_message: Сообщение об ошибке при неактивном аккаунте
"""
return require_permission("view_questions", error_message)
def require_unbanned_user(error_message: str = "❌ Ваш аккаунт заблокирован."):
"""
Декоратор для проверки, что пользователь не забанен
Args:
error_message: Сообщение об ошибке при заблокированном аккаунте
"""
return require_permission("ask_questions", error_message)