Source code for samples.tasks
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 27 16:38:37 2019
@author: Paolo Cozzi <cozzi@ibba.cnr.it>
"""
from celery.utils.log import get_task_logger
from django.db import transaction
from common.constants import NEED_REVISION
from common.tasks import BaseTask, NotifyAdminTaskMixin
from image.celery import app as celery_app
from uid.models import Sample
from submissions.tasks import BatchUpdateMixin, SubmissionTaskMixin
from validation.models import ValidationSummary
# Get an instance of a logger
logger = get_task_logger(__name__)
[docs]class BatchDeleteSamples(SubmissionTaskMixin, NotifyAdminTaskMixin, BaseTask):
name = "Batch delete samples"
description = """Batch remove samples"""
action = "batch delete samples"
[docs] def run(self, submission_id, sample_ids):
"""Function for batch update attribute in animals
Args:
submission_id (int): id of submission
sample_ids (list): set with ids to delete
"""
# get a submission object (from SubmissionTaskMixin)
submission_obj = self.get_uid_submission(submission_id)
logger.info("Start batch delete for samples")
success_ids = list()
failed_ids = list()
for sample_id in sample_ids:
try:
sample_obj = Sample.objects.get(
name=sample_id, submission=submission_obj)
with transaction.atomic():
sample_obj.delete()
success_ids.append(sample_id)
except Sample.DoesNotExist:
failed_ids.append(sample_id)
if len(failed_ids) != 0:
message = f"You've removed {len(success_ids)} " \
f"samples. It wasn't possible to find records with these " \
f"ids: {', '.join(failed_ids)}. Rerun validation please!"
else:
message = f"You've removed {len(success_ids)} " \
f"samples. Rerun validation please!"
summary_obj, created = ValidationSummary.objects.get_or_create(
submission=submission_obj, type='sample')
summary_obj.reset_all_count()
# mark submission with NEED_REVISION and send message
self.update_submission_status(
submission_obj,
NEED_REVISION,
message,
construct_message=True
)
logger.info("batch delete for samples completed")
return 'success'
[docs]class BatchUpdateSamples(BatchUpdateMixin, NotifyAdminTaskMixin, BaseTask):
name = "Batch update samples"
description = """Batch update of field in samples"""
action = "batch update samples"
# defined in common.tasks.BatchUpdateMixin
item_cls = Sample
[docs] def run(self, submission_id, sample_ids, attribute):
"""Function for batch update attribute in samples
Args:
submission_id (int): id of submission
sample_ids (dict): dict with id and values to update
attribute (str): attribute to update
"""
logger.info("Start batch update for samples")
self.batch_update(submission_id, sample_ids, attribute)
return 'success'
# register explicitly tasks
# https://github.com/celery/celery/issues/3744#issuecomment-271366923
celery_app.tasks.register(BatchDeleteSamples)
celery_app.tasks.register(BatchUpdateSamples)