Skip to content

Commit bece572

Browse files
committed
Create add_dicom_image_set_to_object
1 parent cd4f662 commit bece572

1 file changed

Lines changed: 106 additions & 33 deletions

File tree

app/grandchallenge/components/tasks.py

Lines changed: 106 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@
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+
Image,
37+
ImageFile,
38+
RawImageUploadSession,
39+
)
3540
from grandchallenge.components.backends.exceptions import (
3641
CIVNotEditableException,
3742
ComponentException,
@@ -1240,6 +1245,7 @@ def get_object(*, app_label, model_name, object_pk):
12401245
)
12411246
except (ArchiveItem.DoesNotExist, DisplaySet.DoesNotExist):
12421247
logger.info(f"Nothing to do: {model_name} no longer exists.")
1248+
return None
12431249

12441250

12451251
def add_civ_to_object(
@@ -1264,6 +1270,54 @@ def add_civ_to_object(
12641270
return
12651271

12661272

1273+
def add_image_to_object(
1274+
*,
1275+
image,
1276+
obj,
1277+
interface,
1278+
error_handler,
1279+
user,
1280+
):
1281+
from grandchallenge.components.models import ComponentInterfaceValue
1282+
1283+
current_value = obj.get_current_value_for_interface(
1284+
interface=interface, user=user
1285+
)
1286+
1287+
civ, created = ComponentInterfaceValue.objects.get_first_or_create(
1288+
interface=interface, image=image
1289+
)
1290+
1291+
if created:
1292+
try:
1293+
civ.full_clean()
1294+
except ValidationError as e:
1295+
error_handler.handle_error(
1296+
interface=interface,
1297+
error_message=format_validation_error_message(error=e),
1298+
user=user,
1299+
)
1300+
logger.info(f"Validation failed: {e}")
1301+
return
1302+
except Exception as e:
1303+
error_handler.handle_error(
1304+
interface=interface,
1305+
error_message="An unexpected error occurred",
1306+
user=user,
1307+
)
1308+
logger.error(e, exc_info=True)
1309+
return
1310+
1311+
add_civ_to_object(
1312+
civ=civ,
1313+
obj=obj,
1314+
current_value=current_value,
1315+
error_handler=error_handler,
1316+
interface=interface,
1317+
user=user,
1318+
)
1319+
1320+
12671321
@acks_late_micro_short_task(
12681322
retry_on=(LockNotAcquiredException,), delayed_retry=False
12691323
)
@@ -1277,10 +1331,7 @@ def add_panimg_image_to_object(
12771331
upload_session_pk,
12781332
linked_task=None,
12791333
):
1280-
from grandchallenge.components.models import (
1281-
ComponentInterface,
1282-
ComponentInterfaceValue,
1283-
)
1334+
from grandchallenge.components.models import ComponentInterface
12841335

12851336
obj = get_object(
12861337
app_label=app_label, model_name=model_name, object_pk=object_pk
@@ -1308,41 +1359,63 @@ def add_panimg_image_to_object(
13081359
logger.info("Upload session should only have one image")
13091360
return
13101361

1311-
current_value = obj.get_current_value_for_interface(
1312-
interface=interface, user=upload_session.creator
1362+
add_image_to_object(
1363+
image=image,
1364+
obj=obj,
1365+
interface=interface,
1366+
error_handler=error_handler,
1367+
user=upload_session.creator,
13131368
)
13141369

1315-
civ, created = ComponentInterfaceValue.objects.get_first_or_create(
1316-
interface=interface, image=image
1370+
if linked_task is not None:
1371+
logger.info("Scheduling linked task")
1372+
on_commit(signature(linked_task).apply_async)
1373+
else:
1374+
logger.info("No linked task, task complete")
1375+
1376+
1377+
@acks_late_micro_short_task(
1378+
retry_on=(LockNotAcquiredException,), delayed_retry=False
1379+
)
1380+
@transaction.atomic
1381+
def add_dicom_image_set_to_object(
1382+
*,
1383+
app_label,
1384+
model_name,
1385+
object_pk,
1386+
interface_pk,
1387+
dicom_image_set_pk,
1388+
linked_task=None,
1389+
):
1390+
from grandchallenge.components.models import ComponentInterface
1391+
1392+
obj = get_object(
1393+
app_label=app_label, model_name=model_name, object_pk=object_pk
13171394
)
1395+
if not obj:
1396+
return
13181397

1319-
if created:
1320-
try:
1321-
civ.full_clean()
1322-
except ValidationError as e:
1323-
error_handler.handle_error(
1324-
interface=interface,
1325-
error_message=format_validation_error_message(error=e),
1326-
user=upload_session.creator,
1327-
)
1328-
logger.info(f"Validation failed: {e}")
1329-
return
1330-
except Exception as e:
1331-
error_handler.handle_error(
1332-
interface=interface,
1333-
error_message="An unexpected error occurred",
1334-
user=upload_session.creator,
1335-
)
1336-
logger.error(e, exc_info=True)
1337-
return
1398+
interface = ComponentInterface.objects.get(pk=interface_pk)
1399+
dicom_image_set = DICOMImageSet.objects.get(pk=dicom_image_set_pk)
1400+
error_handler = obj.get_error_handler()
13381401

1339-
add_civ_to_object(
1340-
civ=civ,
1402+
try:
1403+
image = Image.objects.get(dicom_image_set_pk=dicom_image_set_pk)
1404+
except Image.DoesNotExist:
1405+
error_handler.handle_error(
1406+
interface=interface,
1407+
error_message="Image does not exist",
1408+
user=dicom_image_set.dicom_image_set_upload.creator,
1409+
)
1410+
logger.info("Image for dicom image set does not exist")
1411+
return
1412+
1413+
add_image_to_object(
1414+
image=image,
13411415
obj=obj,
1342-
current_value=current_value,
1343-
error_handler=error_handler,
13441416
interface=interface,
1345-
user=upload_session.creator,
1417+
error_handler=error_handler,
1418+
user=dicom_image_set.dicom_image_set_upload.creator,
13461419
)
13471420

13481421
if linked_task is not None:

0 commit comments

Comments
 (0)