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