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

82 lines
2.9 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-29 04:19:12 +08:00
class WorkSheetWorkFlow:
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-29 04:19:12 +08:00
async def revert(self, uid: str, by_uid: str):
to_status = WorkSheetState.PENDING
2024-07-29 05:29:12 +08:00
_results, qc_results = await self.worksheet_service.get_analysis_results(uid)
results = _results + qc_results
print("arrrrrrrrrrrrrr: ", results)
2024-07-29 04:19:12 +08:00
awaiting_states = [ResultState.RESULTED, ResultState.RETRACTED]
2024-07-29 05:29:12 +08:00
if all([(ar.status in awaiting_states) for ar in results]):
2024-07-29 04:19:12 +08:00
to_status = WorkSheetState.AWAITING
await self.worksheet_service.change_state(uid, to_status, by_uid)
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)
2024-09-25 00:12:10 +08:00
return self.worksheet_service.submit(worksheet.uid, 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 (
2024-09-22 23:15:27 +08:00
len(
list(
filter(lambda ar: ar.status in result_states, results + qc_results)
2024-07-28 03:52:31 +08:00
)
2024-09-22 23:15:27 +08:00
)
> 0
2024-07-28 03:52:31 +08:00
):
raise WorksheetWorkFlowException(
2024-09-22 23:04:34 +08:00
"Cannot submit a Worksheet with pending results"
2024-07-28 03:52:31 +08:00
)
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:
if worksheet.state not in [WorkSheetState.AWAITING]:
2024-07-28 03:52:31 +08:00
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]):
2024-09-22 23:04:34 +08:00
raise WorksheetWorkFlowException("Cannot approve this Worksheet")
2024-07-01 00:41:08 +08:00
return True