Mercurial > agora
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 |
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 | 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 | 46 |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
47 @login_required |
63 | 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 | 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')) |