felicity-lims/felicity/apps/worksheet/workflow.py

71 lines
2.4 KiB
Python
Raw Normal View History

2024-07-28 03:52:31 +08:00
from felicity.apps.analysis.enum import ResultState
2024-07-24 04:30:01 +08:00
from felicity.apps.worksheet.entities import WorkSheet
from felicity.apps.worksheet.enum import WorkSheetState
from felicity.apps.worksheet.services import WorkSheetService
2024-07-01 00:41:08 +08:00
2024-07-28 03:52:31 +08:00
class WorksheetWorkFlowException(Exception): ...
2024-07-01 00:41:08 +08:00
2024-07-24 04:30:01 +08:00
class WorkSheetWorkFlowService:
2024-07-01 00:41:08 +08:00
"""WorksheetWorkFlow
Defines a set of guards that allow or prevent actions taken on Worksheet
"""
def __init__(self):
2024-07-24 04:30:01 +08:00
self.worksheet_service = WorkSheetService()
2024-07-01 00:41:08 +08:00
2024-07-24 04:30:01 +08:00
async def submit(self, uid, submitter):
worksheet = await self.worksheet_service.get(uid=uid)
await self._guard_submit(worksheet)
return self.worksheet_service.submit(submitter)
2024-07-01 00:41:08 +08:00
2024-07-24 04:30:01 +08:00
async def _guard_submit(self, worksheet: WorkSheet) -> bool:
2024-07-28 03:52:31 +08:00
if worksheet.state not in [WorkSheetState.PENDING, WorkSheetState.SUBMITTING]:
raise WorksheetWorkFlowException(
f"Cannot submit a {worksheet.state} WorkSheet"
)
2024-07-01 00:41:08 +08:00
2024-07-24 04:30:01 +08:00
result_states = [ResultState.PENDING]
2024-07-01 00:41:08 +08:00
2024-07-28 03:52:31 +08:00
results, qc_results = await self.worksheet_service.get_analysis_results(
worksheet.uid
)
if (
len(
list(
filter(lambda ar: ar.status in result_states, results + qc_results)
)
)
> 0
):
raise WorksheetWorkFlowException(
f"Cannot submit a Worksheet with pending results"
)
2024-07-01 00:41:08 +08:00
return True
2024-07-24 04:30:01 +08:00
async def approve(self, uid, approved_by):
2024-07-01 00:41:08 +08:00
worksheet = await WorkSheet.get(uid=uid)
2024-07-24 04:30:01 +08:00
await self._guard_approve(worksheet)
await self.worksheet_service.verify(worksheet.uid, approved_by)
2024-07-01 00:41:08 +08:00
2024-07-24 04:30:01 +08:00
async def _guard_approve(self, worksheet: WorkSheet) -> bool:
2024-07-28 03:52:31 +08:00
if worksheet.state not in [WorkSheetState.AWAITING, WorkSheetState.APPROVING]:
raise WorksheetWorkFlowException(
f"Cannot approve a {worksheet.state} WorkSheet"
)
2024-07-01 00:41:08 +08:00
result_states = [
2024-07-24 04:30:01 +08:00
ResultState.APPROVED,
ResultState.RETRACTED,
2024-07-28 03:52:31 +08:00
ResultState.CANCELLED,
2024-07-01 00:41:08 +08:00
]
2024-07-28 03:52:31 +08:00
results, qc_results = await self.worksheet_service.get_analysis_results(
worksheet.uid
)
2024-07-01 00:41:08 +08:00
if not all([ar.status in result_states for ar in results + qc_results]):
raise WorksheetWorkFlowException(f"Cannot approve this Worksheet")
return True