Files
dpb/backend/app/api/v1/module_bre/dus/schema.py
T
34047007@qq.com b95053c52c init: 初始化 dpb 桃育种系统代码库
前后端 + 后端 FastAPI 全量源码、部署脚本与文档。
2026-08-06 00:17:49 +08:00

146 lines
6.2 KiB
Python

"""DUS/品种保护 —— Pydantic 校验/序列化模型(描述符模板 / 测试记录 / 观测)。"""
from datetime import date, datetime
from pydantic import BaseModel, ConfigDict, Field
from app.core.base_schema import CommonSchema
# ---------- 描述符模板 ----------
class DusDescriptorBaseSchema(BaseModel):
model_config = ConfigDict(from_attributes=True)
descriptor_no: str = Field(..., description="描述符编号(UPOV TG/53 特性号)")
trait_id: int | None = Field(default=None, description="关联性状字典 id")
trait_code: str | None = Field(default=None, description="性状编码(快照)")
descriptor_name: str = Field(..., description="特性中文名")
expression_type: str = Field(default="QN", description="表达类型(QN/PQ/QL)")
method: str | None = Field(default=None, description="测试方法")
example_varieties: str | None = Field(default=None, description="标准/示例品种")
test_stage: str | None = Field(default=None, description="测试生育期")
required: str = Field(default="1", description="是否必测(1/0)")
remark: str | None = Field(default=None, description="备注")
class DusDescriptorCreateSchema(DusDescriptorBaseSchema):
pass
class DusDescriptorUpdateSchema(DusDescriptorBaseSchema):
descriptor_no: str | None = Field(default=None, description="描述符编号")
descriptor_name: str | None = Field(default=None, description="特性中文名")
expression_type: str | None = Field(default=None, description="表达类型(QN/PQ/QL)")
required: str | None = Field(default=None, description="是否必测(1/0)")
class DusDescriptorOutSchema(DusDescriptorBaseSchema):
id: int
uuid: str
trait_name: str | None = None
created_time: datetime | None = None
updated_time: datetime | None = None
created_by: CommonSchema | None = None
updated_by: CommonSchema | None = None
class DusDescriptorQueryParam(BaseModel):
descriptor_no: str | None = Field(default=None, description="描述符编号", json_schema_extra={"q": "like"})
descriptor_name: str | None = Field(default=None, description="特性中文名", json_schema_extra={"q": "like"})
trait_code: str | None = Field(default=None, description="关联性状编码", json_schema_extra={"q": "like"})
expression_type: str | None = Field(default=None, description="表达类型")
test_stage: str | None = Field(default=None, description="测试生育期")
# ---------- 测试记录 ----------
class DusTestBaseSchema(BaseModel):
model_config = ConfigDict(from_attributes=True)
test_name: str = Field(..., description="测试名称")
germplasm_id: int | None = Field(default=None, description="申请/候选品种")
trial_study_id: int | None = Field(default=None, description="测试点")
tester: str | None = Field(default=None, description="测试人")
test_date: date | None = Field(default=None, description="测试日期")
status: str = Field(default="planning", description="状态(planning/testing/completed/report)")
conclusion: str = Field(default="pending", description="结论(pending/distinct/not_distinct)")
report_path: str | None = Field(default=None, description="报告附件路径")
remark: str | None = Field(default=None, description="备注")
class DusTestCreateSchema(DusTestBaseSchema):
pass
class DusTestUpdateSchema(DusTestBaseSchema):
test_name: str | None = Field(default=None, description="测试名称")
status: str | None = Field(default=None, description="状态")
conclusion: str | None = Field(default=None, description="结论")
class DusTestOutSchema(DusTestBaseSchema):
id: int
uuid: str
germplasm_name: str | None = None
trial_study_name: str | None = None
analysis_json: dict | None = None
created_time: datetime | None = None
updated_time: datetime | None = None
created_by: CommonSchema | None = None
updated_by: CommonSchema | None = None
class DusDistinctnessIn(BaseModel):
"""特异性统计判定入参(§8.18)。"""
reference_test_ids: list[int] | None = Field(
default=None, description="显式参照测试 id 列表;为空则自动取同测试点其他非软删测试"
)
alpha: float = Field(
default=0.01, gt=0.0, lt=0.5,
description="显著性水平(默认 1% 双侧,UPOV LSD 惯例)",
)
class DusTestQueryParam(BaseModel):
test_name: str | None = Field(default=None, description="测试名称", json_schema_extra={"q": "like"})
tester: str | None = Field(default=None, description="测试人", json_schema_extra={"q": "like"})
germplasm_id: int | None = Field(default=None, description="申请/候选品种")
trial_study_id: int | None = Field(default=None, description="测试点")
status: str | None = Field(default=None, description="状态")
conclusion: str | None = Field(default=None, description="结论")
# ---------- 观测 ----------
class DusObservationBaseSchema(BaseModel):
model_config = ConfigDict(from_attributes=True)
dus_test_id: int = Field(..., description="DUS 测试")
dus_descriptor_id: int = Field(..., description="描述符")
value_numeric: float | None = Field(default=None, description="数值表达值")
value_text: str | None = Field(default=None, description="文本表达值")
expression_note: str | None = Field(default=None, description="表达说明")
remark: str | None = Field(default=None, description="备注")
class DusObservationCreateSchema(DusObservationBaseSchema):
pass
class DusObservationUpdateSchema(DusObservationBaseSchema):
dus_test_id: int | None = Field(default=None, description="DUS 测试")
dus_descriptor_id: int | None = Field(default=None, description="描述符")
class DusObservationOutSchema(DusObservationBaseSchema):
id: int
uuid: str
descriptor_no: str | None = None
descriptor_name: str | None = None
created_time: datetime | None = None
updated_time: datetime | None = None
created_by: CommonSchema | None = None
updated_by: CommonSchema | None = None
class DusObservationQueryParam(BaseModel):
dus_test_id: int | None = Field(default=None, description="DUS 测试")
dus_descriptor_id: int | None = Field(default=None, description="描述符")