fc / apps /core /dto /request_context.py
jun2024's picture
Upload 2241 files
b4f2238 verified
Raw History Blame Contribute Delete
1.22 kB
from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from apps.core.security.permissions import AccessContext
@dataclass(frozen=True)
class RequestContext:
"""请求上下文 DTO"""
user: Any | None
org_access: dict[str, Any] | None
perm_open_access: bool
def to_access_context(self) -> AccessContext:
"""转换为 AccessContext(供 PermissionMixin 使用)"""
from apps.core.security.permissions import AccessContext as _AccessContext
return _AccessContext(
user=self.user,
org_access=self.org_access,
perm_open_access=self.perm_open_access,
)
def extract_request_context(request: Any) -> RequestContext:
"""
从 HTTP 请求中提取上下文信息
统一替代各 API 端点中的:
- getattr(request, "user", None)
- getattr(request, "org_access", None)
- getattr(request, "perm_open_access", False)
"""
return RequestContext(
user=getattr(request, "user", None),
org_access=getattr(request, "org_access", None),
perm_open_access=getattr(request, "perm_open_access", False),
)