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,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