Files
server-core/app/api/schemas/operator.py
T
Pine e761a089b9 feat(compute): 算力中心 余额门控+充值+真实来源数值
- relay 匿名不再回落admin令牌(root无限额)→401或受限RELAY令牌(修无余额可用)
- /admin/compute/user-balance(充值add/subtract/override)+审计; compute_client.adjust_user_quota
- proxy follow_redirects(修gin尾斜杠301/307空数据); ping 返 version+quota_per_unit
2026-08-26 11:59:54 +08:00

194 lines
4.7 KiB
Python

from pydantic import BaseModel, Field
class TaskCreateRequest(BaseModel):
title: str
category: str = ""
category_id: str | None = None
sub_category: str = ""
description: str = ""
tags: str = ""
mode: str = "grab" # grab/bid/assign/recommend
budget_min: int = 0
budget_max: int = 0
deadline: str = ""
delivery_days: int = 0
headcount: int = 0
exclusive: bool = False
task_code: str = ""
display_priority: int = 0
publisher_id: str | None = None
publisher_name: str = ""
class TaskUpdateRequest(BaseModel):
title: str | None = None
category: str | None = None
category_id: str | None = None
sub_category: str | None = None
description: str | None = None
tags: str | None = None
mode: str | None = None
budget_min: int | None = None
budget_max: int | None = None
deadline: str | None = None
delivery_days: int | None = None
headcount: int | None = None
exclusive: bool | None = None
task_code: str | None = None
display_priority: int | None = None
publisher_id: str | None = None
publisher_name: str | None = None
class TaskStatusRequest(BaseModel):
status: str # review/published/completed/cancelled/claimed/doing
class TaskAssignRequest(BaseModel):
taker_user_id: str
class TaskRecommendRequest(BaseModel):
candidates: list[str] = []
class TaskSelectRecommendRequest(BaseModel):
taker_user_id: str
class TaskCategoryItem(BaseModel):
id: str
name: str
sort: int = 0
modes: str = ""
status: str = "active"
class ProviderCreateRequest(BaseModel):
name: str
category: str = ""
level: str = "certified"
status: str = "pending"
contact: str = ""
class ProviderUpdateRequest(BaseModel):
level: str | None = None
status: str | None = None
contact: str | None = None
class ContentCreateRequest(BaseModel):
type: str = "news"
title: str
summary: str = ""
body: str = ""
status: str = "draft"
class ContentStatusRequest(BaseModel):
status: str # published/offline/draft
class ConfigUpdateRequest(BaseModel):
value: str
description: str = ""
# ── 任务管理 ──────────────────────────────────────────────────────────────
# ── 算力对接(compute-engine)─────────────────────────────────────────────
# ── 培训业务四件套(课程 / 活动 / 报名 / 测评)→ 桥接 app.training ─────────
class CourseCreateRequest(BaseModel):
title: str
category: str = ""
level: str = ""
subtitle: str = ""
desc: str = ""
price: float = 0
status: str = "draft"
start_at: str = ""
end_at: str = ""
venue: str = ""
quota: int = 0
image: str = ""
host: str = ""
class CourseStatusRequest(BaseModel):
status: str # draft/published/ended/offline
class ActivityCreateRequest(BaseModel):
title: str
type: str | None = None # free/salon
mode: str | None = None # online/offline
status: str | None = None # open/invite/pending/done/ended
subtitle: str | None = None
desc: str | None = None
location: str | None = None
host: str | None = None
image: str | None = None
link: str | None = None
start_at: str | None = None
duration_min: int | None = None
capacity: int | None = None
class ActivityStatusRequest(BaseModel):
status: str # open/invite/pending/done/ended
class BookingUpdateRequest(BaseModel):
status: str | None = None
audit_status: str | None = None
note: str | None = None
class TestCreateRequest(BaseModel):
title: str
category: str = ""
pass_score: int = 0
question_count: int = 30
class TestStatusRequest(BaseModel):
status: str # enabled/disabled
class ComputePingResponse(BaseModel):
ok: bool
version: str | None = None
quota_per_unit: float | None = None # 引擎 1 元 = 多少配额(500000 = $1),来自 /api/status
detail: str | None = None
class ComputeBalanceRequest(BaseModel):
"""充值/调整引擎用户余额。``value`` 为配额单位(见 quota_per_unit)。"""
engine_user_id: int
value: int = Field(ge=0, description="调整量(配额单位),add/subtract 用")
mode: str = "add" # add | subtract | override
reason: str = ""
class ComputeProvisionRequest(BaseModel):
user_id: str
class ComputeProvisionResponse(BaseModel):
engine_user_id: str | None = None
engine_username: str | None = None
pat: str | None = None
created: bool = False
detail: str | None = None