Update all the views so that they use the uploader reference instead
[mediagoblin.git] / mediagoblin / submit / views.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011 Free Software Foundation, Inc
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 from os.path import splitext
18 from cgi import FieldStorage
19
20 from webob import Response, exc
21 from werkzeug.utils import secure_filename
22
23 from mediagoblin.decorators import require_active_login
24 from mediagoblin.submit import forms as submit_forms
25 from mediagoblin.process_media import process_media_initial
26
27
28 @require_active_login
29 def submit_start(request):
30 """
31 First view for submitting a file.
32 """
33 submit_form = submit_forms.SubmitStartForm(request.POST)
34
35 if request.method == 'POST' and submit_form.validate():
36 if not (request.POST.has_key('file')
37 and isinstance(request.POST['file'], FieldStorage)
38 and request.POST['file'].file):
39 submit_form.file.errors.append(
40 u'You must provide a file.')
41 else:
42 filename = request.POST['file'].filename
43
44 # create entry and save in database
45 entry = request.db.MediaEntry()
46 entry['title'] = request.POST['title'] or unicode(splitext(filename)[0])
47 entry['description'] = request.POST.get('description')
48 entry['media_type'] = u'image' # heh
49 entry['uploader'] = request.user['_id']
50
51 # Save, just so we can get the entry id for the sake of using
52 # it to generate the file path
53 entry.save(validate=False)
54
55 # Generate a slug from the title
56 entry.generate_slug()
57
58 # Now store generate the queueing related filename
59 queue_filepath = request.app.queue_store.get_unique_filepath(
60 ['media_entries',
61 unicode(entry['_id']),
62 secure_filename(filename)])
63
64 # queue appropriately
65 queue_file = request.app.queue_store.get_file(
66 queue_filepath, 'wb')
67
68 with queue_file:
69 queue_file.write(request.POST['file'].file.read())
70
71 # Add queued filename to the entry
72 entry['queued_media_file'] = queue_filepath
73 entry.save(validate=True)
74
75 # queue it for processing
76 process_media_initial.delay(unicode(entry['_id']))
77
78 # redirect
79 return exc.HTTPFound(
80 location=request.urlgen("mediagoblin.submit.success"))
81
82 # render
83 template = request.template_env.get_template(
84 'mediagoblin/submit/start.html')
85 return Response(
86 template.render(
87 {'request': request,
88 'submit_form': submit_form}))
89
90
91 def submit_success(request):
92 # render
93 template = request.template_env.get_template(
94 'mediagoblin/submit/success.html')
95 return Response(
96 template.render(
97 {'request': request}))