view downloads/management/commands/dlwgetcat.py @ 685:a75554eb6bae

For Django 1.5: slugify is now available at django.utils.text.
author Brian Neal <bgneal@gmail.com>
date Fri, 23 Aug 2013 19:40:01 -0500
parents 161b56849114
children b59c154d0163
line wrap: on
line source
"""
dlwgetcat - a management command to produce a bash script that wgets all the
files in a given category.

"""
import os.path

from django.core.management.base import LabelCommand, CommandError
from django.template.loader import render_to_string
from django.utils.text import slugify
from django.contrib.sites.models import Site
from django.conf import settings

from downloads.models import Category, Download


class Command(LabelCommand):
    help = ("Produce on standard output a bash script that wgets all the files"
            " in a category. The files are downloaded with a slugified name.")

    args = "category-slug"

    def handle_label(self, slug, **options):
        """
        Render a template using the downloads in a given category and send it to
        stdout.

        """
        try:
            category = Category.objects.get(slug=slug)
        except Category.DoesNotExist:
            raise CommandError("category slug '%s' does not exist" % slug)

        downloads = Download.public_objects.filter(category=category).order_by(
                'title').select_related()

        # Create new destination names for the files since the uploaders often
        # give the files terrible names. The new names will be slugified
        # versions of the titles, with the same extension.

        for dl in downloads:
            ext = os.path.splitext(dl.file.name)[1]
            dl.dest_filename = slugify(dl.title) + ext

        output = render_to_string('downloads/commands/wget_cat.html', {
            'downloads': downloads,
            'domain': Site.objects.get_current().domain,
            'MEDIA_URL': settings.MEDIA_URL,
            })

        # encode it ourselves since it can fail if you try to redirect output to
        # a file and any of the content is not ASCII...
        self.stdout.write(output.encode('utf-8'))