Making the API make use of the new submit tooling.
[mediagoblin.git] / mediagoblin / plugins / api / views.py
index b7e74799883e1fabd1fd5942b6c724da5142790b..69fae7bbbb8288e285657e774db1b6898fe784af 100644 (file)
 import json
 import logging
 
-from os.path import splitext
-from werkzeug.exceptions import BadRequest, Forbidden
+from werkzeug.exceptions import BadRequest
 from werkzeug.wrappers import Response
 
+from mediagoblin.tools.translate import pass_to_ugettext as _
 from mediagoblin.tools.response import json_response
 from mediagoblin.decorators import require_active_login
 from mediagoblin.meddleware.csrf import csrf_exempt
-from mediagoblin.media_types import sniff_media
+from mediagoblin.media_types import \
+    InvalidFileType, FileTypeNotSupported
 from mediagoblin.plugins.api.tools import api_auth, get_entry_serializable
-from mediagoblin.submit.lib import check_file_field, prepare_queue_task, \
-    run_process_media, new_upload_entry
+from mediagoblin.submit.lib import \
+    check_file_field, submit_media, get_upload_file_limits, \
+    FileUploadLimit, UserUploadLimit, UserPastUploadLimit
 
 _log = logging.getLogger(__name__)
 
@@ -49,45 +51,46 @@ def post_entry(request):
         _log.debug('File field not found')
         raise BadRequest()
 
-    media_file = request.files['file']
-
-    media_type, media_manager = sniff_media(media_file)
-
-    entry = new_upload_entry(request.user)
-    entry.media_type = unicode(media_type)
-    entry.title = unicode(request.form.get('title')
-            or splitext(media_file.filename)[0])
-
-    entry.description = unicode(request.form.get('description'))
-    entry.license = unicode(request.form.get('license', ''))
-
-    entry.generate_slug()
-
-    # queue appropriately
-    queue_file = prepare_queue_task(request.app, entry, media_file.filename)
-
-    with queue_file:
-        queue_file.write(request.files['file'].stream.read())
-
-    # Save now so we have this data before kicking off processing
-    entry.save()
-
-    if request.form.get('callback_url'):
-        metadata = request.db.ProcessingMetaData()
-        metadata.media_entry = entry
-        metadata.callback_url = unicode(request.form['callback_url'])
-        metadata.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)
-
-    return json_response(get_entry_serializable(entry, request.urlgen))
+    upload_limit, max_file_size = get_upload_file_limits(request.user)
+
+    callback_url = request.form.get('callback_url')
+    if callback_url:
+        callback_url = unicode(callback_url)
+    try:
+        entry = submit_media(
+            mg_app=request.app, user=request.user,
+            submitted_file=request.files['file'],
+            filename=request.files['file'].filename,
+            title=unicode(request.form.get('title')),
+            description=unicode(request.form.get('description')),
+            license=unicode(request.form.get('license', '')),
+            upload_limit=upload_limit, max_file_size=max_file_size,
+            callback_url=callback_url)
+
+        return json_response(get_entry_serializable(entry, request.urlgen))
+
+    # Handle upload limit issues
+    except FileUploadLimit:
+        raise BadRequest(
+            _(u'Sorry, the file size is too big.'))
+    except UserUploadLimit:
+        raise BadRequest(
+            _('Sorry, uploading this file will put you over your'
+              ' upload limit.'))
+    except UserPastUploadLimit:
+        raise BadRequest(
+            _('Sorry, you have reached your upload limit.'))
+
+    except Exception as e:
+        '''
+        This section is intended to catch exceptions raised in
+        mediagoblin.media_types
+        '''
+        if isinstance(e, InvalidFileType) or \
+                isinstance(e, FileTypeNotSupported):
+            raise BadRequest(unicode(e))
+        else:
+            raise
 
 
 @api_auth