Files
ctms/backend/app/crud/startup.py
T
2026-01-15 11:25:13 +08:00

256 lines
7.2 KiB
Python

import uuid
from typing import Sequence
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.startup_feasibility import StartupFeasibility
from app.models.startup_ethics import StartupEthics
from app.models.kickoff_meeting import KickoffMeeting
from app.models.training_authorization import TrainingAuthorization
from app.schemas.startup import (
KickoffMeetingCreate,
KickoffMeetingUpdate,
StartupEthicsCreate,
StartupEthicsUpdate,
StartupFeasibilityCreate,
StartupFeasibilityUpdate,
TrainingAuthorizationCreate,
TrainingAuthorizationUpdate,
)
async def create_feasibility(
db: AsyncSession,
study_id: uuid.UUID,
record_in: StartupFeasibilityCreate,
created_by: uuid.UUID | None,
) -> StartupFeasibility:
record = StartupFeasibility(
study_id=study_id,
site_id=record_in.site_id,
submit_date=record_in.submit_date,
accept_date=record_in.accept_date,
approved_date=record_in.approved_date,
project_no=record_in.project_no,
created_by=created_by,
)
db.add(record)
await db.commit()
await db.refresh(record)
return record
async def get_feasibility(db: AsyncSession, record_id: uuid.UUID) -> StartupFeasibility | None:
result = await db.execute(select(StartupFeasibility).where(StartupFeasibility.id == record_id))
return result.scalar_one_or_none()
async def list_feasibilities(
db: AsyncSession,
study_id: uuid.UUID,
skip: int = 0,
limit: int = 100,
) -> Sequence[StartupFeasibility]:
stmt = (
select(StartupFeasibility)
.where(StartupFeasibility.study_id == study_id)
.order_by(StartupFeasibility.created_at.desc())
.offset(skip)
.limit(limit)
)
result = await db.execute(stmt)
return result.scalars().all()
async def update_feasibility(
db: AsyncSession, record: StartupFeasibility, record_in: StartupFeasibilityUpdate
) -> StartupFeasibility:
update_data = record_in.model_dump(exclude_unset=True)
for key, value in update_data.items():
setattr(record, key, value)
await db.commit()
await db.refresh(record)
return record
async def delete_feasibility(db: AsyncSession, record: StartupFeasibility) -> None:
await db.delete(record)
await db.commit()
async def create_ethics(
db: AsyncSession,
study_id: uuid.UUID,
record_in: StartupEthicsCreate,
created_by: uuid.UUID | None,
) -> StartupEthics:
record = StartupEthics(
study_id=study_id,
site_id=record_in.site_id,
submit_date=record_in.submit_date,
accept_date=record_in.accept_date,
meeting_date=record_in.meeting_date,
approved_date=record_in.approved_date,
approval_no=record_in.approval_no,
created_by=created_by,
)
db.add(record)
await db.commit()
await db.refresh(record)
return record
async def get_ethics(db: AsyncSession, record_id: uuid.UUID) -> StartupEthics | None:
result = await db.execute(select(StartupEthics).where(StartupEthics.id == record_id))
return result.scalar_one_or_none()
async def list_ethics(
db: AsyncSession,
study_id: uuid.UUID,
skip: int = 0,
limit: int = 100,
) -> Sequence[StartupEthics]:
stmt = (
select(StartupEthics)
.where(StartupEthics.study_id == study_id)
.order_by(StartupEthics.created_at.desc())
.offset(skip)
.limit(limit)
)
result = await db.execute(stmt)
return result.scalars().all()
async def update_ethics(
db: AsyncSession, record: StartupEthics, record_in: StartupEthicsUpdate
) -> StartupEthics:
update_data = record_in.model_dump(exclude_unset=True)
for key, value in update_data.items():
setattr(record, key, value)
await db.commit()
await db.refresh(record)
return record
async def delete_ethics(db: AsyncSession, record: StartupEthics) -> None:
await db.delete(record)
await db.commit()
async def create_kickoff(
db: AsyncSession,
study_id: uuid.UUID,
meeting_in: KickoffMeetingCreate,
created_by: uuid.UUID | None,
) -> KickoffMeeting:
meeting = KickoffMeeting(
study_id=study_id,
site_id=meeting_in.site_id,
kickoff_date=meeting_in.kickoff_date,
attendees=meeting_in.attendees,
created_by=created_by,
)
db.add(meeting)
await db.commit()
await db.refresh(meeting)
return meeting
async def get_kickoff(db: AsyncSession, meeting_id: uuid.UUID) -> KickoffMeeting | None:
result = await db.execute(select(KickoffMeeting).where(KickoffMeeting.id == meeting_id))
return result.scalar_one_or_none()
async def list_kickoffs(
db: AsyncSession,
study_id: uuid.UUID,
skip: int = 0,
limit: int = 100,
) -> Sequence[KickoffMeeting]:
stmt = (
select(KickoffMeeting)
.where(KickoffMeeting.study_id == study_id)
.order_by(KickoffMeeting.created_at.desc())
.offset(skip)
.limit(limit)
)
result = await db.execute(stmt)
return result.scalars().all()
async def update_kickoff(
db: AsyncSession, meeting: KickoffMeeting, meeting_in: KickoffMeetingUpdate
) -> KickoffMeeting:
update_data = meeting_in.model_dump(exclude_unset=True)
for key, value in update_data.items():
setattr(meeting, key, value)
await db.commit()
await db.refresh(meeting)
return meeting
async def create_training_authorization(
db: AsyncSession,
study_id: uuid.UUID,
record_in: TrainingAuthorizationCreate,
created_by: uuid.UUID | None,
) -> TrainingAuthorization:
record = TrainingAuthorization(
study_id=study_id,
name=record_in.name,
role=record_in.role,
site_name=record_in.site_name,
trained=record_in.trained,
authorized=record_in.authorized,
trained_date=record_in.trained_date,
authorized_date=record_in.authorized_date,
remark=record_in.remark,
created_by=created_by,
)
db.add(record)
await db.commit()
await db.refresh(record)
return record
async def get_training_authorization(
db: AsyncSession, record_id: uuid.UUID
) -> TrainingAuthorization | None:
result = await db.execute(select(TrainingAuthorization).where(TrainingAuthorization.id == record_id))
return result.scalar_one_or_none()
async def list_training_authorizations(
db: AsyncSession,
study_id: uuid.UUID,
skip: int = 0,
limit: int = 200,
) -> Sequence[TrainingAuthorization]:
stmt = (
select(TrainingAuthorization)
.where(TrainingAuthorization.study_id == study_id)
.order_by(TrainingAuthorization.created_at.desc())
.offset(skip)
.limit(limit)
)
result = await db.execute(stmt)
return result.scalars().all()
async def update_training_authorization(
db: AsyncSession, record: TrainingAuthorization, record_in: TrainingAuthorizationUpdate
) -> TrainingAuthorization:
update_data = record_in.model_dump(exclude_unset=True)
for key, value in update_data.items():
setattr(record, key, value)
await db.commit()
await db.refresh(record)
return record
async def delete_training_authorization(db: AsyncSession, record: TrainingAuthorization) -> None:
await db.delete(record)
await db.commit()