felicity-lims/felicity/apps/impress/sample/tasks.py

81 lines
2.9 KiB
Python
Raw Normal View History

import logging
from typing import List
2024-07-24 04:30:01 +08:00
from felicity.apps.analysis.entities.analysis import Sample
2024-07-28 03:52:31 +08:00
from felicity.apps.analysis.enum import SampleState
from felicity.apps.analysis.services.analysis import SampleService
from felicity.apps.impress.sample import utils
from felicity.apps.iol.redis import process_tracker
from felicity.apps.iol.redis.enum import TrackableObject
from felicity.apps.job import schemas as job_schemas
2024-07-28 03:52:31 +08:00
from felicity.apps.job.enum import JobAction, JobCategory, JobState
from felicity.apps.job.enum import JobPriority
from felicity.apps.job.services import JobService
from felicity.apps.notification.services import NotificationService
2024-07-24 04:30:01 +08:00
from felicity.apps.user.entities import User
from felicity.apps.user.services import UserService
from felicity.core.config import get_settings
settings = get_settings()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def impress_results(job_uid: str):
logger.info(f"starting impress job {job_uid} ....")
job = await JobService().get(uid=job_uid)
if not job:
return
2024-07-24 04:30:01 +08:00
if job.status != JobState.PENDING:
return
await JobService().change_status(job.uid, new_status=JobState.RUNNING)
user = await UserService().get(uid=job.creator_uid)
await utils.impress_samples(job.data, user)
try:
await JobService().change_status(job.uid, new_status=JobState.FINISHED)
await process_tracker.release(uid=job.uid, object_type=TrackableObject.SAMPLE)
2024-09-22 23:15:27 +08:00
await NotificationService().notify(
"Your results were successfully published", user
)
except Exception as e:
await JobService().change_status(job.uid, new_status=JobState.FAILED)
2024-02-16 23:48:19 +08:00
logger.info(f"Failed impress job {job_uid} with errr: {str(e)}")
await NotificationService().notify(
f"Failed to publish results in job with uid: {job.uid} with error: {str(e)}",
user,
)
async def prepare_for_impress():
2024-09-22 23:15:27 +08:00
samples: List[Sample] = await SampleService().get_all(
status__in=[SampleState.APPROVED]
)
data = [{"uid": s.uid, "action": "publish"} for s in samples]
system_daemon: User = await UserService().get(email=settings.SYSTEM_DAEMON_EMAIL)
job_schema = job_schemas.JobCreate(
2024-07-24 04:30:01 +08:00
action=JobAction.IMPRESS_REPORT,
category=JobCategory.IMPRESS,
priority=JobPriority.NORMAL,
job_id="0",
2024-07-24 04:30:01 +08:00
status=JobState.PENDING,
creator_uid=system_daemon.uid,
data=data,
)
await JobService().create(job_schema)
for sample in samples:
2024-09-22 23:15:27 +08:00
await process_tracker.process(
uid=sample.uid, object_type=TrackableObject.SAMPLE
)
async def cleanup_jobs():
"""Cleanup jobs that were successfully executed"""
jobs = await JobService().get_all(status=JobState.FINISHED)
for job in jobs:
await JobService().delete(job.uid)