diff --git a/beat/web/experiments/admin.py b/beat/web/experiments/admin.py index e64e65849ff17e206a974c4a880654309ff80832..ba46d70cd028712961a87ba4cc9d05c567aaef74 100755 --- a/beat/web/experiments/admin.py +++ b/beat/web/experiments/admin.py @@ -520,6 +520,39 @@ admin.site.register(ResultModel, Result) #---------------------------------------------------------- +def delete_file_on_fs(modeladmin, request, queryset): + ''' + Delete the files contained in the cache + ''' + + for obj in queryset: + obj.delete_files() + + +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 = [ @@ -543,10 +576,18 @@ class CachedFile(admin.ModelAdmin): # to avoid very slow loading of cached files raw_id_fields = ('blocks',) + actions = [delete_file_on_fs, cascading_delete_file_on_fs] + def get_queryset(self, request): qs = super(CachedFile, self).get_queryset(request) return qs.annotate(date=Max('blocks__start_date')) + def get_actions(self, request): + actions = super(CachedFile, self).get_actions(request) + if 'delete_selected' in actions: + del actions['delete_selected'] + return actions + def date(self, obj): return obj.date diff --git a/beat/web/experiments/models/cached_file.py b/beat/web/experiments/models/cached_file.py index 856407bfdab06336fe27900a3e8448f3816e51fe..13ad9a240ac6e54d1aef8e9533f123d5552e955a 100755 --- a/beat/web/experiments/models/cached_file.py +++ b/beat/web/experiments/models/cached_file.py @@ -177,3 +177,14 @@ class CachedFile(models.Model): return False return True + + + def delete_files(self, cache=settings.CACHE_ROOT): + ''' + Delete the files contained in this cache + ''' + files = self.files() + for file in files: + os.remove(file) + self.status = CachedFile.NOT_CACHED + self.save()