197 lines
8.2 KiB
Python
197 lines
8.2 KiB
Python
"""
|
||
Конкретные реализации разрешений
|
||
Каждое разрешение - отдельный класс, что позволяет легко добавлять новые без изменения существующего кода
|
||
"""
|
||
from .base import Permission
|
||
from services.infrastructure.database import DatabaseService
|
||
from services.infrastructure.logger import get_logger
|
||
|
||
logger = get_logger(__name__)
|
||
|
||
|
||
class AdminPermission(Permission):
|
||
"""Разрешение для администраторов"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="admin",
|
||
description="Права администратора"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка, является ли пользователь администратором"""
|
||
return user_id in config.ADMINS
|
||
|
||
|
||
class SuperuserPermission(Permission):
|
||
"""Разрешение для суперпользователей"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="superuser",
|
||
description="Права суперпользователя"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка, является ли пользователь суперпользователем"""
|
||
try:
|
||
user = await database.get_user(user_id)
|
||
return user.is_superuser if user else False
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при проверке суперпользователя {user_id}: {e}")
|
||
return False
|
||
|
||
|
||
class ViewStatsPermission(Permission):
|
||
"""Разрешение на просмотр статистики"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="view_stats",
|
||
description="Просмотр статистики"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на просмотр статистики"""
|
||
# Администраторы и суперпользователи могут просматривать статистику
|
||
admin_permission = AdminPermission()
|
||
superuser_permission = SuperuserPermission()
|
||
|
||
is_admin = await admin_permission.check(user_id, database, config)
|
||
is_superuser = await superuser_permission.check(user_id, database, config)
|
||
|
||
return is_admin or is_superuser
|
||
|
||
|
||
class AdminPanelPermission(Permission):
|
||
"""Разрешение на доступ к админ панели"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="admin_panel",
|
||
description="Доступ к админ панели"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на доступ к админ панели"""
|
||
# Администраторы и суперпользователи могут использовать админ панель
|
||
admin_permission = AdminPermission()
|
||
superuser_permission = SuperuserPermission()
|
||
|
||
is_admin = await admin_permission.check(user_id, database, config)
|
||
is_superuser = await superuser_permission.check(user_id, database, config)
|
||
|
||
return is_admin or is_superuser
|
||
|
||
|
||
class ManageUsersPermission(Permission):
|
||
"""Разрешение на управление пользователями"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="manage_users",
|
||
description="Управление пользователями"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на управление пользователями"""
|
||
# Администраторы и суперпользователи могут управлять пользователями
|
||
admin_permission = AdminPermission()
|
||
superuser_permission = SuperuserPermission()
|
||
|
||
is_admin = await admin_permission.check(user_id, database, config)
|
||
is_superuser = await superuser_permission.check(user_id, database, config)
|
||
|
||
return is_admin or is_superuser
|
||
|
||
|
||
class BroadcastPermission(Permission):
|
||
"""Разрешение на рассылку сообщений"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="broadcast",
|
||
description="Рассылка сообщений"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на рассылку"""
|
||
# Только администраторы могут делать рассылку
|
||
admin_permission = AdminPermission()
|
||
return await admin_permission.check(user_id, database, config)
|
||
|
||
|
||
class SuperuserOnlyPermission(Permission):
|
||
"""Разрешение только для суперпользователей"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="superuser_only",
|
||
description="Только для суперпользователей"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права только для суперпользователей"""
|
||
superuser_permission = SuperuserPermission()
|
||
return await superuser_permission.check(user_id, database, config)
|
||
|
||
|
||
class ViewQuestionsPermission(Permission):
|
||
"""Разрешение на просмотр вопросов"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="view_questions",
|
||
description="Просмотр вопросов"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на просмотр вопросов"""
|
||
# Все активные пользователи могут просматривать вопросы
|
||
try:
|
||
user = await database.get_user(user_id)
|
||
return user.is_active if user else False
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при проверке активности пользователя {user_id}: {e}")
|
||
return False
|
||
|
||
|
||
class AskQuestionsPermission(Permission):
|
||
"""Разрешение на задавание вопросов"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="ask_questions",
|
||
description="Задавание вопросов"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на задавание вопросов"""
|
||
# Все активные пользователи могут задавать вопросы
|
||
try:
|
||
user = await database.get_user(user_id)
|
||
return user.is_active and not user.is_banned if user else False
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при проверке права задавать вопросы для пользователя {user_id}: {e}")
|
||
return False
|
||
|
||
|
||
class AnswerQuestionsPermission(Permission):
|
||
"""Разрешение на ответы на вопросы"""
|
||
|
||
def __init__(self):
|
||
super().__init__(
|
||
name="answer_questions",
|
||
description="Ответы на вопросы"
|
||
)
|
||
|
||
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
|
||
"""Проверка права на ответы на вопросы"""
|
||
# Все активные пользователи могут отвечать на вопросы
|
||
try:
|
||
user = await database.get_user(user_id)
|
||
return user.is_active and not user.is_banned if user else False
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при проверке права отвечать на вопросы для пользователя {user_id}: {e}")
|
||
return False
|