99 lines
4.7 KiB
Python
99 lines
4.7 KiB
Python
# 校验时间,入学时间小于毕业时间,
|
|||
|
|
from datetime import datetime
|
||
|
|
from datetime import date
|
||
|
|
from pydantic import BaseModel, field_validator, Field, ConfigDict
|
||
|
|
|
||
|
|
# 请求体模型:两个日期都允许为空 在api.studend调用检测
|
||
|
|
class StudentDate(BaseModel):
|
||
|
|
enrollment_date: str | None = Field(default=None, description="入学日期,格式为 yyyy-MM-dd,非必填")
|
||
|
|
graduation_date: str | None = Field(default=None, description="毕业日期,格式 yyyy-MM-dd,非必填")
|
||
|
|
# 日期校验函数
|
||
|
|
def student_date(enrollment_date: str , graduation_date: str):
|
||
|
|
# 情况1:两个日期都没传,直接通过
|
||
|
|
if not enrollment_date and not graduation_date:
|
||
|
|
return "时间校验通过"
|
||
|
|
|
||
|
|
# 只传了入学日期或者毕业日期,只校验格式
|
||
|
|
if enrollment_date and not graduation_date:
|
||
|
|
try:
|
||
|
|
datetime.strptime(enrollment_date, "%Y-%m-%d")
|
||
|
|
except ValueError:
|
||
|
|
return "入学日期格式错误,请按照 yyyy-MM-dd 输入"
|
||
|
|
return "时间校验通过"
|
||
|
|
elif graduation_date and not enrollment_date:
|
||
|
|
try:
|
||
|
|
datetime.strptime(graduation_date, "%Y-%m-%d")
|
||
|
|
except ValueError:
|
||
|
|
return "毕业日期格式错误,请按照 yyyy-MM-dd 输入"
|
||
|
|
return "时间校验通过"
|
||
|
|
|
||
|
|
# 如果两个日期都传了,先分别校验格式,再校验先后顺序
|
||
|
|
try:
|
||
|
|
enrollment_date = datetime.strptime(enrollment_date, "%Y-%m-%d")
|
||
|
|
except ValueError:
|
||
|
|
return "入学日期格式错误,请按照 yyyy-MM-dd 输入"
|
||
|
|
try:
|
||
|
|
graduation_date = datetime.strptime(graduation_date, "%Y-%m-%d")
|
||
|
|
except ValueError:
|
||
|
|
return "毕业日期格式错误,请按照 yyyy-MM-dd 输入"
|
||
|
|
# 核心业务判断:毕业时间不能早于入学时间
|
||
|
|
if graduation_date < enrollment_date:
|
||
|
|
return "毕业时间必须晚于入学时间"
|
||
|
|
return "时间校验通过"
|
||
|
|
|
||
|
|
#创建学生的请求体 ...(必填)
|
||
|
|
class StudentCreate(BaseModel):
|
||
|
|
id: str = Field(..., min_length=1, max_length=20, description="学号")
|
||
|
|
name: str = Field(..., min_length=1, max_length=50, description="学生姓名")
|
||
|
|
gender: str = Field(..., pattern=r"^(男|女)$", description="性别:男/女")
|
||
|
|
class_name: str = Field(..., min_length=1, max_length=20, description="所属班级编号")
|
||
|
|
#非必填
|
||
|
|
age: int | None = Field(default=None, ge=1, le=100, description="年龄")
|
||
|
|
hometown: str | None = Field(default=None, max_length=100, description="籍贯")
|
||
|
|
graduate_school: str | None = Field(default=None, max_length=100, description="毕业院校")
|
||
|
|
major: str | None = Field(default=None, max_length=50, description="专业")
|
||
|
|
education: str | None = Field(default=None, max_length=30, description="学历:专科/本科/硕士")
|
||
|
|
enrollment_date: date | None = Field(default=None, description="入学时间,格式yyyy-MM-dd")
|
||
|
|
graduation_date: date | None = Field(default=None, description="毕业时间,格式yyyy-MM-dd")
|
||
|
|
status: str | None = Field(default="在读", description="状态:未毕业/进入就业/已就业")
|
||
|
|
# 更新修改学生
|
||
|
|
class StudentUpdate(BaseModel):
|
||
|
|
name: str | None = Field(default=None, min_length=1, max_length=50, description="学生姓名")
|
||
|
|
class_name: str | None = Field(default=None, description="班级名称")
|
||
|
|
gender: str | None = Field(default=None, pattern=r"^(男|女)$", description="性别:男/女")
|
||
|
|
class_no: str | None = Field(default=None, max_length=20, description="所属班级编号")
|
||
|
|
age: int | None = Field(default=None, ge=1, le=100, description="年龄")
|
||
|
|
hometown: str | None = Field(default=None, max_length=100, description="籍贯")
|
||
|
|
graduate_school: str | None = Field(default=None, max_length=100, description="毕业院校")
|
||
|
|
major: str | None = Field(default=None, max_length=50, description="专业")
|
||
|
|
education: str | None = Field(default=None, max_length=30, description="学历")
|
||
|
|
enrollment_date: date | None = Field(default=None, description="入学时间")
|
||
|
|
graduation_date: date | None = Field(default=None, description="毕业时间")
|
||
|
|
status: str | None = Field(default=None, description="状态:未毕业/进入就业/已就业")
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# 响应体
|
||
|
|
class StudentResponse(BaseModel):
|
||
|
|
model_config = ConfigDict(from_attributes=True) #支持读取SQLAlchemy ORM对象属性
|
||
|
|
id: str
|
||
|
|
name: str
|
||
|
|
gender: str
|
||
|
|
class_name: str | None = None
|
||
|
|
age: int | None = None
|
||
|
|
hometown: str | None = None
|
||
|
|
graduate_school: str | None = None
|
||
|
|
major: str | None = None
|
||
|
|
education: str | None = None
|
||
|
|
enrollment_date: date | None = None
|
||
|
|
graduation_date: date | None = None
|
||
|
|
status: str | None = None
|
||
|
|
is_deleted: bool = False
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|