77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
"""班级模块出入参(需求 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="班级在读人数")
|