40 lines
1.7 KiB
Python
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).')
|