|
31 | 31 | from django.utils.timezone import now |
32 | 32 | from panimg.models import SimpleITKImage |
33 | 33 |
|
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 | +) |
35 | 41 | from grandchallenge.components.backends.exceptions import ( |
36 | 42 | CIVNotEditableException, |
37 | 43 | ComponentException, |
@@ -1330,6 +1336,110 @@ def add_image_to_object( # noqa: C901 |
1330 | 1336 | logger.info("No linked task, task complete") |
1331 | 1337 |
|
1332 | 1338 |
|
| 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 | + |
1333 | 1443 | @acks_late_micro_short_task( |
1334 | 1444 | retry_on=(LockNotAcquiredException,), delayed_retry=False |
1335 | 1445 | ) |
|
0 commit comments