立项配置页初步优化
This commit is contained in:
@@ -16,6 +16,27 @@ from app.models.subject import Subject
|
||||
from app.schemas.subject import SubjectCreate, SubjectUpdate
|
||||
|
||||
|
||||
def _validate_subject_date_chain(
|
||||
*,
|
||||
screening_date: date | None,
|
||||
consent_date: date | None,
|
||||
enrollment_date: date | None,
|
||||
completion_date: date | None,
|
||||
) -> None:
|
||||
if screening_date and consent_date and consent_date < screening_date:
|
||||
raise ValueError("知情同意日期不能早于筛选日期")
|
||||
if screening_date and enrollment_date and enrollment_date < screening_date:
|
||||
raise ValueError("入组日期不能早于筛选日期")
|
||||
if consent_date and enrollment_date and enrollment_date < consent_date:
|
||||
raise ValueError("入组日期不能早于知情同意日期")
|
||||
if screening_date and completion_date and completion_date < screening_date:
|
||||
raise ValueError("完成日期不能早于筛选日期")
|
||||
if consent_date and completion_date and completion_date < consent_date:
|
||||
raise ValueError("完成日期不能早于知情同意日期")
|
||||
if enrollment_date and completion_date and completion_date < enrollment_date:
|
||||
raise ValueError("完成日期不能早于入组日期")
|
||||
|
||||
|
||||
async def _validate_site(db: AsyncSession, study_id: uuid.UUID, site_id: uuid.UUID) -> None:
|
||||
result = await db.execute(select(Site).where(Site.id == site_id))
|
||||
site = result.scalar_one_or_none()
|
||||
@@ -27,6 +48,12 @@ async def _validate_site(db: AsyncSession, study_id: uuid.UUID, site_id: uuid.UU
|
||||
|
||||
async def create_subject(db: AsyncSession, study_id: uuid.UUID, subject_in: SubjectCreate) -> Subject:
|
||||
await _validate_site(db, study_id, subject_in.site_id)
|
||||
_validate_subject_date_chain(
|
||||
screening_date=subject_in.screening_date,
|
||||
consent_date=subject_in.consent_date,
|
||||
enrollment_date=None,
|
||||
completion_date=None,
|
||||
)
|
||||
subject = Subject(
|
||||
study_id=study_id,
|
||||
site_id=subject_in.site_id,
|
||||
@@ -121,6 +148,16 @@ async def generate_default_visits(db: AsyncSession, subject: Subject) -> None:
|
||||
|
||||
async def update_subject(db: AsyncSession, subject: Subject, subject_in: SubjectUpdate) -> Subject:
|
||||
update_data = subject_in.model_dump(exclude_unset=True)
|
||||
next_screening_date = subject.screening_date
|
||||
next_consent_date = update_data.get("consent_date", subject.consent_date)
|
||||
next_enrollment_date = update_data.get("enrollment_date", subject.enrollment_date)
|
||||
next_completion_date = update_data.get("completion_date", subject.completion_date)
|
||||
_validate_subject_date_chain(
|
||||
screening_date=next_screening_date,
|
||||
consent_date=next_consent_date,
|
||||
enrollment_date=next_enrollment_date,
|
||||
completion_date=next_completion_date,
|
||||
)
|
||||
if update_data:
|
||||
await db.execute(
|
||||
sa_update(Subject)
|
||||
|
||||
Reference in New Issue
Block a user