Files

77 lines
3.0 KiB
Python
Raw Permalink Normal View History

2026-09-21 19:03:31 +08:00
"""班级模块出入参(需求 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="班级在读人数")