Mercurial > public > sg101
view downloads/management/commands/dlorphan.py @ 665:86d04190ff4e
For issue #43, create mgmt. command to cleanup orphan downloads.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Fri, 24 May 2013 23:42:49 -0500 |
parents | |
children | 264b08bce8b8 |
line wrap: on
line source
"""dlorphan - a management command to remove orphaned downloads files.""" from optparse import make_option import os from django.core.management.base import NoArgsCommand from django.conf import settings from downloads.models import Download, PendingDownload class Command(NoArgsCommand): help = "Finds and optionally deletes orphan downloads files" option_list = NoArgsCommand.option_list + ( make_option('--delete', action='store_true', dest='delete', default=False, help='Delete orphan files'), ) def handle_noargs(self, **options): """Find and optionally delete orphan downloads files.""" delete = options.get('delete', False) orphans = set() missing_pending = [] missing_dls = [] empty_dirs = [] dls_dir = os.path.join(settings.MEDIA_ROOT, 'downloads') # find the set of all files in the downloads area for root, dirs, files in os.walk(dls_dir, followlinks=True): for name in files: orphans.add(unicode(os.path.join(root, name), 'utf-8')) # check for empty directories if not len(dirs) and not len(files): empty_dirs.append(root) # examine the pending downloads: for dl in PendingDownload.objects.iterator(): try: orphans.remove(dl.file.path) except KeyError: missing_pending.append(dl) # examine the downloads: for dl in Download.objects.iterator(): try: orphans.remove(dl.file.path) except KeyError: missing_dls.append(dl) if orphans: print "Orphan files:" for orphan in orphans: print orphan if empty_dirs: print "Empty directories:" for d in empty_dirs: print d if missing_pending: print "PendingDownloads with missing files:" for dl in missing_pending: print dl if missing_dls: print "Downloads with missing files:" for dl in missing_dls: print dl if delete: for path in orphans: print "Deleting: {}".format(path) os.remove(path) for path in empty_dirs: print "Deleting: {}".format(path) os.removedirs(path)