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
|
|
|
|
2024-09-20 16:58:52 +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:
|
2024-09-20 16:58:52 +08:00
|
|
|
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
|