Louis Mazin d94a36d9a7 parfait
2026-10-14 18:09:57 +02:00

40 lines
1.7 KiB
Python

"""Purge items trashed at least 5 days ago (run by the server hourly)."""
from datetime import timedelta
from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
from drive.models import DriveItem
from drive.trash_cleanup import delete_trashed_item, has_active_uploads_in_tree
class Command(BaseCommand):
help = 'Supprime définitivement les éléments dans la corbeille depuis 5 jours.'
def add_arguments(self, parser):
parser.add_argument('--days', type=int, default=5)
parser.add_argument('--dry-run', action='store_true')
def handle(self, *args, **options):
days = options['days']
if days < 1:
raise CommandError('Le délai doit être supérieur ou égal à 1 jour.')
limit = timezone.now() - timedelta(days=days)
purged = skipped = 0
# Fetch IDs first: cascading parent deletion can remove children.
ids = list(DriveItem.objects.filter(trashed_at__lte=limit).order_by('trashed_at').values_list('pk', flat=True))
for pk in ids:
item = DriveItem.objects.filter(pk=pk).select_related('space','parent').first()
if item is None:
continue
try:
if has_active_uploads_in_tree(item):
skipped += 1
continue
if not options['dry_run']:
delete_trashed_item(item)
purged += 1
except (OSError, ValueError) as exc:
skipped += 1
self.stderr.write(f'Élément {pk} conservé : {exc}')
verb = 'à supprimer' if options['dry_run'] else 'supprimé(s)'
self.stdout.write(f'{purged} élément(s) {verb}, {skipped} ignoré(s).')