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
|