未知(继上次中断)
This commit is contained in:
+27
-4
@@ -2,7 +2,7 @@ import uuid
|
||||
from datetime import date, timedelta
|
||||
from typing import Sequence
|
||||
|
||||
from sqlalchemy import select, update as sa_update
|
||||
from sqlalchemy import or_, select, update as sa_update
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.ae import AdverseEvent
|
||||
@@ -11,10 +11,20 @@ from app.models.subject import Subject
|
||||
from app.schemas.ae import AECreate, AEUpdate
|
||||
|
||||
|
||||
def _seriousness_rank(value: str | None) -> int | None:
|
||||
if not value:
|
||||
return None
|
||||
normalized = str(value).strip().upper()
|
||||
roman_map = {"I": 1, "II": 2, "III": 3, "IV": 4, "V": 5}
|
||||
legacy_map = {"SERIOUS": 5, "NON_SERIOUS": 1}
|
||||
return roman_map.get(normalized) or legacy_map.get(normalized)
|
||||
|
||||
|
||||
def _calc_due_date(onset: date | None, seriousness: str) -> date | None:
|
||||
if onset is None:
|
||||
return None
|
||||
delta = 1 if seriousness == "SERIOUS" else 7
|
||||
rank = _seriousness_rank(seriousness)
|
||||
delta = 1 if rank and rank >= 3 else 7
|
||||
return onset + timedelta(days=delta)
|
||||
|
||||
|
||||
@@ -54,8 +64,8 @@ async def create_ae(
|
||||
term=ae_in.term,
|
||||
onset_date=ae_in.onset_date,
|
||||
resolution_date=None,
|
||||
seriousness=ae_in.seriousness,
|
||||
severity=ae_in.severity,
|
||||
seriousness=str(ae_in.seriousness),
|
||||
severity=str(ae_in.seriousness),
|
||||
causality=ae_in.causality,
|
||||
action_taken=None,
|
||||
outcome=ae_in.outcome,
|
||||
@@ -84,8 +94,19 @@ async def list_ae(
|
||||
site_id: uuid.UUID | None = None,
|
||||
subject_id: uuid.UUID | None = None,
|
||||
overdue: bool | None = None,
|
||||
site_ids: set[uuid.UUID] | None = None,
|
||||
) -> Sequence[AdverseEvent]:
|
||||
stmt = select(AdverseEvent).where(AdverseEvent.study_id == study_id)
|
||||
if site_ids is not None:
|
||||
if not site_ids:
|
||||
return []
|
||||
subject_site_ids = select(Subject.id).where(Subject.site_id.in_(site_ids))
|
||||
stmt = stmt.where(
|
||||
or_(
|
||||
AdverseEvent.site_id.in_(site_ids),
|
||||
AdverseEvent.subject_id.in_(subject_site_ids),
|
||||
)
|
||||
)
|
||||
if status:
|
||||
stmt = stmt.where(AdverseEvent.status == status)
|
||||
if seriousness:
|
||||
@@ -104,6 +125,8 @@ async def list_ae(
|
||||
|
||||
async def update_ae(db: AsyncSession, study_id: uuid.UUID, ae: AdverseEvent, ae_in: AEUpdate) -> AdverseEvent:
|
||||
update_data = ae_in.model_dump(exclude_unset=True)
|
||||
if "seriousness" in update_data:
|
||||
update_data["seriousness"] = str(update_data["seriousness"])
|
||||
if "subject_id" in update_data:
|
||||
await _validate_site_subject(db, study_id, None, update_data["subject_id"])
|
||||
if "onset_date" in update_data or "seriousness" in update_data:
|
||||
|
||||
Reference in New Issue
Block a user