This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user