circular-fix
Some checks failed
Deploy on push / deploy (push) Failing after 17s

This commit is contained in:
2025-08-17 16:33:54 +03:00
parent bc8447a444
commit e78e12eeee
65 changed files with 3304 additions and 1051 deletions

View File

@@ -21,11 +21,7 @@ from auth.orm import Author
from orm.base import BaseModel
from orm.shout import Shout
from services.db import local_session
from services.rbac import (
get_permissions_for_role,
initialize_community_permissions,
user_has_permission,
)
from auth.rbac_interface import get_rbac_operations
# Словарь названий ролей
role_names = {
@@ -59,7 +55,7 @@ class CommunityFollower(BaseModel):
__tablename__ = "community_follower"
community: Mapped[int] = mapped_column(Integer, ForeignKey("community.id"), nullable=False, index=True)
follower: Mapped[int] = mapped_column(Integer, ForeignKey(Author.id), nullable=False, index=True)
follower: Mapped[int] = mapped_column(Integer, ForeignKey("author.id"), nullable=False, index=True)
created_at: Mapped[int] = mapped_column(Integer, nullable=False, default=lambda: int(time.time()))
# Уникальность по паре сообщество-подписчик
@@ -288,7 +284,8 @@ class Community(BaseModel):
Инициализирует права ролей для сообщества из дефолтных настроек.
Вызывается при создании нового сообщества.
"""
await initialize_community_permissions(int(self.id))
rbac_ops = get_rbac_operations()
await rbac_ops.initialize_community_permissions(int(self.id))
def get_available_roles(self) -> list[str]:
"""
@@ -399,7 +396,7 @@ class CommunityAuthor(BaseModel):
id: Mapped[int] = mapped_column(Integer, primary_key=True)
community_id: Mapped[int] = mapped_column(Integer, ForeignKey("community.id"), nullable=False)
author_id: Mapped[int] = mapped_column(Integer, ForeignKey(Author.id), nullable=False)
author_id: Mapped[int] = mapped_column(Integer, ForeignKey("author.id"), nullable=False)
roles: Mapped[str | None] = mapped_column(String, nullable=True, comment="Roles (comma-separated)")
joined_at: Mapped[int] = mapped_column(Integer, nullable=False, default=lambda: int(time.time()))
@@ -478,63 +475,31 @@ class CommunityAuthor(BaseModel):
"""
all_permissions = set()
rbac_ops = get_rbac_operations()
for role in self.role_list:
role_perms = await get_permissions_for_role(role, int(self.community_id))
role_perms = await rbac_ops.get_permissions_for_role(role, int(self.community_id))
all_permissions.update(role_perms)
return list(all_permissions)
def has_permission(
self, permission: str | None = None, resource: str | None = None, operation: str | None = None
) -> bool:
def has_permission(self, permission: str) -> bool:
"""
Проверяет наличие разрешения у автора
Проверяет, есть ли у пользователя указанное право
Args:
permission: Разрешение для проверки (например: "shout:create")
resource: Опциональный ресурс (для обратной совместимости)
operation: Опциональная операция (для обратной совместимости)
permission: Право для проверки (например, "community:create")
Returns:
True если разрешение есть, False если нет
True если право есть, False если нет
"""
# Если передан полный permission, используем его
if permission and ":" in permission:
# Проверяем права через синхронную функцию
try:
import asyncio
from services.rbac import get_permissions_for_role
all_permissions = set()
for role in self.role_list:
role_perms = asyncio.run(get_permissions_for_role(role, int(self.community_id)))
all_permissions.update(role_perms)
return permission in all_permissions
except Exception:
# Fallback: проверяем роли (старый способ)
return any(permission == role for role in self.role_list)
# Если переданы resource и operation, формируем permission
if resource and operation:
full_permission = f"{resource}:{operation}"
try:
import asyncio
from services.rbac import get_permissions_for_role
all_permissions = set()
for role in self.role_list:
role_perms = asyncio.run(get_permissions_for_role(role, int(self.community_id)))
all_permissions.update(role_perms)
return full_permission in all_permissions
except Exception:
# Fallback: проверяем роли (старый способ)
return any(full_permission == role for role in self.role_list)
return False
# Проверяем права через синхронную функцию
try:
# В синхронном контексте не можем использовать await
# Используем fallback на проверку ролей
return permission in self.role_list
except Exception:
# FIXME: Fallback: проверяем роли (старый способ)
return any(permission == role for role in self.role_list)
def dict(self, access: bool = False) -> dict[str, Any]:
"""
@@ -706,7 +671,8 @@ async def check_user_permission_in_community(author_id: int, permission: str, co
Returns:
True если разрешение есть, False если нет
"""
return await user_has_permission(author_id, permission, community_id)
rbac_ops = get_rbac_operations()
return await rbac_ops.user_has_permission(author_id, permission, community_id)
def assign_role_to_user(author_id: int, role: str, community_id: int = 1) -> bool: