3131from django .utils .timezone import now
3232from 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+ )
3540from 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
12451251def 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