Files
core/rbac/interface.py

76 lines
3.2 KiB
Python
Raw Normal View History

2025-08-17 16:33:54 +03:00
"""
Интерфейс для RBAC операций, исключающий циркулярные импорты.
Этот модуль содержит только типы и абстрактные интерфейсы,
не импортирует ORM модели и не создает циклических зависимостей.
"""
from typing import Any, Protocol
class RBACOperations(Protocol):
"""
Протокол для RBAC операций, позволяющий ORM моделям
2025-08-17 17:56:31 +03:00
выполнять операции с правами без прямого импорта rbac.api
2025-08-17 16:33:54 +03:00
"""
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:
"""Проверяет разрешение пользователя в сообществе"""
...
2025-08-17 17:56:31 +03:00
async def _roles_have_permission(self, role_slugs: list[str], permission: str, community_id: int) -> bool:
2025-08-17 16:33:54 +03:00
"""Проверяет, есть ли у набора ролей конкретное разрешение в сообществе"""
...
class CommunityAuthorQueries(Protocol):
"""
Протокол для запросов CommunityAuthor, позволяющий RBAC
выполнять запросы без прямого импорта ORM моделей
"""
2025-08-17 17:56:31 +03:00
def get_user_roles_in_community(self, author_id: int, community_id: int, session: Any = None) -> list[str]:
2025-08-17 16:33:54 +03:00
"""Получает роли пользователя в сообществе"""
...
# Глобальные переменные для dependency injection
_rbac_operations: RBACOperations | None = None
_community_queries: CommunityAuthorQueries | None = None
def set_rbac_operations(ops: RBACOperations) -> None:
"""Устанавливает реализацию RBAC операций"""
2025-08-17 17:56:31 +03:00
global _rbac_operations # noqa: PLW0603
2025-08-17 16:33:54 +03:00
_rbac_operations = ops
def set_community_queries(queries: CommunityAuthorQueries) -> None:
"""Устанавливает реализацию запросов сообщества"""
2025-08-17 17:56:31 +03:00
global _community_queries # noqa: PLW0603
2025-08-17 16:33:54 +03:00
_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