annotate 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
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,
190
a4f88ac85837 Changes: Now guest users cannot see revision history and they also cannot see snippets posted by registered users. To see snippets posted by registered users, one has to login.
ahsanalishahid <ahsan.ali.shahid@gmail.com>
parents: 183
diff changeset
35 'show': True,
151
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
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
38 return render(request, 'bundle/bundle.djhtml', context)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
39
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
40
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
41 def file_detail(request, user, bundle, version, path):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
42 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
43 bundle__name=bundle, full_path=path, is_dir=False, version=version)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
44
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
45 return detail(request, user, bundle, file=bundle_file, version=version)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
46
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
47
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
48 @login_required
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
49 def index(request):
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
50 if request.method == 'POST':
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
51 post_data = request.POST.copy()
183
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
52 post_data['uploader'] = request.user.id
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
53 form = BundleForm(post_data, request.FILES)
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
54
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
55 if form.is_valid():
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
56 file = request.FILES.get('file')
183
cdcbfaa65cfe Catch integrity error when creating bundles
dellsystem <ilostwaldo@gmail.com>
parents: 177
diff changeset
57 bundle = form.save()
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
58
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
59 bundle.file_name = file.name
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
60 bundle.save()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
61 bundle_path = bundle.get_temp_path()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
62
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
63 with open(bundle_path, 'wb+') as destination:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
64 for chunk in request.FILES.get('file', []):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
65 destination.write(chunk)
63
d5ebcf4a249f Added some urls for the bundle links, and a template
Rettaw
parents: 37
diff changeset
66
151
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
67 handle_bundle_upload.delay(bundle.id)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
68
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
69 return redirect(bundle)
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
70 else:
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
71 form = BundleForm()
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
72
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
73 context = {
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
74 'form': form,
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
75 'bundles': Bundle.objects.order_by('-pub_date')[:5]
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
76 }
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
77 return render(request, 'bundle/index.djhtml', context)
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
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
80 def explore(request):
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
81 context = {
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
82 'recent_bundles': Bundle.objects.all()[:20]
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
83 }
c7be7def8b57 Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents: 63
diff changeset
84
177
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
85 return render(request, "bundle/explore.djhtml", context)
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
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
88 @login_required
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
89 def edit(request, user, bundle):
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
90 bundle = get_object_or_404(Bundle, name=bundle,
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
91 uploader__username=request.user.username)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
92
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
93 # 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
94 if user != request.user.username:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
95 # The bundle must exist, otherwise it would 404
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
96 return redirect(bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
97
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
98 if request.method == 'POST':
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
99 form = BundleEditForm(request.POST, instance=bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
100
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
101 if form.is_valid():
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
102 form.save()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
103
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
104 file = request.FILES.get('file')
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
105 if file is not None:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
106 bundle.done_uploading = False
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
107 bundle.file_name = file.name
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
108 bundle.latest_version += 1
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
109 bundle.save()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
110 bundle_path = bundle.get_temp_path()
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
111
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
112 with open(bundle_path, 'wb+') as destination:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
113 for chunk in request.FILES.get('file', []):
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
114 destination.write(chunk)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
115
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
116 handle_bundle_upload.delay(bundle.id)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
117 return redirect(bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
118 else:
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
119 form = BundleEditForm(instance=bundle)
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
120
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
121 context = {
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
122 'bundle': bundle,
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
123 'form': form,
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
86129d185ddb Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents: 170
diff changeset
126 return render(request, "bundle/edit.djhtml", context)
209
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
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
129 def download(request, user, bundle, version):
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
130 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
131 version = int(version)
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
132
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
133 # Look for the BundleVersion with this version
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
134 bundle_version = get_object_or_404(BundleVersion, bundle=bundle,
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
135 version=version)
4033ebe1867f Add ability to download files
dellsystem <ilostwaldo@gmail.com>
parents: 183
diff changeset
136 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
137 'bundles'))