--- /dev/null
+.. MediaGoblin Documentation
+
+ Written in 2011, 2012 by MediaGoblin contributors
+
+ To the extent possible under law, the author(s) have dedicated all
+ copyright and related and neighboring rights to this software to
+ the public domain worldwide. This software is distributed without
+ any warranty.
+
+ You should have received a copy of the CC0 Public Domain
+ Dedication along with this software. If not, see
+ <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+==================
+Uploading an Image
+==================
+
+You must have fully authenticated with oauth to upload an image.
+
+The endpoint is: ``/api/user/<username>/uploads/`` (POST endpoint)
+
+There are four GET parameters available to use, if they're not specified the defaults (listed below) will be used, the parameters are:
+
++-------------+-----------+---------------------+--------------------+
+| Parameter | Required | Default | Example |
++=============+===========+=====================+====================+
+| qqfile | No | unknown | my_picture.jpg |
++-------------+-----------+---------------------+--------------------+
+| title | No | <qqfile> | My Picture! |
++-------------+-----------+---------------------+--------------------+
+| description | No | None | My awesome picture |
++-------------+-----------+---------------------+--------------------+
+| licence | No | All rights reserved | CC BY-SA 3.0 |
++-------------+-----------+---------------------+--------------------+
+
+*Note: licence is not part of the pump.io spec and is a GNU MediaGoblin specific parameter*
+
+Example URL (with parameters): /api/user/tsyesika/uploads/?qqfile=river.jpg&title=The%20River&description=The%20river%20that%20I%20use%20to%20visit%20as%20a%20child%20licence=CC%20BY-SA%203.0
+
+Submit the binary image data in the POST parameter.
+
from mediagoblin.meddleware.csrf import csrf_exempt
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"]
# 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):
""" Endpoint for file uploads """
# Wrap the data in the werkzeug file wrapper
file_data = FileStorage(
stream=io.BytesIO(request.data),
- filename=request.args.get("qqfile", "unknown.jpg"),
+ filename=request.args.get("qqfile", "unknown"),
content_type=request.headers.get("Content-Type", "application/octal-stream")
)
return json_response({"error": "Not yet implemented"}, status=400)
-#@oauth_required
+@oauth_required
@csrf_exempt
def feed(request):
""" Handles the user's outbox - /api/user/<username>/feed """
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)
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-import logging
-import base64
+import urllib
import pytest
+import mock
+
+from oauthlib.oauth1 import Client
from mediagoblin import mg_globals
-from mediagoblin.tools import template, pluginapi
from mediagoblin.tests.tools import fixture_add_user
-from .resources import GOOD_JPG, GOOD_PNG, EVIL_FILE, EVIL_JPG, EVIL_PNG, \
- BIG_BLUE
-
-
-_log = logging.getLogger(__name__)
-
+from .resources import GOOD_JPG
class TestAPI(object):
+
def setup(self):
self.db = mg_globals.database
-
- self.user_password = u'4cc355_70k3N'
- self.user = fixture_add_user(u'joapi', self.user_password,
- privileges=[u'active',u'uploader'])
-
- def login(self, test_app):
- test_app.post(
- '/auth/login/', {
- 'username': self.user.username,
- 'password': self.user_password})
-
- def get_context(self, template_name):
- return template.TEMPLATE_TEST_CONTEXT[template_name]
-
- def http_auth_headers(self):
- return {'Authorization': 'Basic {0}'.format(
- base64.b64encode(':'.join([
- self.user.username,
- self.user_password])))}
-
- def do_post(self, data, test_app, **kwargs):
- url = kwargs.pop('url', '/api/submit')
- do_follow = kwargs.pop('do_follow', False)
-
- if not 'headers' in kwargs.keys():
- kwargs['headers'] = self.http_auth_headers()
-
- response = test_app.post(url, data, **kwargs)
-
- if do_follow:
- response.follow()
-
- return response
-
- def upload_data(self, filename):
- return {'upload_files': [('file', filename)]}
-
- def test_1_test_test_view(self, test_app):
- self.login(test_app)
-
- response = test_app.get(
- '/api/test',
- headers=self.http_auth_headers())
-
- assert response.body == \
- '{"username": "joapi", "email": "joapi@example.com"}'
-
- def test_2_test_submission(self, test_app):
- self.login(test_app)
-
- response = self.do_post(
- {'title': 'Great JPG!'},
- test_app,
- **self.upload_data(GOOD_JPG))
+ self.user = fixture_add_user()
+
+ def test_profile_endpoint(self, test_app):
+ """ Test that you can successfully get the profile of a user """
+ @mock.patch("mediagoblin.decorators.oauth_required")
+ def _real_test(*args, **kwargs):
+ profile = test_app.get(
+ "/api/user/{0}/profile".format(self.user.username)
+ ).json
+
+ assert profile["preferredUsername"] == self.user.username
+ assert profile["objectType"] == "person"
+
+ _real_test()
+
+ def test_upload_file(self, test_app):
+ """ Test that i can upload a file """
+ context = {
+ "title": "Rel",
+ "description": "ayRel sunu oeru",
+ "qqfile": "my_picture.jpg",
+ }
+ encoded_context = urllib.urlencode(context)
+ response = test_app.post(
+ "/api/user/{0}/uploads?{1}".format(
+ self.user.username,
+ encoded_context[1:]
+ )
+ )
+
+ picture = self.db.MediaEntry.query.filter_by(title=context["title"])
+ picture = picture.first()
assert response.status_int == 200
+ assert picture
+ raise Exception(str(dir(picture)))
+ assert picture.description == context["description"]
+
- assert self.db.MediaEntry.query.filter_by(title=u'Great JPG!').first()
--- /dev/null
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import logging
+import base64
+
+import pytest
+
+from mediagoblin import mg_globals
+from mediagoblin.tools import template, pluginapi
+from mediagoblin.tests.tools import fixture_add_user
+from .resources import GOOD_JPG, GOOD_PNG, EVIL_FILE, EVIL_JPG, EVIL_PNG, \
+ BIG_BLUE
+
+
+_log = logging.getLogger(__name__)
+
+
+class TestAPI(object):
+ def setup(self):
+ self.db = mg_globals.database
+
+ self.user_password = u'4cc355_70k3N'
+ self.user = fixture_add_user(u'joapi', self.user_password)
+
+ def login(self, test_app):
+ test_app.post(
+ '/auth/login/', {
+ 'username': self.user.username,
+ 'password': self.user_password})
+
+ def get_context(self, template_name):
+ return template.TEMPLATE_TEST_CONTEXT[template_name]
+
+ def http_auth_headers(self):
+ return {'Authorization': 'Basic {0}'.format(
+ base64.b64encode(':'.join([
+ self.user.username,
+ self.user_password])))}
+
+ def do_post(self, data, test_app, **kwargs):
+ url = kwargs.pop('url', '/api/submit')
+ do_follow = kwargs.pop('do_follow', False)
+
+ if not 'headers' in kwargs.keys():
+ kwargs['headers'] = self.http_auth_headers()
+
+ response = test_app.post(url, data, **kwargs)
+
+ if do_follow:
+ response.follow()
+
+ return response
+
+ def upload_data(self, filename):
+ return {'upload_files': [('file', filename)]}
+
+ def test_1_test_test_view(self, test_app):
+ self.login(test_app)
+
+ response = test_app.get(
+ '/api/test',
+ headers=self.http_auth_headers())
+
+ assert response.body == \
+ '{"username": "joapi", "email": "joapi@example.com"}'
+
+ def test_2_test_submission(self, test_app):
+ self.login(test_app)
+
+ response = self.do_post(
+ {'title': 'Great JPG!'},
+ test_app,
+ **self.upload_data(GOOD_JPG))
+
+ assert response.status_int == 200
+
+ assert self.db.MediaEntry.query.filter_by(title=u'Great JPG!').first()