gist_api.py
225 lines
| 6.9 KiB
| text/x-python
|
PythonLexer
r1 | # -*- coding: utf-8 -*- | ||
# Copyright (C) 2011-2016 RhodeCode GmbH | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU Affero General Public License, version 3 | |||
# (only), as published by the Free Software Foundation. | |||
# | |||
# 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 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/>. | |||
# | |||
# This program is dual-licensed. If you wish to learn more about the | |||
# RhodeCode Enterprise Edition, including its added features, Support services, | |||
# and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
import logging | |||
import time | |||
from rhodecode.api import jsonrpc_method, JSONRPCError | |||
from rhodecode.api.utils import ( | |||
Optional, OAttr, get_gist_or_error, get_user_or_error, | |||
has_superadmin_permission) | |||
from rhodecode.model.db import Session, or_ | |||
from rhodecode.model.gist import Gist, GistModel | |||
log = logging.getLogger(__name__) | |||
@jsonrpc_method() | |||
def get_gist(request, apiuser, gistid, content=Optional(False)): | |||
""" | |||
Get the specified gist, based on the gist ID. | |||
:param apiuser: This is filled automatically from the |authtoken|. | |||
:type apiuser: AuthUser | |||
:param gistid: Set the id of the private or public gist | |||
:type gistid: str | |||
:param content: Return the gist content. Default is false. | |||
:type content: Optional(bool) | |||
""" | |||
gist = get_gist_or_error(gistid) | |||
content = Optional.extract(content) | |||
if not has_superadmin_permission(apiuser): | |||
if gist.gist_owner != apiuser.user_id: | |||
raise JSONRPCError('gist `%s` does not exist' % (gistid,)) | |||
data = gist.get_api_data() | |||
if content: | |||
from rhodecode.model.gist import GistModel | |||
rev, gist_files = GistModel().get_gist_files(gistid) | |||
data['content'] = dict([(x.path, x.content) for x in gist_files]) | |||
return data | |||
@jsonrpc_method() | |||
def get_gists(request, apiuser, userid=Optional(OAttr('apiuser'))): | |||
""" | |||
Get all gists for given user. If userid is empty returned gists | |||
are for user who called the api | |||
:param apiuser: This is filled automatically from the |authtoken|. | |||
:type apiuser: AuthUser | |||
:param userid: user to get gists for | |||
:type userid: Optional(str or int) | |||
""" | |||
if not has_superadmin_permission(apiuser): | |||
# make sure normal user does not pass someone else userid, | |||
# he is not allowed to do that | |||
if not isinstance(userid, Optional) and userid != apiuser.user_id: | |||
raise JSONRPCError( | |||
'userid is not the same as your user' | |||
) | |||
if isinstance(userid, Optional): | |||
user_id = apiuser.user_id | |||
else: | |||
user_id = get_user_or_error(userid).user_id | |||
gists = [] | |||
_gists = Gist().query() \ | |||
.filter(or_( | |||
Gist.gist_expires == -1, Gist.gist_expires >= time.time())) \ | |||
.filter(Gist.gist_owner == user_id) \ | |||
.order_by(Gist.created_on.desc()) | |||
for gist in _gists: | |||
gists.append(gist.get_api_data()) | |||
return gists | |||
@jsonrpc_method() | |||
def create_gist( | |||
request, apiuser, files, owner=Optional(OAttr('apiuser')), | |||
gist_type=Optional(Gist.GIST_PUBLIC), lifetime=Optional(-1), | |||
acl_level=Optional(Gist.ACL_LEVEL_PUBLIC), | |||
description=Optional('')): | |||
""" | |||
Creates a new Gist. | |||
:param apiuser: This is filled automatically from the |authtoken|. | |||
:type apiuser: AuthUser | |||
:param files: files to be added to the gist. The data structure has | |||
to match the following example:: | |||
{'filename': {'content':'...', 'lexer': null}, | |||
'filename2': {'content':'...', 'lexer': null}} | |||
:type files: dict | |||
:param owner: Set the gist owner, defaults to api method caller | |||
:type owner: Optional(str or int) | |||
:param gist_type: type of gist ``public`` or ``private`` | |||
:type gist_type: Optional(str) | |||
:param lifetime: time in minutes of gist lifetime | |||
:type lifetime: Optional(int) | |||
:param acl_level: acl level for this gist, can be | |||
``acl_public`` or ``acl_private`` If the value is set to | |||
``acl_private`` only logged in users are able to access this gist. | |||
If not set it defaults to ``acl_public``. | |||
:type acl_level: Optional(str) | |||
:param description: gist description | |||
:type description: Optional(str) | |||
Example output: | |||
.. code-block:: bash | |||
id : <id_given_in_input> | |||
result : { | |||
"msg": "created new gist", | |||
"gist": {} | |||
} | |||
error : null | |||
Example error output: | |||
.. code-block:: bash | |||
id : <id_given_in_input> | |||
result : null | |||
error : { | |||
"failed to create gist" | |||
} | |||
""" | |||
try: | |||
if isinstance(owner, Optional): | |||
owner = apiuser.user_id | |||
owner = get_user_or_error(owner) | |||
description = Optional.extract(description) | |||
gist_type = Optional.extract(gist_type) | |||
lifetime = Optional.extract(lifetime) | |||
acl_level = Optional.extract(acl_level) | |||
gist = GistModel().create(description=description, | |||
owner=owner, | |||
gist_mapping=files, | |||
gist_type=gist_type, | |||
lifetime=lifetime, | |||
gist_acl_level=acl_level) | |||
Session().commit() | |||
return { | |||
'msg': 'created new gist', | |||
'gist': gist.get_api_data() | |||
} | |||
except Exception: | |||
log.exception('Error occurred during creation of gist') | |||
raise JSONRPCError('failed to create gist') | |||
@jsonrpc_method() | |||
def delete_gist(request, apiuser, gistid): | |||
""" | |||
Deletes existing gist | |||
:param apiuser: filled automatically from apikey | |||
:type apiuser: AuthUser | |||
:param gistid: id of gist to delete | |||
:type gistid: str | |||
Example output: | |||
.. code-block:: bash | |||
id : <id_given_in_input> | |||
result : { | |||
"deleted gist ID: <gist_id>", | |||
"gist": null | |||
} | |||
error : null | |||
Example error output: | |||
.. code-block:: bash | |||
id : <id_given_in_input> | |||
result : null | |||
error : { | |||
"failed to delete gist ID:<gist_id>" | |||
} | |||
""" | |||
gist = get_gist_or_error(gistid) | |||
if not has_superadmin_permission(apiuser): | |||
if gist.gist_owner != apiuser.user_id: | |||
raise JSONRPCError('gist `%s` does not exist' % (gistid,)) | |||
try: | |||
GistModel().delete(gist) | |||
Session().commit() | |||
return { | |||
'msg': 'deleted gist ID:%s' % (gist.gist_access_id,), | |||
'gist': None | |||
} | |||
except Exception: | |||
log.exception('Error occured during gist deletion') | |||
raise JSONRPCError('failed to delete gist ID:%s' | |||
% (gist.gist_access_id,)) |