@@ -1305,26 +1305,51 @@ def undelete_analysis(request):
13051305 req = json .loads (request .body .decode ('utf-8' ))
13061306 try :
13071307 analysis = am .Analysis .objects .get (pk = req ['item_id' ])
1308- except am .Analysis .DoesNotExist :
1309- return JsonResponse ({'error' : 'Analysis does not exist' }, status = 403 )
1308+ except ( am .Analysis .DoesNotExist , KeyError ) :
1309+ return JsonResponse ({'error' : 'Analysis does not exist or wrongly specified ' }, status = 400 )
13101310 if not analysis .deleted :
13111311 return JsonResponse ({'error' : 'Analysis is not deleted, cant undelete it' }, status = 403 )
1312- if analysis .user == request .user or request .user .is_staff :
1313- analysis .deleted = False
1314- analysis .save ()
1315- am .AnalysisDeleted .objects .filter (analysis = analysis ).delete ()
1316- return JsonResponse ({})
1317- else :
1312+ if not analysis .success_completed :
1313+ return JsonResponse ({'error' : 'Analysis was never completed, cant undelete it' }, status = 403 )
1314+ if analysis .user != request .user and not request .user .is_staff :
13181315 return JsonResponse ({'error' : 'User is not authorized to undelete this analysis' }, status = 403 )
13191316
1317+ backedup_sfs = rm .StoredFile .objects .filter (analysisresultfile__analysis = analysis ,
1318+ pdcbackedupfile__deleted = False )
1319+ if not backedup_sfs .count ():
1320+ return JsonResponse ({'error' : 'There are no backed up result files, this analysis cannot be '
1321+ 'restored' }, status = 409 )
1322+ nr_resfiles = analysis .analysisresultfile_set .count ()
1323+ #if backedup_sfs.count() < nr_resfiles:
1324+ # TODO warn in case of fewer files than needed (need to impl warning in frontend, takes
1325+ # no messages now if not error
1326+
1327+ restore_sflpk = []
1328+ for sf in backedup_sfs .values ('pk' ):
1329+ if sfls := rm .StoredFileLoc .objects .filter (sfile_id = sf ['pk' ],
1330+ servershare__fileservershare__server__can_backup = True ).values ('pk' ):
1331+ # Assume delivery area for user, otherwise first available
1332+ if not (sfl := sfls .filter (servershare__function = rm .ShareFunction .ANALYSIS_DELIVERY ).first ()):
1333+ sfl = sfls .first ()
1334+ restore_sflpk .append (sfl ['pk' ])
1335+ if joberr := check_job_error ('restore_from_pdc_archive' , sfloc_id = sfl ['pk' ]):
1336+ return JsonResponse ({'error' : 'Error trying to restore backed up result files, '
1337+ 'cannot restore' }, status = 409 )
1338+ for r_sflpk in restore_sflpk :
1339+ create_job_without_check ('restore_from_pdc_archive' , sfloc_id = r_sflpk )
1340+ rm .StoredFileLoc .objects .filter (pk__in = restore_sflpk ).update (active = True )
1341+ backedup_sfs .update (deleted = False )
1342+ analysis .deleted = False
1343+ analysis .purged = False
1344+ analysis .save ()
1345+ am .AnalysisDeleted .objects .filter (analysis = analysis ).delete ()
1346+ return JsonResponse ({})
1347+
13201348
13211349@login_required
13221350def delete_analysis (request ):
1323- # FIXME analysis can be properly deleted if its backed up
1324- # right now this is only mark for deletion and it was for a previous
1325- # setup where delete meant gone for ever
1326- # There is a lot of old analyses that should be backed up or purged properly
1327- # Maybe delete all those where no project is active anymore in delete_expired?
1351+ '''Sets deleted and queues delete jobs after checking if result files need
1352+ backing up'''
13281353 if request .method != 'POST' :
13291354 return JsonResponse ({'error' : 'Must use POST' }, status = 405 )
13301355 req = json .loads (request .body .decode ('utf-8' ))
@@ -1356,7 +1381,7 @@ def do_analysis_deletion(analysis):
13561381 # Back up files if that for some reason (old analysis) hasnt happened earlier
13571382 backup_jobs = []
13581383 for sf in rm .StoredFile .objects .filter (analysisresultfile__analysis = analysis ).exclude (
1359- pdcbackedupfile__success = True ).values ('pk' , 'filetype__is_folder' ):
1384+ pdcbackedupfile__deleted = False ).values ('pk' , 'filetype__is_folder' ):
13601385 sfl_pks = [x ['pk' ] for x in rm .StoredFileLoc .objects .filter (sfile_id = sf ['pk' ]).values ('pk' )]
13611386 do_backup = True
13621387 for exist_job in jm .Job .objects .filter (funcname = 'create_pdc_archive' ,
0 commit comments