annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
167
d31b236ed5cf Okay, I think I caught all the with statements now...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 151
diff changeset
1 from __future__ import with_statement
d31b236ed5cf Okay, I think I caught all the with statements now...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 151
diff changeset
2
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
3 import os
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
4
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
5 from django.shortcuts import get_object_or_404, render, redirect
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
6 from django.contrib.auth.decorators import login_required
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
7 from django.http import HttpResponse
209
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
8 from django.views.static import serve
4
069cabdaf8b2 Define stub template and admin site
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 2
diff changeset
9
209
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
10 from apps.bundle.models import Bundle, BundleFile, BundleVersion
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
11 from apps.bundle.forms import BundleForm, BundleEditForm
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
12 from apps.bundle.tasks import handle_bundle_upload
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
13 from apps.pygments_style.models import PygmentsStyle
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
14
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
15
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
16 def detail(request, user, bundle, file=None, version=0):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
17 bundle = get_object_or_404(Bundle, uploader__username=user, name=bundle)
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
18 # If the version is not set, use the latest version
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
19 version = int(version) or bundle.latest_version
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
20 files = bundle.bundlefile_set.filter(version=version)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
21
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
22 if request.user.is_authenticated():
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
23 pygments_style = request.user.get_profile().pygments_style
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
24 else:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
25 pygments_style = PygmentsStyle.objects.get(pk=1)
6
c83460992637 Elaborate on stub bundle template
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 4
diff changeset
26
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
27 context = {
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
28 'default_style': pygments_style,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
29 'pygments_styles': PygmentsStyle.objects.all(),
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
30 'bundle': bundle,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
31 'files': files,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
32 'file': file,
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
33 'previous_versions': xrange(1, bundle.latest_version + 1),
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
34 'this_version': version,
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
35 }
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
36
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
37 return render(request, 'bundle/bundle.djhtml', context)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
38
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
39
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
40 def file_detail(request, user, bundle, version, path):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
41 bundle_file = get_object_or_404(BundleFile, bundle__uploader__username=user,
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
42 bundle__name=bundle, full_path=path, is_dir=False, version=version)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
43
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
44 return detail(request, user, bundle, file=bundle_file, version=version)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
45
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
46
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
47 @login_required
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
48 def index(request):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
49 if request.method == 'POST':
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
50 post_data = request.POST.copy()
183
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
51 post_data['uploader'] = request.user.id
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
52 form = BundleForm(post_data, request.FILES)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
53
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
54 if form.is_valid():
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
55 file = request.FILES.get('file')
183
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
56 bundle = form.save()
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
57
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
58 bundle.file_name = file.name
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
59 bundle.save()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
60 bundle_path = bundle.get_temp_path()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
61
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
62 with open(bundle_path, 'wb+') as destination:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
63 for chunk in request.FILES.get('file', []):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
64 destination.write(chunk)
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
65
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
66 handle_bundle_upload.delay(bundle.id)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
67
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
68 return redirect(bundle)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
69 else:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
70 form = BundleForm()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
71
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
72 context = {
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
73 'form': form,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
74 'bundles': Bundle.objects.order_by('-pub_date')[:5]
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
75 }
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
76 return render(request, 'bundle/index.djhtml', context)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
77
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
78
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
79 def explore(request):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
80 context = {
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
81 'recent_bundles': Bundle.objects.all()[:20]
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
82 }
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
83
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
84 return render(request, "bundle/explore.djhtml", context)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
85
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
86
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
87 @login_required
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
88 def edit(request, user, bundle):
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
89 bundle = get_object_or_404(Bundle, name=bundle,
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
90 uploader__username=request.user.username)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
91
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
92 # If the username specified in the URL is someone else's, show that page
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
93 if user != request.user.username:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
94 # The bundle must exist, otherwise it would 404
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
95 return redirect(bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
96
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
97 if request.method == 'POST':
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
98 form = BundleEditForm(request.POST, instance=bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
99
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
100 if form.is_valid():
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
101 form.save()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
102
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
103 file = request.FILES.get('file')
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
104 if file is not None:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
105 bundle.done_uploading = False
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
106 bundle.file_name = file.name
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
107 bundle.latest_version += 1
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
108 bundle.save()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
109 bundle_path = bundle.get_temp_path()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
110
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
111 with open(bundle_path, 'wb+') as destination:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
112 for chunk in request.FILES.get('file', []):
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
113 destination.write(chunk)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
114
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
115 handle_bundle_upload.delay(bundle.id)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
116 return redirect(bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
117 else:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
118 form = BundleEditForm(instance=bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
119
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
120 context = {
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
121 'bundle': bundle,
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
122 'form': form,
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
123 }
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
124
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
125 return render(request, "bundle/edit.djhtml", context)
209
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
126
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
127
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
128 def download(request, user, bundle, version):
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
129 bundle = get_object_or_404(Bundle, uploader__username=user, name=bundle)
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
130 version = int(version)
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
131
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
132 # Look for the BundleVersion with this version
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
133 bundle_version = get_object_or_404(BundleVersion, bundle=bundle,
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
134 version=version)
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
135 return serve(request, bundle_version.file_name, os.path.join('tmp',
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
136 'bundles'))