# HG changeset patch # User Marcin Kuzminski # Date 2013-03-05 19:03:33 # Node ID 08e8115585bd3ce9a0eb4e3ff6bb05c19a83a8b2 # Parent cf1fbc9fed89475631df3236c0a6ed2b2ac2e2e1 calling lock function without lock attribute, will return lock state diff --git a/docs/api/api.rst b/docs/api/api.rst --- a/docs/api/api.rst +++ b/docs/api/api.rst @@ -178,7 +178,8 @@ lock ---- Set locking state on given repository by given user. If userid param is skipped -, then it is set to id of user whos calling this method. +, then it is set to id of user whos calling this method. If locked param is skipped +then function shows current lock state of given repo. This command can be executed only using api_key belonging to user with admin rights or regular user that have admin or write access to repository. @@ -190,7 +191,7 @@ INPUT:: args : { "repoid" : "" "userid" : "", - "locked" : "" + "locked" : "" } OUTPUT:: diff --git a/rhodecode/controllers/api/api.py b/rhodecode/controllers/api/api.py --- a/rhodecode/controllers/api/api.py +++ b/rhodecode/controllers/api/api.py @@ -27,14 +27,14 @@ import traceback import logging -from pylons.controllers.util import abort from rhodecode.controllers.api import JSONRPCController, JSONRPCError from rhodecode.lib.auth import PasswordGenerator, AuthUser, \ HasPermissionAllDecorator, HasPermissionAnyDecorator, \ HasPermissionAnyApi, HasRepoPermissionAnyApi from rhodecode.lib.utils import map_groups, repo2db_mapper -from rhodecode.lib.utils2 import str2bool +from rhodecode.lib.utils2 import str2bool, time_to_datetime +from rhodecode.lib import helpers as h from rhodecode.model.meta import Session from rhodecode.model.scm import ScmModel from rhodecode.model.repo import RepoModel @@ -229,7 +229,8 @@ class ApiController(JSONRPCController): 'Error occurred during cache invalidation action' ) - def lock(self, apiuser, repoid, locked, userid=Optional(OAttr('apiuser'))): + def lock(self, apiuser, repoid, locked=Optional(None), + userid=Optional(OAttr('apiuser'))): """ Set locking state on particular repository by given user, if this command is runned by non-admin account userid is set to user @@ -257,21 +258,39 @@ class ApiController(JSONRPCController): if isinstance(userid, Optional): userid = apiuser.user_id + user = get_user_or_error(userid) - locked = str2bool(locked) - try: - if locked: - Repository.lock(repo, user.user_id) + + if isinstance(locked, Optional): + lockobj = Repository.getlock(repo) + + if lockobj[0] is None: + return ('Repo `%s` not locked. Locked=`False`.' + % (repo.repo_name)) else: - Repository.unlock(repo) + userid, time_ = lockobj + user = get_user_or_error(userid) - return ('User `%s` set lock state for repo `%s` to `%s`' - % (user.username, repo.repo_name, locked)) - except Exception: - log.error(traceback.format_exc()) - raise JSONRPCError( - 'Error occurred locking repository `%s`' % repo.repo_name - ) + return ('Repo `%s` locked by `%s`. Locked=`True`. ' + 'Locked since: `%s`' + % (repo.repo_name, user.username, + h.fmt_date(time_to_datetime(time_)))) + + else: + locked = str2bool(locked) + try: + if locked: + Repository.lock(repo, user.user_id) + else: + Repository.unlock(repo) + + return ('User `%s` set lock state for repo `%s` to `%s`' + % (user.username, repo.repo_name, locked)) + except Exception: + log.error(traceback.format_exc()) + raise JSONRPCError( + 'Error occurred locking repository `%s`' % repo.repo_name + ) @HasPermissionAllDecorator('hg.admin') def show_ip(self, apiuser, userid): diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -1002,6 +1002,10 @@ class Repository(Base, BaseModel): Session().add(repo) Session().commit() + @classmethod + def getlock(cls, repo): + return repo.locked + @property def last_db_change(self): return self.updated_on diff --git a/rhodecode/tests/api/api_base.py b/rhodecode/tests/api/api_base.py --- a/rhodecode/tests/api/api_base.py +++ b/rhodecode/tests/api/api_base.py @@ -370,6 +370,18 @@ class BaseTestApi(object): % (TEST_USER_ADMIN_LOGIN, self.REPO, True)) self._compare_ok(id_, expected, given=response.body) + def test_api_lock_repo_lock_optional_locked(self): + from rhodecode.lib import helpers + from rhodecode.lib.utils2 import time_to_datetime + _locked_since = helpers.fmt_date(time_to_datetime(Repository\ + .get_by_repo_name(self.REPO).locked[1])) + id_, params = _build_data(self.apikey, 'lock', + repoid=self.REPO) + response = api_call(self, params) + expected = ('Repo `%s` locked by `%s`. Locked=`True`. Locked since: `%s`' + % (self.REPO, TEST_USER_ADMIN_LOGIN, _locked_since)) + self._compare_ok(id_, expected, given=response.body) + @mock.patch.object(Repository, 'lock', crash) def test_api_lock_error(self): id_, params = _build_data(self.apikey, 'lock',