File size: 1,216 Bytes
b4f2238 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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),
)
|