Skip to content

Commit 356517a

Browse files
committed
Create add_dicom_image_set_to_object task
1 parent 11791b3 commit 356517a

1 file changed

Lines changed: 111 additions & 1 deletion

File tree

app/grandchallenge/components/tasks.py

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,13 @@
3131
from django.utils.timezone import now
3232
from panimg.models import SimpleITKImage
3333

34-
from grandchallenge.cases.models import Image, ImageFile, RawImageUploadSession
34+
from grandchallenge.cases.models import (
35+
DICOMImageSet,
36+
DICOMImageSetUpload,
37+
Image,
38+
ImageFile,
39+
RawImageUploadSession,
40+
)
3541
from grandchallenge.components.backends.exceptions import (
3642
CIVNotEditableException,
3743
ComponentException,
@@ -1330,6 +1336,110 @@ def add_image_to_object( # noqa: C901
13301336
logger.info("No linked task, task complete")
13311337

13321338

1339+
@acks_late_micro_short_task(
1340+
retry_on=(LockNotAcquiredException,), delayed_retry=False
1341+
)
1342+
@transaction.atomic
1343+
def add_dicom_image_set_to_object( # noqa: C901
1344+
*,
1345+
app_label,
1346+
model_name,
1347+
object_pk,
1348+
interface_pk,
1349+
dicom_image_set_upload_pk,
1350+
linked_task=None,
1351+
):
1352+
from grandchallenge.algorithms.models import Job
1353+
from grandchallenge.archives.models import ArchiveItem
1354+
from grandchallenge.components.models import (
1355+
ComponentInterface,
1356+
ComponentInterfaceValue,
1357+
)
1358+
from grandchallenge.reader_studies.models import DisplaySet
1359+
1360+
model = apps.get_model(
1361+
app_label=app_label,
1362+
model_name=model_name,
1363+
)
1364+
1365+
try:
1366+
with check_lock_acquired():
1367+
obj = model.objects.select_for_update(nowait=True).get(
1368+
pk=object_pk
1369+
)
1370+
except (ArchiveItem.DoesNotExist, DisplaySet.DoesNotExist):
1371+
logger.info(f"Nothing to do: {model_name} no longer exists.")
1372+
return
1373+
1374+
interface = ComponentInterface.objects.get(pk=interface_pk)
1375+
upload = DICOMImageSetUpload.objects.get(pk=dicom_image_set_upload_pk)
1376+
error_handler = obj.get_error_handler()
1377+
1378+
try:
1379+
dicom_image_set = DICOMImageSet.objects.get(
1380+
dicom_image_set_upload_pk=dicom_image_set_upload_pk
1381+
)
1382+
image = Image.objects.get(dicom_image_set_pk=dicom_image_set.pk)
1383+
except (DICOMImageSet.DoesNotExist, Image.DoesNotExist):
1384+
error_handler.handle_error(
1385+
interface=interface,
1386+
error_message="Image does not exist",
1387+
user=upload.creator,
1388+
)
1389+
logger.info("Image for dicom image set does not exist")
1390+
return
1391+
1392+
current_value = obj.get_current_value_for_interface(
1393+
interface=interface, user=upload.creator
1394+
)
1395+
1396+
civ, created = ComponentInterfaceValue.objects.get_first_or_create(
1397+
interface=interface, image=image
1398+
)
1399+
1400+
if created:
1401+
try:
1402+
civ.full_clean()
1403+
except ValidationError as e:
1404+
error_handler.handle_error(
1405+
interface=interface,
1406+
error_message=format_validation_error_message(error=e),
1407+
user=upload.creator,
1408+
)
1409+
logger.info(f"Validation failed: {e}")
1410+
return
1411+
except Exception as e:
1412+
error_handler.handle_error(
1413+
interface=interface,
1414+
error_message="An unexpected error occurred",
1415+
user=upload.creator,
1416+
)
1417+
logger.error(e, exc_info=True)
1418+
return
1419+
1420+
try:
1421+
obj.remove_civ(civ=current_value)
1422+
obj.add_civ(civ=civ)
1423+
except CIVNotEditableException as e:
1424+
if isinstance(obj, Job) and obj.status == Job.CANCELLED:
1425+
logger.info("Job has been cancelled, exiting")
1426+
return
1427+
else:
1428+
error_handler.handle_error(
1429+
interface=interface,
1430+
error_message="An unexpected error occurred",
1431+
user=upload.creator,
1432+
)
1433+
logger.error(e, exc_info=True)
1434+
return
1435+
1436+
if linked_task is not None:
1437+
logger.info("Scheduling linked task")
1438+
on_commit(signature(linked_task).apply_async)
1439+
else:
1440+
logger.info("No linked task, task complete")
1441+
1442+
13331443
@acks_late_micro_short_task(
13341444
retry_on=(LockNotAcquiredException,), delayed_retry=False
13351445
)

0 commit comments

Comments
 (0)