Mercurial > agora
annotate apps/bundle/views.py @ 183:cdcbfaa65cfe
Catch integrity error when creating bundles
If the user has already created a bundle with that name, then the form
should raise a ValidationError instead of showing a 500.
author | dellsystem <ilostwaldo@gmail.com> |
---|---|
date | Sat, 27 Oct 2012 15:41:58 -0400 |
parents | 86129d185ddb |
children | a4f88ac85837 4033ebe1867f |
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 |
4
069cabdaf8b2
Define stub template and admin site
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
2
diff
changeset
|
8 |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
9 from apps.bundle.models import Bundle, BundleFile |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
10 from apps.bundle.forms import BundleForm, BundleEditForm |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
11 from apps.bundle.tasks import handle_bundle_upload |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
12 from apps.pygments_style.models import PygmentsStyle |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
13 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
14 |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
15 def detail(request, user, bundle, file=None, version=0): |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
16 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
|
17 # If the version is not set, use the latest version |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
18 version = int(version) or bundle.latest_version |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
19 files = bundle.bundlefile_set.filter(version=version) |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
20 |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
21 if request.user.is_authenticated(): |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
22 pygments_style = request.user.get_profile().pygments_style |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
23 else: |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
24 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
|
25 |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
26 context = { |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
27 'default_style': pygments_style, |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
28 'pygments_styles': PygmentsStyle.objects.all(), |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
29 'bundle': bundle, |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
30 'files': files, |
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
31 'file': file, |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
32 'previous_versions': xrange(1, bundle.latest_version + 1), |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
33 'this_version': version, |
151
c7be7def8b57
Bundles! (basic functionality)
dellsystem <ilostwaldo@gmail.com>
parents:
63
diff
changeset
|
34 } |
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 return render(request, 'bundle/bundle.djhtml', context) |
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 |
177
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
39 def file_detail(request, user, bundle, version, path): |
86129d185ddb
Add versioning to bundles
dellsystem <ilostwaldo@gmail.com>
parents:
170
diff
changeset
|
40 print version |
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) |