view apps/bundle/views.py @ 209:4033ebe1867f

Add ability to download files This makes use of a new model (BundleVersion) to keep track of the locations on disk of the original uploads for each version. This will require some manual processing to get it working for existing bundles, since the information needed isn't being stored at the moment.
author dellsystem <ilostwaldo@gmail.com>
date Sun, 17 Feb 2013 14:57:39 -0500
parents cdcbfaa65cfe
children 2a234e11185c
line wrap: on
line source

from __future__ import with_statement

import os

from django.shortcuts import get_object_or_404, render, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.views.static import serve

from apps.bundle.models import Bundle, BundleFile, BundleVersion
from apps.bundle.forms import BundleForm, BundleEditForm
from apps.bundle.tasks import handle_bundle_upload
from apps.pygments_style.models import PygmentsStyle


def detail(request, user, bundle, file=None, version=0):
    bundle = get_object_or_404(Bundle, uploader__username=user, name=bundle)
    # If the version is not set, use the latest version
    version = int(version) or bundle.latest_version
    files = bundle.bundlefile_set.filter(version=version)

    if request.user.is_authenticated():
        pygments_style = request.user.get_profile().pygments_style
    else:
        pygments_style = PygmentsStyle.objects.get(pk=1)

    context = {
        'default_style': pygments_style,
        'pygments_styles': PygmentsStyle.objects.all(),
        'bundle': bundle,
        'files': files,
        'file': file,
        'previous_versions': xrange(1, bundle.latest_version + 1),
        'this_version': version,
    }

    return render(request, 'bundle/bundle.djhtml', context)


def file_detail(request, user, bundle, version, path):
    bundle_file = get_object_or_404(BundleFile, bundle__uploader__username=user,
        bundle__name=bundle, full_path=path, is_dir=False, version=version)

    return detail(request, user, bundle, file=bundle_file, version=version)


@login_required
def index(request):
    if request.method == 'POST':
        post_data = request.POST.copy()
        post_data['uploader'] = request.user.id
        form = BundleForm(post_data, request.FILES)

        if form.is_valid():
            file = request.FILES.get('file')
            bundle = form.save()

            bundle.file_name = file.name
            bundle.save()
            bundle_path = bundle.get_temp_path()

            with open(bundle_path, 'wb+') as destination:
                for chunk in request.FILES.get('file', []):
                    destination.write(chunk)

            handle_bundle_upload.delay(bundle.id)

            return redirect(bundle)
    else:
        form = BundleForm()

    context = {
        'form': form,
        'bundles': Bundle.objects.order_by('-pub_date')[:5]
    }
    return render(request, 'bundle/index.djhtml', context)


def explore(request):
    context = {
        'recent_bundles': Bundle.objects.all()[:20]
    }

    return render(request, "bundle/explore.djhtml", context)


@login_required
def edit(request, user, bundle):
    bundle = get_object_or_404(Bundle, name=bundle,
        uploader__username=request.user.username)

    # If the username specified in the URL is someone else's, show that page
    if user != request.user.username:
        # The bundle must exist, otherwise it would 404
        return redirect(bundle)

    if request.method == 'POST':
        form = BundleEditForm(request.POST, instance=bundle)

        if form.is_valid():
            form.save()

            file = request.FILES.get('file')
            if file is not None:
                bundle.done_uploading = False
                bundle.file_name = file.name
                bundle.latest_version += 1
                bundle.save()
                bundle_path = bundle.get_temp_path()

                with open(bundle_path, 'wb+') as destination:
                    for chunk in request.FILES.get('file', []):
                        destination.write(chunk)

                handle_bundle_upload.delay(bundle.id)
            return redirect(bundle)
    else:
        form = BundleEditForm(instance=bundle)

    context = {
        'bundle': bundle,
        'form': form,
    }

    return render(request, "bundle/edit.djhtml", context)


def download(request, user, bundle, version):
    bundle = get_object_or_404(Bundle, uploader__username=user, name=bundle)
    version = int(version)

    # Look for the BundleVersion with this version
    bundle_version = get_object_or_404(BundleVersion, bundle=bundle,
        version=version)
    return serve(request, bundle_version.file_name, os.path.join('tmp',
        'bundles'))