Fix problem where feed posting wasn't returning correct object
[mediagoblin.git] / mediagoblin / federation / views.py
index bdc93d9b48856d18667207a79b7d332466cb997f..1e8c3e14bd4238ed5b71707707af3bdb540c91da 100644 (file)
@@ -1,23 +1,23 @@
+
 import json
 import io
+import mimetypes
 
-from werkzeug.datastructures import FileStorage 
+from werkzeug.datastructures import FileStorage
 
 from mediagoblin.media_types import sniff_media
 from mediagoblin.decorators import oauth_required
 from mediagoblin.db.models import User, MediaEntry, MediaComment
 from mediagoblin.tools.response import redirect, json_response
 from mediagoblin.meddleware.csrf import csrf_exempt
-from mediagoblin.notifications import add_comment_subscription
-from mediagoblin.submit.lib import (new_upload_entry, prepare_queue_task,
-                                    run_process_media)
+from mediagoblin.submit.lib import new_upload_entry
 
-#@oauth_required
+@oauth_required
 def profile(request, raw=False):
     """ This is /api/user/<username>/profile - This will give profile info """
     user = request.matchdict["username"]
     requested_user = User.query.filter_by(username=user)
-    
+
     # check if the user exists
     if requested_user is None:
         error = "No such 'user' with id '{0}'".format(user)
@@ -31,6 +31,7 @@ def profile(request, raw=False):
     # user profiles are public so return information
     return json_response(user.serialize(request))
 
+@oauth_required
 def user(request):
     """ This is /api/user/<username> - This will get the user """
     user, user_profile = profile(request, raw=True)
@@ -43,10 +44,10 @@ def user(request):
 
     return json_response(data)
 
-#@oauth_required
+@oauth_required
 @csrf_exempt
 def uploads(request):
-    """ This is the endpoint which uploads can be sent to - /api/user/<username>/uploads """
+    """ Endpoint for file uploads """
     user = request.matchdict["username"]
     requested_user = User.query.filter_by(username=user)
 
@@ -57,23 +58,26 @@ def uploads(request):
     request.user = requested_user[0]
     if request.method == "POST":
         # Wrap the data in the werkzeug file wrapper
+        mimetype = request.headers.get("Content-Type", "application/octal-stream")
+        filename = mimetypes.guess_all_extensions(mimetype)
+        filename = 'unknown' + filename[0] if filename else filename
         file_data = FileStorage(
             stream=io.BytesIO(request.data),
-            filename=request.args.get("qqfile", "unknown.jpg"),
+            filename=filename,
             content_type=request.headers.get("Content-Type", "application/octal-stream")
         )
 
         # Find media manager
-        media_type, media_manager = sniff_media(file_data)
+        media_type, media_manager = sniff_media(file_data, filename)
         entry = new_upload_entry(request.user)
         if hasattr(media_manager, "api_upload_request"):
             return media_manager.api_upload_request(request, file_data, entry)
         else:
-            return json_response({"error": "Not yet implemented"}, status=400)
+            return json_response({"error": "Not yet implemented"}, status=501)
 
-    return json_response({"error": "Not yet implemented"}, status=400)
+    return json_response({"error": "Not yet implemented"}, status=501)
 
-#@oauth_required
+@oauth_required
 @csrf_exempt
 def feed(request):
     """ Handles the user's outbox - /api/user/<username>/feed """
@@ -93,11 +97,10 @@ def feed(request):
         if obj is None:
             error = {"error": "Could not find 'object' element."}
             return json_response(error, status=400)
-  
+
         if obj.get("objectType", None) == "comment":
             # post a comment
             media = int(data["object"]["inReplyTo"]["id"])
-            author = request.user
             comment = MediaComment(
                 media_entry=media,
                 author=request.user.id,
@@ -111,14 +114,17 @@ def feed(request):
             # Posting an image to the feed
             # NB: This is currently just handing the image back until we have an
             #     to send the image to the actual feed
+
             media_id = int(data["object"]["id"])
             media = MediaEntry.query.filter_by(id=media_id)
             if media is None:
                 error = "No such 'image' with id '{0}'".format(id=media_id)
                 return json_response(error, status=404)
             media = media[0]
-            return json_response(media.serialize(request))
+            return json_response({
+                "verb": "post",
+                "object": media.serialize(request)
+            })
 
         elif obj.get("objectType", None) is None:
             # They need to tell us what type of object they're giving us.
@@ -126,7 +132,11 @@ def feed(request):
             return json_response(error, status=400)
         else:
             # Oh no! We don't know about this type of object (yet)
-            error = {"error": "Unknown object type '{0}'.".format(obj.get("objectType", None))}
+            error_message = "Unknown object type '{0}'.".format(
+                obj.get("objectType", None)
+            )
+
+            error = {"error": error_message}
             return json_response(error, status=400)
 
 
@@ -137,7 +147,10 @@ def feed(request):
             )
 
     feed = {
-        "displayName": "Activities by {0}@{1}".format(request.user.username, request.host),
+        "displayName": "Activities by {user}@{host}".format(
+            user=request.user.username,
+            host=request.host
+        ),
         "objectTypes": ["activity"],
         "url": feed_url,
         "links": {
@@ -157,7 +170,7 @@ def feed(request):
         "author": request.user.serialize(request),
         "items": [],
     }
-    
+
 
     # Now lookup the user's feed.
     for media in MediaEntry.query.all():
@@ -176,18 +189,13 @@ def feed(request):
     return json_response(feed)
 
 @oauth_required
-def inbox(request):
-    """ Handles the user's inbox - /api/user/<username>/inbox """
-    raise NotImplemented("Yet to implement looking up user's inbox")
-
-#@oauth_required
 def object(request, raw_obj=False):
     """ Lookup for a object type """
     objectType = request.matchdict["objectType"]
     uuid = request.matchdict["uuid"]
     if objectType not in ["image"]:
         error = "Unknown type: {0}".format(objectType)
-        # not sure why this is 404, maybe ask evan. Maybe 400? 
+        # not sure why this is 404, maybe ask evan. Maybe 400?
         return json_response({"error": error}, status=404)
 
     media = MediaEntry.query.filter_by(slug=uuid).first()
@@ -201,6 +209,7 @@ def object(request, raw_obj=False):
 
     return json_response(media.serialize(request))
 
+@oauth_required
 def object_comments(request):
     """ Looks up for the comments on a object """
     media = object(request, raw_obj=True)
@@ -232,7 +241,7 @@ def object_comments(request):
 def host_meta(request):
     """ This is /.well-known/host-meta - provides URL's to resources on server """
     links = []
-    
+
     # Client registration links
     links.append({
         "ref": "registration_endpoint",