changeset 3457:08e8115585bd beta

calling lock function without lock attribute, will return lock state
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 05 Mar 2013 20:03:33 +0100
parents cf1fbc9fed89
children 0ad025ee005e
files docs/api/api.rst rhodecode/controllers/api/api.py rhodecode/model/db.py rhodecode/tests/api/api_base.py
diffstat 4 files changed, 53 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/api.rst	Tue Mar 05 19:42:08 2013 +0100
+++ b/docs/api/api.rst	Tue Mar 05 20:03:33 2013 +0100
@@ -178,7 +178,8 @@
 ----
 
 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 @@
     args :    {
                 "repoid" : "<reponame or repo_id>"
                 "userid" : "<user_id or username = Optional(=apiuser)>",
-                "locked" : "<bool true|false>"
+                "locked" : "<bool true|false = Optional(=None)>"
               }
 
 OUTPUT::
--- a/rhodecode/controllers/api/api.py	Tue Mar 05 19:42:08 2013 +0100
+++ b/rhodecode/controllers/api/api.py	Tue Mar 05 20:03:33 2013 +0100
@@ -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 @@
                 '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 @@
 
         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):
--- a/rhodecode/model/db.py	Tue Mar 05 19:42:08 2013 +0100
+++ b/rhodecode/model/db.py	Tue Mar 05 20:03:33 2013 +0100
@@ -1002,6 +1002,10 @@
         Session().add(repo)
         Session().commit()
 
+    @classmethod
+    def getlock(cls, repo):
+        return repo.locked
+
     @property
     def last_db_change(self):
         return self.updated_on
--- a/rhodecode/tests/api/api_base.py	Tue Mar 05 19:42:08 2013 +0100
+++ b/rhodecode/tests/api/api_base.py	Tue Mar 05 20:03:33 2013 +0100
@@ -370,6 +370,18 @@
                    % (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',