""" Интерфейс для RBAC операций, исключающий циркулярные импорты. Этот модуль содержит только типы и абстрактные интерфейсы, не импортирует ORM модели и не создает циклических зависимостей. """ from typing import Any, Protocol class RBACOperations(Protocol): """ Протокол для RBAC операций, позволяющий ORM моделям выполнять операции с правами без прямого импорта rbac.api """ async def get_permissions_for_role(self, role: str, community_id: int) -> list[str]: """Получает разрешения для роли в сообществе""" ... async def initialize_community_permissions(self, community_id: int) -> None: """Инициализирует права для нового сообщества""" ... async def user_has_permission( self, author_id: int, permission: str, community_id: int, session: Any = None ) -> bool: """Проверяет разрешение пользователя в сообществе""" ... async def get_role_permissions_for_community(self, community_id: int, role: str) -> dict: """Получает права для конкретной роли в сообществе""" ... async def get_all_permissions_for_community(self, community_id: int) -> dict: """Получает все права ролей для конкретного сообщества""" ... async def roles_have_permission(self, role_slugs: list[str], permission: str, community_id: int) -> bool: """Проверяет, есть ли у набора ролей конкретное разрешение в сообществе""" ... def assign_role_to_user(self, author_id: int, role: str, community_id: int, session: Any = None) -> bool: """Назначает роль пользователю в сообществе""" ... def get_user_roles_in_community(self, author_id: int, community_id: int, session: Any = None) -> list[str]: """Получает роли пользователя в сообществе""" ... def remove_role_from_user(self, author_id: int, role: str, community_id: int, session: Any = None) -> bool: """Удаляет роль у пользователя в сообществе""" ... class CommunityAuthorQueries(Protocol): """ Протокол для запросов CommunityAuthor, позволяющий RBAC выполнять запросы без прямого импорта ORM моделей """ def get_user_roles_in_community(self, author_id: int, community_id: int, session: Any = None) -> list[str]: """Получает роли пользователя в сообществе""" ... # Глобальные переменные для dependency injection _rbac_operations: RBACOperations | None = None _community_queries: CommunityAuthorQueries | None = None def set_rbac_operations(ops: RBACOperations) -> None: """Устанавливает реализацию RBAC операций""" global _rbac_operations # noqa: PLW0603 _rbac_operations = ops def set_community_queries(queries: CommunityAuthorQueries) -> None: """Устанавливает реализацию запросов сообщества""" global _community_queries # noqa: PLW0603 _community_queries = queries def get_rbac_operations() -> RBACOperations: """Получает реализацию RBAC операций""" if _rbac_operations is None: raise RuntimeError("RBAC operations не инициализированы. Вызовите set_rbac_operations()") return _rbac_operations def get_community_queries() -> CommunityAuthorQueries: """Получает реализацию запросов сообщества""" if _community_queries is None: raise RuntimeError("Community queries не инициализированы. Вызовите set_community_queries()") return _community_queries