Show More
@@ -178,7 +178,8 b' lock' | |||||
178 | ---- |
|
178 | ---- | |
179 |
|
179 | |||
180 | Set locking state on given repository by given user. If userid param is skipped |
|
180 | Set locking state on given repository by given user. If userid param is skipped | |
181 | , then it is set to id of user whos calling this method. |
|
181 | , then it is set to id of user whos calling this method. If locked param is skipped | |
|
182 | then function shows current lock state of given repo. | |||
182 | This command can be executed only using api_key belonging to user with admin |
|
183 | This command can be executed only using api_key belonging to user with admin | |
183 | rights or regular user that have admin or write access to repository. |
|
184 | rights or regular user that have admin or write access to repository. | |
184 |
|
185 | |||
@@ -190,7 +191,7 b' INPUT::' | |||||
190 | args : { |
|
191 | args : { | |
191 | "repoid" : "<reponame or repo_id>" |
|
192 | "repoid" : "<reponame or repo_id>" | |
192 | "userid" : "<user_id or username = Optional(=apiuser)>", |
|
193 | "userid" : "<user_id or username = Optional(=apiuser)>", | |
193 | "locked" : "<bool true|false>" |
|
194 | "locked" : "<bool true|false = Optional(=None)>" | |
194 | } |
|
195 | } | |
195 |
|
196 | |||
196 | OUTPUT:: |
|
197 | OUTPUT:: |
@@ -27,14 +27,14 b'' | |||||
27 |
|
27 | |||
28 | import traceback |
|
28 | import traceback | |
29 | import logging |
|
29 | import logging | |
30 | from pylons.controllers.util import abort |
|
|||
31 |
|
30 | |||
32 | from rhodecode.controllers.api import JSONRPCController, JSONRPCError |
|
31 | from rhodecode.controllers.api import JSONRPCController, JSONRPCError | |
33 | from rhodecode.lib.auth import PasswordGenerator, AuthUser, \ |
|
32 | from rhodecode.lib.auth import PasswordGenerator, AuthUser, \ | |
34 | HasPermissionAllDecorator, HasPermissionAnyDecorator, \ |
|
33 | HasPermissionAllDecorator, HasPermissionAnyDecorator, \ | |
35 | HasPermissionAnyApi, HasRepoPermissionAnyApi |
|
34 | HasPermissionAnyApi, HasRepoPermissionAnyApi | |
36 | from rhodecode.lib.utils import map_groups, repo2db_mapper |
|
35 | from rhodecode.lib.utils import map_groups, repo2db_mapper | |
37 | from rhodecode.lib.utils2 import str2bool |
|
36 | from rhodecode.lib.utils2 import str2bool, time_to_datetime | |
|
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 | |
40 | from rhodecode.model.repo import RepoModel |
|
40 | from rhodecode.model.repo import RepoModel | |
@@ -229,7 +229,8 b' class ApiController(JSONRPCController):' | |||||
229 | 'Error occurred during cache invalidation action' |
|
229 | 'Error occurred during cache invalidation action' | |
230 | ) |
|
230 | ) | |
231 |
|
231 | |||
232 |
def lock(self, apiuser, repoid, locked |
|
232 | def lock(self, apiuser, repoid, locked=Optional(None), | |
|
233 | userid=Optional(OAttr('apiuser'))): | |||
233 | """ |
|
234 | """ | |
234 | Set locking state on particular repository by given user, if |
|
235 | Set locking state on particular repository by given user, if | |
235 | this command is runned by non-admin account userid is set to user |
|
236 | this command is runned by non-admin account userid is set to user | |
@@ -257,21 +258,39 b' class ApiController(JSONRPCController):' | |||||
257 |
|
258 | |||
258 | if isinstance(userid, Optional): |
|
259 | if isinstance(userid, Optional): | |
259 | userid = apiuser.user_id |
|
260 | userid = apiuser.user_id | |
|
261 | ||||
260 | user = get_user_or_error(userid) |
|
262 | user = get_user_or_error(userid) | |
261 | locked = str2bool(locked) |
|
263 | ||
262 | try: |
|
264 | if isinstance(locked, Optional): | |
263 | if locked: |
|
265 | lockobj = Repository.getlock(repo) | |
264 | Repository.lock(repo, user.user_id) |
|
266 | ||
|
267 | if lockobj[0] is None: | |||
|
268 | return ('Repo `%s` not locked. Locked=`False`.' | |||
|
269 | % (repo.repo_name)) | |||
265 | else: |
|
270 | else: | |
266 |
|
|
271 | userid, time_ = lockobj | |
|
272 | user = get_user_or_error(userid) | |||
267 |
|
273 | |||
268 | return ('User `%s` set lock state for repo `%s` to `%s`' |
|
274 | return ('Repo `%s` locked by `%s`. Locked=`True`. ' | |
269 | % (user.username, repo.repo_name, locked)) |
|
275 | 'Locked since: `%s`' | |
270 | except Exception: |
|
276 | % (repo.repo_name, user.username, | |
271 | log.error(traceback.format_exc()) |
|
277 | h.fmt_date(time_to_datetime(time_)))) | |
272 | raise JSONRPCError( |
|
278 | ||
273 | 'Error occurred locking repository `%s`' % repo.repo_name |
|
279 | else: | |
274 | ) |
|
280 | locked = str2bool(locked) | |
|
281 | try: | |||
|
282 | if locked: | |||
|
283 | Repository.lock(repo, user.user_id) | |||
|
284 | else: | |||
|
285 | Repository.unlock(repo) | |||
|
286 | ||||
|
287 | return ('User `%s` set lock state for repo `%s` to `%s`' | |||
|
288 | % (user.username, repo.repo_name, locked)) | |||
|
289 | except Exception: | |||
|
290 | log.error(traceback.format_exc()) | |||
|
291 | raise JSONRPCError( | |||
|
292 | 'Error occurred locking repository `%s`' % repo.repo_name | |||
|
293 | ) | |||
275 |
|
294 | |||
276 | @HasPermissionAllDecorator('hg.admin') |
|
295 | @HasPermissionAllDecorator('hg.admin') | |
277 | def show_ip(self, apiuser, userid): |
|
296 | def show_ip(self, apiuser, userid): |
@@ -1002,6 +1002,10 b' class Repository(Base, BaseModel):' | |||||
1002 | Session().add(repo) |
|
1002 | Session().add(repo) | |
1003 | Session().commit() |
|
1003 | Session().commit() | |
1004 |
|
1004 | |||
|
1005 | @classmethod | |||
|
1006 | def getlock(cls, repo): | |||
|
1007 | return repo.locked | |||
|
1008 | ||||
1005 | @property |
|
1009 | @property | |
1006 | def last_db_change(self): |
|
1010 | def last_db_change(self): | |
1007 | return self.updated_on |
|
1011 | return self.updated_on |
@@ -370,6 +370,18 b' class BaseTestApi(object):' | |||||
370 | % (TEST_USER_ADMIN_LOGIN, self.REPO, True)) |
|
370 | % (TEST_USER_ADMIN_LOGIN, self.REPO, True)) | |
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): | |||
|
374 | from rhodecode.lib import helpers | |||
|
375 | from rhodecode.lib.utils2 import time_to_datetime | |||
|
376 | _locked_since = helpers.fmt_date(time_to_datetime(Repository\ | |||
|
377 | .get_by_repo_name(self.REPO).locked[1])) | |||
|
378 | id_, params = _build_data(self.apikey, 'lock', | |||
|
379 | repoid=self.REPO) | |||
|
380 | response = api_call(self, params) | |||
|
381 | expected = ('Repo `%s` locked by `%s`. Locked=`True`. Locked since: `%s`' | |||
|
382 | % (self.REPO, TEST_USER_ADMIN_LOGIN, _locked_since)) | |||
|
383 | self._compare_ok(id_, expected, given=response.body) | |||
|
384 | ||||
373 | @mock.patch.object(Repository, 'lock', crash) |
|
385 | @mock.patch.object(Repository, 'lock', crash) | |
374 | def test_api_lock_error(self): |
|
386 | def test_api_lock_error(self): | |
375 | id_, params = _build_data(self.apikey, 'lock', |
|
387 | id_, params = _build_data(self.apikey, 'lock', |
General Comments 0
You need to be logged in to leave comments.
Login now