changeset 2737:e21cb7b1a4a5 beta

added API call for locking/unlocking repositories
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 25 Aug 2012 19:00:59 +0200
parents 3aad896d9a02
children ddd7a8024ff0
files docs/api/api.rst rhodecode/controllers/api/api.py rhodecode/tests/api/api_base.py
diffstat 3 files changed, 91 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/api.rst	Sat Aug 25 17:19:23 2012 +0200
+++ b/docs/api/api.rst	Sat Aug 25 19:00:59 2012 +0200
@@ -152,6 +152,32 @@
     error :  null
 
 
+lock
+----
+
+Set locking state on given repository by given user.
+This command can be executed only using api_key belonging to user with admin 
+rights.
+
+INPUT::
+
+    id : <id_for_response>
+    api_key : "<api_key>"
+    method :  "lock"
+    args :    {
+                "repoid" : "<reponame or repo_id>"
+                "userid" : "<user_id or username>",
+                "locked" : "<bool true|false>"
+                
+              }
+
+OUTPUT::
+
+    id : <id_given_in_input>
+    result : "User `<username>` set lock state for repo `<reponame>` to `true|false`"
+    error :  null
+
+
 get_user
 --------
 
--- a/rhodecode/controllers/api/api.py	Sat Aug 25 17:19:23 2012 +0200
+++ b/rhodecode/controllers/api/api.py	Sat Aug 25 19:00:59 2012 +0200
@@ -38,6 +38,7 @@
 from rhodecode.model.user import UserModel
 from rhodecode.model.users_group import UsersGroupModel
 from rhodecode.model.permission import PermissionModel
+from rhodecode.model.db import Repository
 
 log = logging.getLogger(__name__)
 
@@ -180,7 +181,34 @@
         except Exception:
             log.error(traceback.format_exc())
             raise JSONRPCError(
-                'Unable to rescan repositories'
+                'Error occurred during rescan repositories action'
+            )
+
+    @HasPermissionAllDecorator('hg.admin')
+    def lock(self, apiuser, repoid, userid, locked):
+        """
+        Set locking state on particular repository by given user
+
+        :param apiuser:
+        :param repoid:
+        :param userid:
+        :param locked:
+        """
+        repo = get_repo_or_error(repoid)
+        user = get_user_or_error(userid)
+        locked = bool(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')
--- a/rhodecode/tests/api/api_base.py	Sat Aug 25 17:19:23 2012 +0200
+++ b/rhodecode/tests/api/api_base.py	Sat Aug 25 19:00:59 2012 +0200
@@ -10,6 +10,7 @@
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.meta import Session
 from rhodecode.model.scm import ScmModel
+from rhodecode.model.db import Repository
 
 API_URL = '/_admin/api'
 
@@ -230,7 +231,41 @@
         response = self.app.post(API_URL, content_type='application/json',
                                  params=params)
 
-        expected = 'Unable to rescan repositories'
+        expected = 'Error occurred during rescan repositories action'
+        self._compare_error(id_, expected, given=response.body)
+
+    def test_api_lock_repo_lock_aquire(self):
+        id_, params = _build_data(self.apikey, 'lock',
+                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  repoid=self.REPO,
+                                  locked=True)
+        response = self.app.post(API_URL, content_type='application/json',
+                                 params=params)
+        expected = ('User `%s` set lock state for repo `%s` to `%s`'
+                   % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
+        self._compare_ok(id_, expected, given=response.body)
+
+    def test_api_lock_repo_lock_release(self):
+        id_, params = _build_data(self.apikey, 'lock',
+                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  repoid=self.REPO,
+                                  locked=False)
+        response = self.app.post(API_URL, content_type='application/json',
+                                 params=params)
+        expected = ('User `%s` set lock state for repo `%s` to `%s`'
+                   % (TEST_USER_ADMIN_LOGIN, self.REPO, False))
+        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',
+                                  userid=TEST_USER_ADMIN_LOGIN,
+                                  repoid=self.REPO,
+                                  locked=True)
+        response = self.app.post(API_URL, content_type='application/json',
+                                 params=params)
+
+        expected = 'Error occurred locking repository `%s`' % self.REPO
         self._compare_error(id_, expected, given=response.body)
 
     def test_api_create_existing_user(self):