"""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).')