未知(继上次中断)
This commit is contained in:
+44
-16
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user