Files
gaokao-volunteer-system/data/orders/intake_schema.py
Hermes Agent 7c14384fb2 feat(intake): 扩展 IntakePayload 字段集 + candidate_province 必填
IntakePayload 新增 14 个字段覆盖完整志愿填报偏好:
- 学校地域/类型偏好 (school_region_preferences / school_preference_types)
- 目标学校/不喜欢的专业 (target_schools / disliked_majors)
- 优先策略/毕业计划/学费偏好/就业地区偏好
- 家庭背景/行业资源/额外备注
- 兴趣评估三字段 (type/result/notes)
- candidate_province 提交时必填(与 portal 表单对齐)

public_flow / deletion_service 同步更新字段引用
requirements-dev: 补 httpx2 (HTTP/2 测试支持)
2026-06-25 09:26:31 +08:00

68 lines
3.4 KiB
Python

from __future__ import annotations
from typing import Literal, Optional
from pydantic import BaseModel, Field, model_validator
IntakeMode = Literal["draft", "submit"]
class IntakePayload(BaseModel):
mode: IntakeMode = "submit"
candidate_province: Optional[str] = Field(default=None, max_length=32)
candidate_score: Optional[int] = Field(default=None, ge=0, le=1000)
candidate_rank: Optional[int] = Field(default=None, ge=0)
candidate_subjects: list[str] = Field(default_factory=list, max_length=6)
candidate_interests: Optional[str] = Field(default=None, max_length=200)
target_cities: list[str] = Field(default_factory=list, max_length=5)
target_majors: list[str] = Field(default_factory=list, max_length=10)
university_preferences: Optional[str] = Field(default=None, max_length=500)
school_region_preferences: list[str] = Field(default_factory=list, max_length=10)
school_preference_types: list[str] = Field(default_factory=list, max_length=10)
target_schools: list[str] = Field(default_factory=list, max_length=10)
disliked_majors: list[str] = Field(default_factory=list, max_length=10)
priority_strategy: Optional[str] = Field(default=None, max_length=64)
graduation_plan: Optional[str] = Field(default=None, max_length=128)
tuition_preference: Optional[str] = Field(default=None, max_length=128)
employment_region_preferences: list[str] = Field(default_factory=list, max_length=10)
family_background: Optional[str] = Field(default=None, max_length=300)
industry_resources: Optional[str] = Field(default=None, max_length=300)
extra_notes: Optional[str] = Field(default=None, max_length=1000)
interest_assessment_type: Optional[str] = Field(default=None, max_length=64)
interest_assessment_result: Optional[str] = Field(default=None, max_length=200)
interest_assessment_notes: Optional[str] = Field(default=None, max_length=500)
existing_plan_summary: Optional[str] = Field(default=None, max_length=1000)
guardian_notes: Optional[str] = Field(default=None, max_length=1000)
consent_version: Optional[str] = None
consent_scope: Optional[str] = None
privacy_accepted: bool = False
service_terms_accepted: bool = False
guardian_confirmed: bool = False
@model_validator(mode="after")
def _validate_submit_payload(self) -> "IntakePayload":
if self.mode == "submit":
if not self.candidate_province:
raise ValueError("candidate_province 为提交必填项")
if self.candidate_score is None:
raise ValueError("candidate_score 为提交必填项")
if self.candidate_rank is None:
raise ValueError("candidate_rank 为提交必填项")
if not self.candidate_subjects:
raise ValueError("candidate_subjects 为提交必填项")
if not self.consent_version:
raise ValueError("consent_version 为提交必填项")
if not self.consent_scope:
raise ValueError("consent_scope 为提交必填项")
if not self.privacy_accepted:
raise ValueError("privacy_accepted 为提交必填项")
if not self.service_terms_accepted:
raise ValueError("service_terms_accepted 为提交必填项")
if not self.guardian_confirmed:
raise ValueError("guardian_confirmed 为提交必填项")
return self
__all__ = ["IntakePayload", "IntakeMode"]