54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
# tasks.py
|
|
from celery import shared_task
|
|
from celery.utils.log import get_task_logger
|
|
|
|
from django.conf import settings
|
|
from asgiref.sync import async_to_sync
|
|
from modules.planarian_metrics import ReductStoreClient
|
|
from scanner.models import SessionExperiment
|
|
from .models import ExperimentConfig
|
|
|
|
|
|
logger = get_task_logger(__name__)
|
|
|
|
def _get_reduct_client() -> ReductStoreClient:
|
|
"""Instancie le client ReductStore depuis les settings Django."""
|
|
return ReductStoreClient(url=settings.REDUCTSTORE_URL, token=settings.REDUCTSTORE_TOKEN)
|
|
|
|
|
|
@shared_task
|
|
def export_experiment_metrics(experiment):
|
|
|
|
@async_to_sync
|
|
async def _do_export(well, planarian, record_type):
|
|
client = _get_reduct_client()
|
|
|
|
await client.connect()
|
|
try:
|
|
f, n = await client.export_csv(
|
|
experiment = experiment.identifier,
|
|
well = well,
|
|
planarian = planarian,
|
|
record_type = record_type,
|
|
output_dir = settings.CSV_EXPORT_DIR,
|
|
)
|
|
logger.warning(f"Export CSV {settings.CSV_EXPORT_DIR}/{f} done, {n} lignes")
|
|
except Exception as e:
|
|
logger.error(f"Erreur export CSV: {e}")
|
|
|
|
experiment_configs = ExperimentConfig.objects.filter(experiment_key_id=experiment.id).order_by('well').all()
|
|
for conf in experiment_configs:
|
|
well = conf.well
|
|
count = conf.planarian_count
|
|
|
|
for record_type in ["frame", "summary"]:
|
|
for planarian in range(count):
|
|
_do_export(well, planarian, record_type)
|
|
|
|
@shared_task
|
|
def export_session_metrics(session):
|
|
experiments = SessionExperiment.experiment_by_session(session.id)
|
|
for experiment in experiments:
|
|
export_experiment_metrics(experiment)
|
|
|
|
|