# -*- coding: utf-8 -*-
"""
rhodecode.controllers.api
~~~~~~~~~~~~~~~~~~~~~~~~~
API controller for RhodeCode
:created_on: Aug 20, 2011
:author: marcink
:copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
:license: GPLv3, see COPYING for more details.
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2
# of the License or (at your opinion) any later version of the license.
#
# 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 General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import traceback
import logging
from rhodecode.controllers.api import JSONRPCController, JSONRPCError
from rhodecode.lib.auth import HasPermissionAllDecorator, \
HasPermissionAnyDecorator
from rhodecode.model.scm import ScmModel
from rhodecode.model.db import User, UsersGroup, Group, Repository
from rhodecode.model.repo import RepoModel
from rhodecode.model.user import UserModel
from rhodecode.model.repo_permission import RepositoryPermissionModel
from rhodecode.model.users_group import UsersGroupModel
from rhodecode.model import users_group
from rhodecode.model.repos_group import ReposGroupModel
from sqlalchemy.orm.exc import NoResultFound
log = logging.getLogger(__name__)
class ApiController(JSONRPCController):
API Controller
Each method needs to have USER as argument this is then based on given
API_KEY propagated as instance of user object
Preferably this should be first argument also
@@ -49,103 +77,109 @@ class ApiController(JSONRPCController):
try:
ScmModel().pull_changes(repo, self.rhodecode_user.username)
return 'Pulled from %s' % repo
except Exception:
raise JSONRPCError('Unable to pull changes from "%s"' % repo)
@HasPermissionAllDecorator('hg.admin')
def get_user(self, apiuser, username):
""""
Get a user by username
:param apiuser
:param username
:param apiuser:
:param username:
user = User.get_by_username(username)
if not user:
return None
return dict(id=user.user_id,
username=user.username,
firstname=user.name,
lastname=user.lastname,
email=user.email,
active=user.active,
admin=user.admin,
ldap=user.ldap_dn)
return dict(
id=user.user_id,
ldap=user.ldap_dn
)
def get_users(self, apiuser):
Get all users
result = []
for user in User.getAll():
result.append(dict(id=user.user_id,
ldap=user.ldap_dn))
result.append(
dict(
return result
def create_user(self, apiuser, username, password, firstname,
lastname, email, active=True, admin=False, ldap_dn=None):
Create new user
:param password:
:param name:
:param lastname:
:param email:
:param active:
:param admin:
:param ldap_dn:
if self.get_user(apiuser, username):
if User.get_by_username(username):
raise JSONRPCError("user %s already exist" % username)
form_data = dict(username=username,
password=password,
active=active,
admin=admin,
name=firstname,
lastname=lastname,
email=email,
ldap_dn=ldap_dn)
UserModel().create_ldap(username, password, ldap_dn, form_data)
return dict(msg='created new user %s' % username)
log.error(traceback.format_exc())
raise JSONRPCError('failed to create user %s' % username)
def get_users_group(self, apiuser, group_name):
Get users group by name
:param group_name
:param group_name:
users_group = UsersGroup.get_by_group_name(group_name)
if not users_group:
members = []
for user in users_group.members:
user = user.user
members.append(dict(id=user.user_id,
@@ -156,25 +190,25 @@ class ApiController(JSONRPCController):
return dict(id=users_group.users_group_id,
name=users_group.users_group_name,
active=users_group.users_group_active,
members=members)
def get_users_groups(self, apiuser):
Get all users groups
for users_group in UsersGroup.getAll():
@@ -230,80 +264,94 @@ class ApiController(JSONRPCController):
except NoResultFound:
raise JSONRPCError('unknown user %s' % user_name)
ugm = UsersGroupModel().add_user_to_group(users_group, user)
return dict(id=ugm.users_group_member_id,
msg='created new users group member')
raise JSONRPCError('failed to create users group member')
@HasPermissionAnyDecorator('hg.admin')
def get_repo(self, apiuser, repo_name):
def get_repo(self, apiuser, name):
Get repository by name
:param repo_name
repo = Repository.get_by_repo_name(repo_name)
repo = Repository.get_by_repo_name(name)
for user in repo.repo_to_perm:
perm = user.permission.permission_name
members.append(dict(type_="user",
ldap=user.ldap_dn,
permission=perm))
members.append(
type_="user",
permission=perm
for users_group in repo.users_group_to_perm:
perm = users_group.permission.permission_name
users_group = users_group.users_group
members.append(dict(type_="users_group",
id=users_group.users_group_id,
type_="users_group",
return dict(id=repo.repo_id,
name=repo.repo_name,
type=repo.repo_type,
description=repo.description,
id=repo.repo_id,
members=members
def get_repos(self, apiuser):
Get all repositories
for repository in Repository.getAll():
result.append(dict(id=repository.repo_id,
name=repository.repo_name,
type=repository.repo_type,
description=repository.description))
id=repository.repo_id,
description=repository.description
@HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
def create_repo(self, apiuser, name, owner_name, description='',
repo_type='hg', private=False):
Create a repository
:param name
:param description
:param type
Status change: