cleanup von abgeschlossenen jobs

This commit is contained in:
2026-05-22 09:14:31 +02:00
parent d61dbd46fd
commit 848e48b0dd
7 changed files with 689 additions and 31 deletions
@@ -0,0 +1,56 @@
"""
Management-Command für den Retention-Cleanup.
Nutzbar für:
- Dry-Run-Audits ("welche Jobs würden gelöscht werden?")
- Ad-hoc-Ausführung außerhalb des Beat-Schedules (z.B. nach DSGVO-Anfrage)
- Smoke-Test in CI
Beispiele:
docker compose exec web python manage.py cleanup_jobs --dry-run
docker compose exec web python manage.py cleanup_jobs --days 7
docker compose exec web python manage.py cleanup_jobs
"""
from __future__ import annotations
from django.core.management.base import BaseCommand, CommandError
from mailmerge.services.retention import cleanup_expired_jobs
class Command(BaseCommand):
help = "Löscht abgelaufene MailMergeJobs (Status DONE/FAILED, älter als Retention-Frist)."
def add_arguments(self, parser):
parser.add_argument(
"--days",
type=int,
default=None,
help="Überschreibt JOB_RETENTION_DAYS aus den Settings.",
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Nur Kandidaten zählen, nichts löschen.",
)
def handle(self, *args, **options):
days = options["days"]
dry_run = options["dry_run"]
try:
result = cleanup_expired_jobs(retention_days=days, dry_run=dry_run)
except ValueError as exc:
raise CommandError(str(exc)) from exc
self.stdout.write(f"Stichtag : {result.cutoff.isoformat()}")
self.stdout.write(f"Dry-Run : {result.dry_run}")
self.stdout.write(f"Kandidaten : {result.candidates}")
self.stdout.write(f"Gelöschte Jobs : {result.deleted_jobs}")
self.stdout.write(f"Gelöschte Files: {result.deleted_files}")
if result.errors:
self.stdout.write(self.style.WARNING(f"Fehler ({len(result.errors)}):"))
for err in result.errors:
self.stdout.write(self.style.WARNING(f" - {err}"))
elif not dry_run:
self.stdout.write(self.style.SUCCESS("Cleanup erfolgreich."))