+
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)
# 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)
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)
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 """
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,
# 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.
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)
)
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": {
"author": request.user.serialize(request),
"items": [],
}
-
+
# Now lookup the user's feed.
for media in MediaEntry.query.all():
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()
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)
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",