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:
196
services/permissions/permissions.py
Normal file
196
services/permissions/permissions.py
Normal file
@@ -0,0 +1,196 @@
|
||||
"""
|
||||
Конкретные реализации разрешений
|
||||
Каждое разрешение - отдельный класс, что позволяет легко добавлять новые без изменения существующего кода
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user