PageRenderTime 27ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/rhodecode/controllers/api/api.py

https://bitbucket.org/marcinkuzminski/rhodecode/
Python | 422 lines | 276 code | 40 blank | 106 comment | 26 complexity | 20fa65ffeed4f4b55cf934cb383cad1a MD5 | raw file
Possible License(s): GPL-3.0
  1. # -*- coding: utf-8 -*-
  2. """
  3. rhodecode.controllers.api
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~
  5. API controller for RhodeCode
  6. :created_on: Aug 20, 2011
  7. :author: marcink
  8. :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
  9. :license: GPLv3, see COPYING for more details.
  10. """
  11. # This program is free software; you can redistribute it and/or
  12. # modify it under the terms of the GNU General Public License
  13. # as published by the Free Software Foundation; version 2
  14. # of the License or (at your opinion) any later version of the license.
  15. #
  16. # This program is distributed in the hope that it will be useful,
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. # GNU General Public License for more details.
  20. #
  21. # You should have received a copy of the GNU General Public License
  22. # along with this program; if not, write to the Free Software
  23. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  24. # MA 02110-1301, USA.
  25. import traceback
  26. import logging
  27. from rhodecode.controllers.api import JSONRPCController, JSONRPCError
  28. from rhodecode.lib.auth import HasPermissionAllDecorator, \
  29. HasPermissionAnyDecorator
  30. from rhodecode.model.scm import ScmModel
  31. from rhodecode.model.db import User, UsersGroup, Group, Repository
  32. from rhodecode.model.repo import RepoModel
  33. from rhodecode.model.user import UserModel
  34. from rhodecode.model.repo_permission import RepositoryPermissionModel
  35. from rhodecode.model.users_group import UsersGroupModel
  36. from rhodecode.model import users_group
  37. from rhodecode.model.repos_group import ReposGroupModel
  38. from sqlalchemy.orm.exc import NoResultFound
  39. log = logging.getLogger(__name__)
  40. class ApiController(JSONRPCController):
  41. """
  42. API Controller
  43. Each method needs to have USER as argument this is then based on given
  44. API_KEY propagated as instance of user object
  45. Preferably this should be first argument also
  46. Each function should also **raise** JSONRPCError for any
  47. errors that happens
  48. """
  49. @HasPermissionAllDecorator('hg.admin')
  50. def pull(self, apiuser, repo):
  51. """
  52. Dispatch pull action on given repo
  53. :param user:
  54. :param repo:
  55. """
  56. if Repository.is_valid(repo) is False:
  57. raise JSONRPCError('Unknown repo "%s"' % repo)
  58. try:
  59. ScmModel().pull_changes(repo, self.rhodecode_user.username)
  60. return 'Pulled from %s' % repo
  61. except Exception:
  62. raise JSONRPCError('Unable to pull changes from "%s"' % repo)
  63. @HasPermissionAllDecorator('hg.admin')
  64. def get_user(self, apiuser, username):
  65. """"
  66. Get a user by username
  67. :param apiuser:
  68. :param username:
  69. """
  70. user = User.get_by_username(username)
  71. if not user:
  72. return None
  73. return dict(
  74. id=user.user_id,
  75. username=user.username,
  76. firstname=user.name,
  77. lastname=user.lastname,
  78. email=user.email,
  79. active=user.active,
  80. admin=user.admin,
  81. ldap=user.ldap_dn
  82. )
  83. @HasPermissionAllDecorator('hg.admin')
  84. def get_users(self, apiuser):
  85. """"
  86. Get all users
  87. :param apiuser:
  88. """
  89. result = []
  90. for user in User.getAll():
  91. result.append(
  92. dict(
  93. id=user.user_id,
  94. username=user.username,
  95. firstname=user.name,
  96. lastname=user.lastname,
  97. email=user.email,
  98. active=user.active,
  99. admin=user.admin,
  100. ldap=user.ldap_dn
  101. )
  102. )
  103. return result
  104. @HasPermissionAllDecorator('hg.admin')
  105. def create_user(self, apiuser, username, password, firstname,
  106. lastname, email, active=True, admin=False, ldap_dn=None):
  107. """
  108. Create new user
  109. :param apiuser:
  110. :param username:
  111. :param password:
  112. :param name:
  113. :param lastname:
  114. :param email:
  115. :param active:
  116. :param admin:
  117. :param ldap_dn:
  118. """
  119. if User.get_by_username(username):
  120. raise JSONRPCError("user %s already exist" % username)
  121. try:
  122. form_data = dict(username=username,
  123. password=password,
  124. active=active,
  125. admin=admin,
  126. name=firstname,
  127. lastname=lastname,
  128. email=email,
  129. ldap_dn=ldap_dn)
  130. UserModel().create_ldap(username, password, ldap_dn, form_data)
  131. return dict(msg='created new user %s' % username)
  132. except Exception:
  133. log.error(traceback.format_exc())
  134. raise JSONRPCError('failed to create user %s' % username)
  135. @HasPermissionAllDecorator('hg.admin')
  136. def get_users_group(self, apiuser, group_name):
  137. """"
  138. Get users group by name
  139. :param apiuser:
  140. :param group_name:
  141. """
  142. users_group = UsersGroup.get_by_group_name(group_name)
  143. if not users_group:
  144. return None
  145. members = []
  146. for user in users_group.members:
  147. user = user.user
  148. members.append(dict(id=user.user_id,
  149. username=user.username,
  150. firstname=user.name,
  151. lastname=user.lastname,
  152. email=user.email,
  153. active=user.active,
  154. admin=user.admin,
  155. ldap=user.ldap_dn))
  156. return dict(id=users_group.users_group_id,
  157. name=users_group.users_group_name,
  158. active=users_group.users_group_active,
  159. members=members)
  160. @HasPermissionAllDecorator('hg.admin')
  161. def get_users_groups(self, apiuser):
  162. """"
  163. Get all users groups
  164. :param apiuser:
  165. """
  166. result = []
  167. for users_group in UsersGroup.getAll():
  168. members = []
  169. for user in users_group.members:
  170. user = user.user
  171. members.append(dict(id=user.user_id,
  172. username=user.username,
  173. firstname=user.name,
  174. lastname=user.lastname,
  175. email=user.email,
  176. active=user.active,
  177. admin=user.admin,
  178. ldap=user.ldap_dn))
  179. result.append(dict(id=users_group.users_group_id,
  180. name=users_group.users_group_name,
  181. active=users_group.users_group_active,
  182. members=members))
  183. return result
  184. @HasPermissionAllDecorator('hg.admin')
  185. def create_users_group(self, apiuser, name, active=True):
  186. """
  187. Creates an new usergroup
  188. :param name:
  189. :param active:
  190. """
  191. if self.get_users_group(apiuser, name):
  192. raise JSONRPCError("users group %s already exist" % name)
  193. try:
  194. form_data = dict(users_group_name=name,
  195. users_group_active=active)
  196. ug = UsersGroup.create(form_data)
  197. return dict(id=ug.users_group_id,
  198. msg='created new users group %s' % name)
  199. except Exception:
  200. log.error(traceback.format_exc())
  201. raise JSONRPCError('failed to create group %s' % name)
  202. @HasPermissionAllDecorator('hg.admin')
  203. def add_user_to_users_group(self, apiuser, group_name, user_name):
  204. """"
  205. Add a user to a group
  206. :param apiuser
  207. :param group_name
  208. :param user_name
  209. """
  210. try:
  211. users_group = UsersGroup.get_by_group_name(group_name)
  212. if not users_group:
  213. raise JSONRPCError('unknown users group %s' % group_name)
  214. try:
  215. user = User.get_by_username(user_name)
  216. except NoResultFound:
  217. raise JSONRPCError('unknown user %s' % user_name)
  218. ugm = UsersGroupModel().add_user_to_group(users_group, user)
  219. return dict(id=ugm.users_group_member_id,
  220. msg='created new users group member')
  221. except Exception:
  222. log.error(traceback.format_exc())
  223. raise JSONRPCError('failed to create users group member')
  224. @HasPermissionAnyDecorator('hg.admin')
  225. def get_repo(self, apiuser, name):
  226. """"
  227. Get repository by name
  228. :param apiuser
  229. :param repo_name
  230. """
  231. try:
  232. repo = Repository.get_by_repo_name(name)
  233. except NoResultFound:
  234. return None
  235. members = []
  236. for user in repo.repo_to_perm:
  237. perm = user.permission.permission_name
  238. user = user.user
  239. members.append(
  240. dict(
  241. type_="user",
  242. id=user.user_id,
  243. username=user.username,
  244. firstname=user.name,
  245. lastname=user.lastname,
  246. email=user.email,
  247. active=user.active,
  248. admin=user.admin,
  249. ldap=user.ldap_dn,
  250. permission=perm
  251. )
  252. )
  253. for users_group in repo.users_group_to_perm:
  254. perm = users_group.permission.permission_name
  255. users_group = users_group.users_group
  256. members.append(
  257. dict(
  258. type_="users_group",
  259. id=users_group.users_group_id,
  260. name=users_group.users_group_name,
  261. active=users_group.users_group_active,
  262. permission=perm
  263. )
  264. )
  265. return dict(
  266. id=repo.repo_id,
  267. name=repo.repo_name,
  268. type=repo.repo_type,
  269. description=repo.description,
  270. members=members
  271. )
  272. @HasPermissionAnyDecorator('hg.admin')
  273. def get_repos(self, apiuser):
  274. """"
  275. Get all repositories
  276. :param apiuser
  277. """
  278. result = []
  279. for repository in Repository.getAll():
  280. result.append(
  281. dict(
  282. id=repository.repo_id,
  283. name=repository.repo_name,
  284. type=repository.repo_type,
  285. description=repository.description
  286. )
  287. )
  288. return result
  289. @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
  290. def create_repo(self, apiuser, name, owner_name, description='',
  291. repo_type='hg', private=False):
  292. """
  293. Create a repository
  294. :param apiuser
  295. :param name
  296. :param description
  297. :param type
  298. :param private
  299. :param owner_name
  300. """
  301. try:
  302. try:
  303. owner = User.get_by_username(owner_name)
  304. except NoResultFound:
  305. raise JSONRPCError('unknown user %s' % owner)
  306. if self.get_repo(apiuser, name):
  307. raise JSONRPCError("repo %s already exist" % name)
  308. groups = name.split('/')
  309. real_name = groups[-1]
  310. groups = groups[:-1]
  311. parent_id = None
  312. for g in groups:
  313. group = Group.get_by_group_name(g)
  314. if not group:
  315. group = ReposGroupModel().create(dict(group_name=g,
  316. group_description='',
  317. group_parent_id=parent_id))
  318. parent_id = group.group_id
  319. RepoModel().create(dict(repo_name=real_name,
  320. repo_name_full=name,
  321. description=description,
  322. private=private,
  323. repo_type=repo_type,
  324. repo_group=parent_id,
  325. clone_uri=None), owner)
  326. except Exception:
  327. log.error(traceback.format_exc())
  328. raise JSONRPCError('failed to create repository %s' % name)
  329. @HasPermissionAnyDecorator('hg.admin')
  330. def add_user_to_repo(self, apiuser, repo_name, user_name, perm):
  331. """
  332. Add permission for a user to a repository
  333. :param apiuser
  334. :param repo_name
  335. :param user_name
  336. :param perm
  337. """
  338. try:
  339. try:
  340. repo = Repository.get_by_repo_name(repo_name)
  341. except NoResultFound:
  342. raise JSONRPCError('unknown repository %s' % repo)
  343. try:
  344. user = User.get_by_username(user_name)
  345. except NoResultFound:
  346. raise JSONRPCError('unknown user %s' % user)
  347. RepositoryPermissionModel()\
  348. .update_or_delete_user_permission(repo, user, perm)
  349. except Exception:
  350. log.error(traceback.format_exc())
  351. raise JSONRPCError('failed to edit permission %(repo)s for %(user)s'
  352. % dict(user=user_name, repo=repo_name))