feat: Add media cleanup functionality with UI and backend support for unused media management

This commit is contained in:
Ross
2026-05-11 12:58:41 +01:00
parent c3131564e6
commit 8da8f27433
7 changed files with 392 additions and 3 deletions
+96
View File
@@ -0,0 +1,96 @@
{% extends 'base.html' %}
{% block content %}
<div class="container-fluid py-4">
<div class="d-flex flex-wrap justify-content-between align-items-start gap-3 mb-4">
<div>
<h2 class="mb-1">Unused Media Cleanup</h2>
<p class="text-muted mb-0">
Run django-unused-media from the web UI to preview or remove orphaned files.
</p>
</div>
<a href="{% url 'logs_view' %}" class="btn btn-outline-secondary btn-sm">
<i class="bi bi-journal-text me-1"></i> View logs
</a>
</div>
<div class="card border-0 shadow-sm mb-4">
<div class="card-body">
<form
method="post"
hx-post="{% url 'media_cleanup' %}"
hx-target="#media-cleanup-result"
hx-swap="innerHTML"
class="row g-3"
>
{% csrf_token %}
<div class="col-12 col-lg-4">
<label for="id_minimum_file_age" class="form-label">Minimum file age (seconds)</label>
<input
id="id_minimum_file_age"
type="number"
min="0"
step="1"
name="minimum_file_age"
class="form-control"
value="{{ minimum_file_age|default:60 }}"
>
<div class="form-text">Skip very recent files to avoid race conditions with active uploads.</div>
</div>
<div class="col-12 col-lg-8">
<label for="id_exclude" class="form-label">Exclude masks (one per line)</label>
<textarea
id="id_exclude"
name="exclude"
rows="4"
class="form-control"
placeholder="example: thumbnails/*"
>{{ exclude }}</textarea>
<div class="form-text">Uses django-unused-media wildcard matching.</div>
</div>
<div class="col-12">
<div class="form-check">
<input
id="id_remove_empty_dirs"
type="checkbox"
class="form-check-input"
name="remove_empty_dirs"
{% if remove_empty_dirs %}checked{% endif %}
>
<label for="id_remove_empty_dirs" class="form-check-label">
Remove empty directories after cleanup
</label>
</div>
</div>
<div class="col-12 d-flex flex-wrap gap-2">
<button
type="submit"
name="action"
value="preview"
class="btn btn-primary"
>
<i class="bi bi-search me-1"></i> Preview unused files
</button>
<button
type="submit"
name="action"
value="cleanup"
class="btn btn-danger"
hx-confirm="Delete unused media files now? This cannot be undone."
>
<i class="bi bi-trash me-1"></i> Delete unused files
</button>
</div>
</form>
</div>
</div>
<div id="media-cleanup-result">
{% include 'rad/partials/_media_cleanup_result.html' %}
</div>
</div>
{% endblock %}