aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/submit
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/submit')
-rw-r--r--mediagoblin/submit/forms.py52
-rw-r--r--mediagoblin/submit/lib.py14
-rw-r--r--mediagoblin/submit/views.py78
3 files changed, 104 insertions, 40 deletions
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index e9bd93fd..e2264645 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -17,30 +17,44 @@
import wtforms
+from mediagoblin import mg_globals
from mediagoblin.tools.text import tag_length_validator
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
from mediagoblin.tools.licenses import licenses_as_choices
-class SubmitStartForm(wtforms.Form):
- file = wtforms.FileField(_('File'))
- title = wtforms.TextField(
- _('Title'),
- [wtforms.validators.Length(min=0, max=500)])
- description = wtforms.TextAreaField(
- _('Description of this work'),
- description=_("""You can use
- <a href="http://daringfireball.net/projects/markdown/basics">
- Markdown</a> for formatting."""))
- tags = wtforms.TextField(
- _('Tags'),
- [tag_length_validator],
- description=_(
- "Separate tags by commas."))
- license = wtforms.SelectField(
- _('License'),
- [wtforms.validators.Optional(),],
- choices=licenses_as_choices())
+def get_submit_start_form(form, **kwargs):
+ max_file_size = kwargs.get('max_file_size')
+ desc = None
+ if max_file_size:
+ desc = _('Max file size: {0} mb'.format(max_file_size))
+
+ class SubmitStartForm(wtforms.Form):
+ file = wtforms.FileField(
+ _('File'),
+ description=desc)
+ title = wtforms.TextField(
+ _('Title'),
+ [wtforms.validators.Length(min=0, max=500)])
+ description = wtforms.TextAreaField(
+ _('Description of this work'),
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
+ tags = wtforms.TextField(
+ _('Tags'),
+ [tag_length_validator],
+ description=_(
+ "Separate tags by commas."))
+ license = wtforms.SelectField(
+ _('License'),
+ [wtforms.validators.Optional(),],
+ choices=licenses_as_choices())
+ max_file_size = wtforms.HiddenField('')
+ upload_limit = wtforms.HiddenField('')
+ uploaded = wtforms.HiddenField('')
+
+ return SubmitStartForm(form, **kwargs)
class AddCollectionForm(wtforms.Form):
title = wtforms.TextField(
diff --git a/mediagoblin/submit/lib.py b/mediagoblin/submit/lib.py
index 7e85696b..1bbf2cb8 100644
--- a/mediagoblin/submit/lib.py
+++ b/mediagoblin/submit/lib.py
@@ -21,7 +21,7 @@ from werkzeug.datastructures import FileStorage
from mediagoblin.db.models import MediaEntry
from mediagoblin.processing import mark_entry_failed
-from mediagoblin.processing.task import process_media
+from mediagoblin.processing.task import ProcessMedia
_log = logging.getLogger(__name__)
@@ -76,17 +76,21 @@ def prepare_queue_task(app, entry, filename):
return queue_file
-def run_process_media(entry, feed_url=None):
+def run_process_media(entry, feed_url=None,
+ reprocess_action="initial", reprocess_info=None):
"""Process the media asynchronously
:param entry: MediaEntry() instance to be processed.
:param feed_url: A string indicating the feed_url that the PuSH servers
should be notified of. This will be sth like: `request.urlgen(
'mediagoblin.user_pages.atom_feed',qualified=True,
- user=request.user.username)`"""
+ user=request.user.username)`
+ :param reprocess_action: What particular action should be run.
+ :param reprocess_info: A dict containing all of the necessary reprocessing
+ info for the given media_type"""
try:
- process_media.apply_async(
- [entry.id, feed_url], {},
+ ProcessMedia().apply_async(
+ [entry.id, feed_url, reprocess_action, reprocess_info], {},
task_id=entry.queued_task_id)
except BaseException as exc:
# The purpose of this section is because when running in "lazy"
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index 3f9d5b2d..7f7dee33 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -43,8 +43,28 @@ def submit_start(request):
"""
First view for submitting a file.
"""
- submit_form = submit_forms.SubmitStartForm(request.form,
- license=request.user.license_preference)
+ user = request.user
+ if user.upload_limit >= 0:
+ upload_limit = user.upload_limit
+ else:
+ upload_limit = mg_globals.app_config.get('upload_limit', None)
+
+ if upload_limit and user.uploaded >= upload_limit:
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _('Sorry, you have reached your upload limit.'))
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=request.user.username)
+
+ max_file_size = mg_globals.app_config.get('max_file_size', None)
+
+ submit_form = submit_forms.get_submit_start_form(
+ request.form,
+ license=request.user.license_preference,
+ max_file_size=max_file_size,
+ upload_limit=upload_limit,
+ uploaded=user.uploaded)
if request.method == 'POST' and submit_form.validate():
if not check_file_field(request, 'file'):
@@ -86,23 +106,49 @@ def submit_start(request):
with queue_file:
queue_file.write(request.files['file'].stream.read())
- # Save now so we have this data before kicking off processing
- entry.save()
+ # Get file size and round to 2 decimal places
+ file_size = request.app.queue_store.get_file_size(
+ entry.queued_media_file) / (1024.0 * 1024)
+ file_size = float('{0:.2f}'.format(file_size))
+
+ error = False
+
+ # Check if file size is over the limit
+ if max_file_size and file_size >= max_file_size:
+ submit_form.file.errors.append(
+ _(u'Sorry, the file size is too big.'))
+ error = True
+
+ # Check if user is over upload limit
+ if upload_limit and (user.uploaded + file_size) >= upload_limit:
+ submit_form.file.errors.append(
+ _('Sorry, uploading this file will put you over your'
+ ' upload limit.'))
+ error = True
+
+ if not error:
+ user.uploaded = user.uploaded + file_size
+ user.save()
+
+ entry.file_size = file_size
+
+ # Save now so we have this data before kicking off processing
+ entry.save()
- # Pass off to processing
- #
- # (... don't change entry after this point to avoid race
- # conditions with changes to the document via processing code)
- feed_url = request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- qualified=True, user=request.user.username)
- run_process_media(entry, feed_url)
- add_message(request, SUCCESS, _('Woohoo! Submitted!'))
+ # Pass off to processing
+ #
+ # (... don't change entry after this point to avoid race
+ # conditions with changes to the document via processing code)
+ feed_url = request.urlgen(
+ 'mediagoblin.user_pages.atom_feed',
+ qualified=True, user=request.user.username)
+ run_process_media(entry, feed_url)
+ add_message(request, SUCCESS, _('Woohoo! Submitted!'))
- add_comment_subscription(request.user, entry)
+ add_comment_subscription(request.user, entry)
- return redirect(request, "mediagoblin.user_pages.user_home",
- user=request.user.username)
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=user.username)
except Exception as e:
'''
This section is intended to catch exceptions raised in