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="班级在读人数")
|