docs: Document video resolution config.
[mediagoblin.git] / mediagoblin / submit / views.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
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 import six
18
19 from mediagoblin import messages
20 import mediagoblin.mg_globals as mg_globals
21
22 import logging
23
24 _log = logging.getLogger(__name__)
25
26 from mediagoblin.db.models import Collection
27 from mediagoblin.tools.federation import create_activity
28 from mediagoblin.tools.translate import pass_to_ugettext as _
29 from mediagoblin.tools.response import render_to_response, redirect
30 from mediagoblin.decorators import require_active_login, user_has_privilege
31 from mediagoblin.submit import forms as submit_forms
32 from mediagoblin.media_types import FileTypeNotSupported
33 from mediagoblin.submit.lib import \
34 check_file_field, submit_media, get_upload_file_limits, \
35 FileUploadLimit, UserUploadLimit, UserPastUploadLimit
36 from mediagoblin.user_pages.lib import add_media_to_collection
37
38
39 @require_active_login
40 @user_has_privilege(u'uploader')
41 def submit_start(request):
42 """
43 First view for submitting a file.
44 """
45 upload_limit, max_file_size = get_upload_file_limits(request.user)
46
47 submit_form = submit_forms.get_submit_start_form(
48 request.form,
49 license=request.user.license_preference,
50 max_file_size=max_file_size,
51 upload_limit=upload_limit,
52 uploaded=request.user.uploaded)
53 users_collections = Collection.query.filter_by(
54 actor=request.user.id,
55 type=Collection.USER_DEFINED_TYPE
56 ).order_by(Collection.title)
57
58 # Only show the Collections dropdown if the user has some
59 # collections set up
60 if users_collections.count() > 0:
61 submit_form.collection.query = users_collections
62 else:
63 del submit_form.collection
64
65 if request.method == 'POST' and submit_form.validate():
66 if not check_file_field(request, 'file'):
67 submit_form.file.errors.append(
68 _(u'You must provide a file.'))
69 else:
70 try:
71 media = submit_media(
72 mg_app=request.app, user=request.user,
73 submitted_file=request.files['file'],
74 filename=request.files['file'].filename,
75 title=six.text_type(submit_form.title.data),
76 description=six.text_type(submit_form.description.data),
77 license=six.text_type(submit_form.license.data) or None,
78 tags_string=submit_form.tags.data,
79 urlgen=request.urlgen)
80
81 if submit_form.collection and submit_form.collection.data:
82 add_media_to_collection(
83 submit_form.collection.data, media)
84 create_activity(
85 "add", media, request.user,
86 target=submit_form.collection.data)
87
88 messages.add_message(
89 request,
90 messages.SUCCESS,
91 _('Woohoo! Submitted!'))
92
93 return redirect(request, "mediagoblin.user_pages.user_home",
94 user=request.user.username)
95
96
97 # Handle upload limit issues
98 except FileUploadLimit:
99 submit_form.file.errors.append(
100 _(u'Sorry, the file size is too big.'))
101 except UserUploadLimit:
102 submit_form.file.errors.append(
103 _('Sorry, uploading this file will put you over your'
104 ' upload limit.'))
105 except UserPastUploadLimit:
106 messages.add_message(
107 request,
108 messages.WARNING,
109 _('Sorry, you have reached your upload limit.'))
110 return redirect(request, "mediagoblin.user_pages.user_home",
111 user=request.user.username)
112 except FileTypeNotSupported as e:
113 submit_form.file.errors.append(e)
114 except Exception as e:
115 raise
116
117 return render_to_response(
118 request,
119 'mediagoblin/submit/start.html',
120 {'submit_form': submit_form,
121 'app_config': mg_globals.app_config})
122
123
124 @require_active_login
125 def add_collection(request, media=None):
126 """
127 View to create a new collection
128 """
129 submit_form = submit_forms.AddCollectionForm(request.form)
130
131 if request.method == 'POST' and submit_form.validate():
132 collection = request.db.Collection()
133
134 collection.title = six.text_type(submit_form.title.data)
135 collection.description = six.text_type(submit_form.description.data)
136 collection.actor = request.user.id
137 collection.type = request.db.Collection.USER_DEFINED_TYPE
138 collection.generate_slug()
139
140 # Make sure this user isn't duplicating an existing collection
141 existing_collection = request.db.Collection.query.filter_by(
142 actor=request.user.id,
143 type=request.db.Collection.USER_DEFINED_TYPE,
144 title=collection.title).first()
145
146 if existing_collection:
147 messages.add_message(
148 request,
149 messages.ERROR,
150 _('You already have a collection called "%s"!') %
151 collection.title)
152 else:
153 collection.save()
154
155 messages.add_message(
156 request,
157 messages.SUCCESS,
158 _('Collection "%s" added!') % collection.title)
159
160 return redirect(request, "mediagoblin.user_pages.user_home",
161 user=request.user.username)
162
163 return render_to_response(
164 request,
165 'mediagoblin/submit/collection.html',
166 {'submit_form': submit_form,
167 'app_config': mg_globals.app_config})