From 8ec966192da8c067aef893d3fc4a047d73f17354 Mon Sep 17 00:00:00 2001
From: Samuel Gaist <samuel.gaist@idiap.ch>
Date: Mon, 26 Feb 2018 14:33:29 +0100
Subject: [PATCH] [web][experiment][admin] Added action to delete all cached
 files related to selected cache

This will go through all results and inputs of all experiments
that are using this cache.
---
 beat/web/experiments/admin.py | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/beat/web/experiments/admin.py b/beat/web/experiments/admin.py
index 3a811ac11..ba46d70cd 100755
--- a/beat/web/experiments/admin.py
+++ b/beat/web/experiments/admin.py
@@ -532,6 +532,27 @@ def delete_file_on_fs(modeladmin, request, queryset):
 delete_file_on_fs.short_description = 'Delete files from the cache'
 
 
+def cascading_delete_file_on_fs(modeladmin, request, queryset):
+    '''
+    Delete the files contained in the cache
+    '''
+
+    for obj in queryset:
+        for block in obj.blocks.all():
+            experiment = block.experiment
+            for exp_block in experiment.blocks.all():
+                for result in exp_block.results.all():
+                    if result.cache is not None:
+                        result.cache.delete_files()
+                for input_ in exp_block.inputs.all():
+                    if input_.cache is not None:
+                        input_.cache.delete_files()
+
+
+cascading_delete_file_on_fs.short_description = 'Delete files from the ' \
+                                                'selected and related caches'
+
+
 class CachedFile(admin.ModelAdmin):
 
     search_fields = [
@@ -555,7 +576,7 @@ class CachedFile(admin.ModelAdmin):
     # to avoid very slow loading of cached files
     raw_id_fields = ('blocks',)
 
-    actions = [delete_file_on_fs]
+    actions = [delete_file_on_fs, cascading_delete_file_on_fs]
 
     def get_queryset(self, request):
         qs = super(CachedFile, self).get_queryset(request)
-- 
GitLab