Show More
@@ -33,7 +33,7 b' from rhodecode.lib.auth import PasswordG' | |||||
33 | HasPermissionAllDecorator, HasPermissionAnyDecorator, \ |
|
33 | HasPermissionAllDecorator, HasPermissionAnyDecorator, \ | |
34 | HasPermissionAnyApi, HasRepoPermissionAnyApi |
|
34 | HasPermissionAnyApi, HasRepoPermissionAnyApi | |
35 | from rhodecode.lib.utils import map_groups, repo2db_mapper |
|
35 | from rhodecode.lib.utils import map_groups, repo2db_mapper | |
36 | from rhodecode.lib.utils2 import str2bool, time_to_datetime |
|
36 | from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_int | |
37 | from rhodecode.lib import helpers as h |
|
37 | from rhodecode.lib import helpers as h | |
38 | from rhodecode.model.meta import Session |
|
38 | from rhodecode.model.meta import Session | |
39 | from rhodecode.model.scm import ScmModel |
|
39 | from rhodecode.model.scm import ScmModel | |
@@ -42,6 +42,7 b' from rhodecode.model.user import UserMod' | |||||
42 | from rhodecode.model.users_group import UserGroupModel |
|
42 | from rhodecode.model.users_group import UserGroupModel | |
43 | from rhodecode.model.permission import PermissionModel |
|
43 | from rhodecode.model.permission import PermissionModel | |
44 | from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap |
|
44 | from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap | |
|
45 | from rhodecode.lib.compat import json | |||
45 |
|
46 | |||
46 | log = logging.getLogger(__name__) |
|
47 | log = logging.getLogger(__name__) | |
47 |
|
48 | |||
@@ -274,7 +275,7 b' class ApiController(JSONRPCController):' | |||||
274 | return ('Repo `%s` locked by `%s`. Locked=`True`. ' |
|
275 | return ('Repo `%s` locked by `%s`. Locked=`True`. ' | |
275 | 'Locked since: `%s`' |
|
276 | 'Locked since: `%s`' | |
276 | % (repo.repo_name, user.username, |
|
277 | % (repo.repo_name, user.username, | |
277 |
|
|
278 | json.dumps(time_to_datetime(time_)))) | |
278 |
|
279 | |||
279 | else: |
|
280 | else: | |
280 | locked = str2bool(locked) |
|
281 | locked = str2bool(locked) | |
@@ -292,6 +293,44 b' class ApiController(JSONRPCController):' | |||||
292 | 'Error occurred locking repository `%s`' % repo.repo_name |
|
293 | 'Error occurred locking repository `%s`' % repo.repo_name | |
293 | ) |
|
294 | ) | |
294 |
|
295 | |||
|
296 | def get_locks(self, apiuser, userid=Optional(OAttr('apiuser'))): | |||
|
297 | """ | |||
|
298 | Get all locks for given userid, if | |||
|
299 | this command is runned by non-admin account userid is set to user | |||
|
300 | who is calling this method, thus returning locks for himself | |||
|
301 | ||||
|
302 | :param apiuser: | |||
|
303 | :param userid: | |||
|
304 | """ | |||
|
305 | if HasPermissionAnyApi('hg.admin')(user=apiuser): | |||
|
306 | pass | |||
|
307 | else: | |||
|
308 | #make sure normal user does not pass someone else userid, | |||
|
309 | #he is not allowed to do that | |||
|
310 | if not isinstance(userid, Optional) and userid != apiuser.user_id: | |||
|
311 | raise JSONRPCError( | |||
|
312 | 'userid is not the same as your user' | |||
|
313 | ) | |||
|
314 | ret = [] | |||
|
315 | if isinstance(userid, Optional): | |||
|
316 | user = None | |||
|
317 | else: | |||
|
318 | user = get_user_or_error(userid) | |||
|
319 | ||||
|
320 | #show all locks | |||
|
321 | for r in Repository.getAll(): | |||
|
322 | userid, time_ = r.locked | |||
|
323 | if time_: | |||
|
324 | _api_data = r.get_api_data() | |||
|
325 | # if we use userfilter just show the locks for this user | |||
|
326 | if user: | |||
|
327 | if safe_int(userid) == user.user_id: | |||
|
328 | ret.append(_api_data) | |||
|
329 | else: | |||
|
330 | ret.append(_api_data) | |||
|
331 | ||||
|
332 | return ret | |||
|
333 | ||||
295 | @HasPermissionAllDecorator('hg.admin') |
|
334 | @HasPermissionAllDecorator('hg.admin') | |
296 | def show_ip(self, apiuser, userid): |
|
335 | def show_ip(self, apiuser, userid): | |
297 | """ |
|
336 | """ |
@@ -47,7 +47,7 b' from rhodecode.lib.vcs.utils.lazy import' | |||||
47 | from rhodecode.lib.vcs.backends.base import EmptyChangeset |
|
47 | from rhodecode.lib.vcs.backends.base import EmptyChangeset | |
48 |
|
48 | |||
49 | from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \ |
|
49 | from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \ | |
50 | safe_unicode, remove_suffix, remove_prefix |
|
50 | safe_unicode, remove_suffix, remove_prefix, time_to_datetime | |
51 | from rhodecode.lib.compat import json |
|
51 | from rhodecode.lib.compat import json | |
52 | from rhodecode.lib.caching_query import FromCache |
|
52 | from rhodecode.lib.caching_query import FromCache | |
53 |
|
53 | |||
@@ -972,7 +972,11 b' class Repository(Base, BaseModel):' | |||||
972 | enable_statistics=repo.enable_statistics, |
|
972 | enable_statistics=repo.enable_statistics, | |
973 | enable_locking=repo.enable_locking, |
|
973 | enable_locking=repo.enable_locking, | |
974 | enable_downloads=repo.enable_downloads, |
|
974 | enable_downloads=repo.enable_downloads, | |
975 | last_changeset=repo.changeset_cache |
|
975 | last_changeset=repo.changeset_cache, | |
|
976 | locked_by=User.get(self.locked[0]).get_api_data() \ | |||
|
977 | if self.locked[0] else None, | |||
|
978 | locked_date=time_to_datetime(self.locked[1]) \ | |||
|
979 | if self.locked[1] else None | |||
976 | ) |
|
980 | ) | |
977 | rc_config = RhodeCodeSetting.get_app_settings() |
|
981 | rc_config = RhodeCodeSetting.get_app_settings() | |
978 | repository_fields = str2bool(rc_config.get('rhodecode_repository_fields')) |
|
982 | repository_fields = str2bool(rc_config.get('rhodecode_repository_fields')) |
@@ -371,9 +371,8 b' class BaseTestApi(object):' | |||||
371 | self._compare_ok(id_, expected, given=response.body) |
|
371 | self._compare_ok(id_, expected, given=response.body) | |
372 |
|
372 | |||
373 | def test_api_lock_repo_lock_optional_locked(self): |
|
373 | def test_api_lock_repo_lock_optional_locked(self): | |
374 | from rhodecode.lib import helpers |
|
|||
375 | from rhodecode.lib.utils2 import time_to_datetime |
|
374 | from rhodecode.lib.utils2 import time_to_datetime | |
376 |
_locked_since = |
|
375 | _locked_since = json.dumps(time_to_datetime(Repository\ | |
377 | .get_by_repo_name(self.REPO).locked[1])) |
|
376 | .get_by_repo_name(self.REPO).locked[1])) | |
378 | id_, params = _build_data(self.apikey, 'lock', |
|
377 | id_, params = _build_data(self.apikey, 'lock', | |
379 | repoid=self.REPO) |
|
378 | repoid=self.REPO) | |
@@ -393,6 +392,32 b' class BaseTestApi(object):' | |||||
393 | expected = 'Error occurred locking repository `%s`' % self.REPO |
|
392 | expected = 'Error occurred locking repository `%s`' % self.REPO | |
394 | self._compare_error(id_, expected, given=response.body) |
|
393 | self._compare_error(id_, expected, given=response.body) | |
395 |
|
394 | |||
|
395 | def test_api_get_locks_regular_user(self): | |||
|
396 | id_, params = _build_data(self.apikey_regular, 'get_locks') | |||
|
397 | response = api_call(self, params) | |||
|
398 | expected = [] | |||
|
399 | self._compare_ok(id_, expected, given=response.body) | |||
|
400 | ||||
|
401 | def test_api_get_locks_with_userid_regular_user(self): | |||
|
402 | id_, params = _build_data(self.apikey_regular, 'get_locks', | |||
|
403 | userid=TEST_USER_ADMIN_LOGIN) | |||
|
404 | response = api_call(self, params) | |||
|
405 | expected = 'userid is not the same as your user' | |||
|
406 | self._compare_error(id_, expected, given=response.body) | |||
|
407 | ||||
|
408 | def test_api_get_locks(self): | |||
|
409 | id_, params = _build_data(self.apikey, 'get_locks') | |||
|
410 | response = api_call(self, params) | |||
|
411 | expected = [] | |||
|
412 | self._compare_ok(id_, expected, given=response.body) | |||
|
413 | ||||
|
414 | def test_api_get_locks_with_userid(self): | |||
|
415 | id_, params = _build_data(self.apikey, 'get_locks', | |||
|
416 | userid=TEST_USER_REGULAR_LOGIN) | |||
|
417 | response = api_call(self, params) | |||
|
418 | expected = [] | |||
|
419 | self._compare_ok(id_, expected, given=response.body) | |||
|
420 | ||||
396 | def test_api_create_existing_user(self): |
|
421 | def test_api_create_existing_user(self): | |
397 | id_, params = _build_data(self.apikey, 'create_user', |
|
422 | id_, params = _build_data(self.apikey, 'create_user', | |
398 | username=TEST_USER_ADMIN_LOGIN, |
|
423 | username=TEST_USER_ADMIN_LOGIN, |
General Comments 0
You need to be logged in to leave comments.
Login now