Files
server-core/app/api/schemas/operator.py
T
Pine 4f11931143 feat(content): 资讯发布时间/来源/发布人规范 + 点赞/留言/分享互动体系
- published_at 发布时间(迁移0022):运营端不限、园区端禁早于3天前,双方均支持定时发布;C端/大屏到点才可见
- 发布人:运营端可设(留空显示官方)、园区端固定园区名只能填来源
- 点赞/分享/留言(迁移0023-0025):content_likes 去重点赞、like_count/share_count、留言回复+评论点赞
- 各出口(内容/留言/入驻资料 docs)统一 resolve_url 生成 CDN 直链;入库统一 to_object_path 对象路径
2026-08-28 17:17:49 +08:00

292 lines
8.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 = ""
# ── 多端任务体系扩展字段 ──
publisher_role: str = "" # enterprise/operator/park
visibility: str = "public" # public/assigned_only/c_visible
c_visible: bool = True # 是否进 C 端任务广场
park_public: bool = False # 是否公有任务(各园区大屏可见/本园可接)
assign_type: str = "" # opc/park(指派模式)
assign_park_id: str | None = None
assign_opc_id: str | None = None
park_id: str | None = None
bid_quota: int = 0 # 竞标报名人数上限
win_quota: int = 0 # 竞标中标人数
eligibility: str = "{}" # 接单资格条件(JSON)
settle_mode: str = "operator_escrow" # 资金托管方式
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
publisher_role: str | None = None
visibility: str | None = None
c_visible: bool | None = None
park_public: bool | None = None
assign_type: str | None = None
assign_park_id: str | None = None
assign_opc_id: str | None = None
park_id: str | None = None
bid_quota: int | None = None
win_quota: int | None = None
eligibility: str | None = None
settle_mode: 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 = ""
cover: str = "" # 加宽封面图(3.35:1
cover_small: str = "" # 小封面图(1:1,可选)
images: list[str] = [] # 图集
video: str = "" # 视频 URL
video_cover: str = "" # 视频封面
link: str = "" # 外链
publisher_name: str = "" # 发布人昵称(仅运营端可设;空则显示「官方」)
published_at: str = "" # 发布时间(ISO;可未来=定时发布;空则发布时取当前)
publisher_avatar: str = "" # 发布人头像
card_mode: str = "big" # big 大图 | small 小图(运营端设)
is_public: bool = True # 是否公开
priority: int = 0 # 优先级(越大越靠前)
status: str = "draft"
class ContentStatusRequest(BaseModel):
status: str # published/offline/draft/pending
class ContentReviewRequest(BaseModel):
"""资讯审核:approve 通过上线 | offline 下架。"""
decision: str = "approve"
class ContentUpdateRequest(BaseModel):
"""内容更新(字段全可选,仅更新传入项)。"""
type: str | None = None # policy/news/skill/dynamic
title: str | None = None
summary: str | None = None
body: str | None = None
cover: str | None = None
cover_small: str | None = None
images: list[str] | None = None
video: str | None = None
video_cover: str | None = None
link: str | None = None
publisher_name: str | None = None
publisher_avatar: str | None = None
published_at: str | None = None
card_mode: str | None = None
is_public: bool | None = None
source: str | None = None
tenant_id: str | None = None
priority: int | None = None
status: str | None = None
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 CourseUpdateRequest(BaseModel):
"""课程更新(字段全可选,仅更新传入项)。"""
title: str | None = None
category: str | None = None
level: str | None = None
subtitle: str | None = None
desc: str | None = None
price: float | None = None
status: str | None = None
start_at: str | None = None
end_at: str | None = None
venue: str | None = None
quota: int | None = None
image: str | None = None
host: str | None = None
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 ActivityUpdateRequest(BaseModel):
"""活动更新(字段全可选,仅更新传入项)。"""
title: str | None = None
type: str | None = None
mode: str | None = None
status: str | None = None
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 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