未知(继上次中断)

This commit is contained in:
Cheng Zhou
2026-02-04 10:52:34 +08:00
parent 8e258d21a7
commit 737f84bf54
99 changed files with 5497 additions and 2143 deletions
+44 -16
View File
@@ -28,9 +28,7 @@ from app.models.startup_feasibility import StartupFeasibility
from app.models.subject import Subject
from app.models.subject_history import SubjectHistory
from app.models.training_authorization import TrainingAuthorization
from app.models.version_workflow import VersionWorkflow
from app.models.visit import Visit
from app.models.workflow_action import WorkflowAction
from app.schemas.site import SiteCreate, SiteUpdate
ATTACHMENT_ROOT = Path(__file__).resolve().parent.parent / "uploads"
@@ -77,10 +75,15 @@ async def list_by_study(
skip: int = 0,
limit: int = 100,
include_inactive: bool = False,
site_ids: set[uuid.UUID] | None = None,
) -> Sequence[Site]:
if site_ids is not None and not site_ids:
return []
stmt = select(Site).where(Site.study_id == study_id)
if not include_inactive:
stmt = stmt.where(Site.is_active.is_(True))
if site_ids is not None:
stmt = stmt.where(Site.id.in_(site_ids))
result = await db.execute(stmt.offset(skip).limit(limit))
return result.scalars().all()
@@ -100,6 +103,45 @@ async def list_active_names(db: AsyncSession, study_id: uuid.UUID) -> set[str]:
return {row[0] for row in result.all() if row[0]}
def _contact_filter(user_id: str):
return or_(
Site.contact == user_id,
Site.contact.like(f"{user_id},%"),
Site.contact.like(f"%,{user_id}"),
Site.contact.like(f"%,{user_id},%"),
)
async def list_ids_by_contact_user(
db: AsyncSession,
study_id: uuid.UUID,
user_id: uuid.UUID,
*,
include_inactive: bool = False,
) -> set[uuid.UUID]:
user_id_str = str(user_id)
stmt = select(Site.id).where(Site.study_id == study_id, _contact_filter(user_id_str))
if not include_inactive:
stmt = stmt.where(Site.is_active.is_(True))
result = await db.execute(stmt)
return {row[0] for row in result.all() if row[0]}
async def list_names_by_contact_user(
db: AsyncSession,
study_id: uuid.UUID,
user_id: uuid.UUID,
*,
include_inactive: bool = False,
) -> set[str]:
user_id_str = str(user_id)
stmt = select(Site.name).where(Site.study_id == study_id, _contact_filter(user_id_str))
if not include_inactive:
stmt = stmt.where(Site.is_active.is_(True))
result = await db.execute(stmt)
return {row[0] for row in result.all() if row[0]}
async def delete_site_and_related(db: AsyncSession, site: Site) -> None:
site_id = site.id
study_id = site.study_id
@@ -167,17 +209,6 @@ async def delete_site_and_related(db: AsyncSession, site: Site) -> None:
await db.execute(select(DocumentVersion.id).where(DocumentVersion.document_id.in_(document_ids)))
).scalars().all()
workflow_ids = []
workflow_conditions = []
if document_ids:
workflow_conditions.append(VersionWorkflow.document_id.in_(document_ids))
if version_ids:
workflow_conditions.append(VersionWorkflow.version_id.in_(version_ids))
if workflow_conditions:
workflow_ids = (
await db.execute(select(VersionWorkflow.id).where(or_(*workflow_conditions)))
).scalars().all()
distribution_conditions = []
if document_ids:
distribution_conditions.append(Distribution.document_id.in_(document_ids))
@@ -261,9 +292,6 @@ async def delete_site_and_related(db: AsyncSession, site: Site) -> None:
)
)
if workflow_ids:
await db.execute(delete(WorkflowAction).where(WorkflowAction.workflow_id.in_(workflow_ids)))
await db.execute(delete(VersionWorkflow).where(VersionWorkflow.id.in_(workflow_ids)))
if distribution_ids:
await db.execute(delete(Acknowledgement).where(Acknowledgement.distribution_id.in_(distribution_ids)))
await db.execute(delete(Distribution).where(Distribution.id.in_(distribution_ids)))