"""班级模块出入参(需求 2.4)。""" from __future__ import annotations from datetime import date from pydantic import BaseModel, Field, field_validator from app.schema.common import ORMBase, STRIP_VALIDATOR class _ClazzBase(BaseModel): name: str = Field(..., min_length=1, max_length=50, description="班级名称") direction: str | None = Field(None, max_length=50, description="班级方向") open_date: str | None = Field(None, description="开课时间 YYYY-MM-DD") close_date: str | None = Field(None, description="结课时间 YYYY-MM-DD") classroom: str | None = Field(None, max_length=30, description="教室") capacity: int | None = Field(40, ge=1, le=500, description="计划招生人数") status: int = Field(1, ge=1, le=3, description="状态 1=在读 2=已结课 3=已解散") head_teacher_id: int | None = Field(None, description="班主任(老师ID)") advisor_id: int | None = Field(None, description="带班顾问ID") teacher_ids: list[int] = Field(default_factory=list, description="授课老师ID列表(多对多)") description: str | None = Field(None, description="班级说明") _v_strip = STRIP_VALIDATOR @field_validator("open_date", "close_date", mode="before") @classmethod def _date_like(cls, v): # noqa: ANN001, ANN201 if v is None or isinstance(v, str): return v if isinstance(v, date): return v.isoformat() return v class ClazzCreate(_ClazzBase): class_no: str | None = Field(None, max_length=30, description="班级编号,不传按 方向缩写+年份+序号 生成") class ClazzUpdate(BaseModel): name: str | None = Field(None, min_length=1, max_length=50, description="班级名称") direction: str | None = None open_date: str | None = None close_date: str | None = None classroom: str | None = None capacity: int | None = Field(None, ge=1, le=500) status: int | None = Field(None, ge=1, le=3, description="状态 1=在读 2=已结课 3=已解散") head_teacher_id: int | None = None advisor_id: int | None = None teacher_ids: list[int] | None = Field(None, description="传了就整体替换授课老师") description: str | None = None _v_strip = STRIP_VALIDATOR class ClazzOut(ORMBase): id: int class_no: str = Field(..., description="班级编号") name: str direction: str | None = None open_date: date | None = None close_date: date | None = None classroom: str | None = None capacity: int | None = None status: int status_text: str head_teacher_id: int | None = None head_teacher_name: str | None = None advisor_id: int | None = None advisor_name: str | None = None teacher_ids: list[int] = Field(default_factory=list, description="授课老师ID") teacher_names: list[str] = Field(default_factory=list, description="授课老师姓名") description: str | None = None student_count: int = Field(0, description="班级在读人数")