view apps/bundle/views.py @ 211:2a234e11185c

Merge in Wendy's changes
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Wed, 21 Aug 2013 14:43:48 -0400
parents 4033ebe1867f a4f88ac85837
children
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,
        'show': True,
    }

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