Port a few more repository methods to the new API interface.

This commit is contained in:
jakedt 2014-03-12 20:33:57 -04:00
parent e74eb3ee87
commit 0e3fe8f3b1
5 changed files with 176 additions and 59 deletions

View file

@ -1,17 +1,20 @@
import logging
import json
from flask import current_app
from flask import current_app, request
from flask.ext.restful import reqparse, abort
from flask.ext.login import current_user
from data import model
from endpoints.api import (truthy_bool, format_date, nickname, log_action, validate_json_request,
require_repo_read, RepositoryParamResource, resource, query_param,
parse_args, ApiResource)
require_repo_read, require_repo_write, require_repo_admin,
RepositoryParamResource, resource, query_param, parse_args, ApiResource,
request_error, require_scope)
from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission,
AdministerRepositoryPermission)
AdministerRepositoryPermission, CreateRepositoryPermission)
from auth.auth import process_auth
from auth import scopes
from auth.auth_context import get_authenticated_user
logger = logging.getLogger(__name__)
@ -25,14 +28,12 @@ class RepositoryList(ApiResource):
'id': 'NewRepo',
'type': 'object',
'description': 'Description of a new repository',
'required': [
'repository',
'visibility',
],
'required': True,
'properties': {
'repository': {
'type': 'string',
'description': 'Repository name',
'required': True,
},
'visibility': {
'type': 'string',
@ -40,7 +41,8 @@ class RepositoryList(ApiResource):
'enum': [
'public',
'private',
]
],
'required': True,
},
'namespace': {
'type': 'string',
@ -55,11 +57,12 @@ class RepositoryList(ApiResource):
}
}
@require_scope(scopes.CREATE_REPO)
@nickname('createRepo')
@validate_json_request('NewRepo')
def post(self):
"""Create a new repository."""
owner = current_user.db_user()
owner = get_authenticated_user()
req = request.get_json()
namespace_name = req['namespace'] if 'namespace' in req else owner.username
@ -81,10 +84,10 @@ class RepositoryList(ApiResource):
log_action('create_repo', namespace_name, {'repo': repository_name,
'namespace': namespace_name}, repo=repo)
return jsonify({
return {
'namespace': namespace_name,
'name': repository_name
})
}, 201
abort(403)
@ -148,7 +151,22 @@ def image_view(image):
@resource('/v1/repository/<path:repository>')
class Repository(RepositoryParamResource):
"""Operations for managing a specific repository."""
@process_auth
schemas = {
'RepoUpdate': {
'id': 'RepoUpdate',
'type': 'object',
'description': 'Fields which can be updated in a repository.',
'required': True,
'properties': {
'description': {
'type': 'string',
'description': 'Markdown encoded description for the repository',
'required': True,
},
}
}
}
@require_repo_read
@nickname('getRepo')
def get(self, namespace, repository):
@ -195,3 +213,70 @@ class Repository(RepositoryParamResource):
}
abort(404) # Not found
@require_repo_write
@nickname('updateRepo')
@validate_json_request('RepoUpdate')
def put(self, namespace, repository):
""" Update the description in the specified repository. """
repo = model.get_repository(namespace, repository)
if repo:
values = request.get_json()
repo.description = values['description']
repo.save()
log_action('set_repo_description', namespace,
{'repo': repository, 'description': values['description']},
repo=repo)
return {
'success': True
}
abort(404) # Not found
@require_repo_admin
@nickname('deleteRepository')
def delete(self, namespace, repository):
model.purge_repository(namespace, repository)
log_action('delete_repo', namespace,
{'repo': repository, 'namespace': namespace})
return 'Deleted', 204
@resource('/v1/repository/<path:repository>/changevisibility')
class RepositoryVisibility(RepositoryParamResource):
""" Custom verb for changing the visibility of the repository. """
schemas = {
'ChangeVisibility': {
'id': 'ChangeVisibility',
'type': 'object',
'description': 'Change the visibility for the repository.',
'required': True,
'properties': {
'visibility': {
'type': 'string',
'description': 'Visibility which the repository will start with',
'enum': [
'public',
'private',
],
'required': True,
},
}
}
}
@require_repo_admin
@nickname('changeRepoVisibility')
@validate_json_request('ChangeVisibility')
def post(self, namespace, repository):
""" Change the visibility of a repository. """
repo = model.get_repository(namespace, repository)
if repo:
values = request.get_json()
model.set_repository_visibility(repo, values['visibility'])
log_action('change_repo_visibility', namespace,
{'repo': repository, 'visibility': values['visibility']},
repo=repo)
return {
'success': True
}