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