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:
141
services/permissions/decorators.py
Normal file
141
services/permissions/decorators.py
Normal 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)
|
||||
Reference in New Issue
Block a user