Show More
@@ -178,7 +178,8 b' lock' | |||
|
178 | 178 | ---- |
|
179 | 179 | |
|
180 | 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 | 183 | This command can be executed only using api_key belonging to user with admin |
|
183 | 184 | rights or regular user that have admin or write access to repository. |
|
184 | 185 | |
@@ -190,7 +191,7 b' INPUT::' | |||
|
190 | 191 | args : { |
|
191 | 192 | "repoid" : "<reponame or repo_id>" |
|
192 | 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 | 197 | OUTPUT:: |
@@ -27,14 +27,14 b'' | |||
|
27 | 27 | |
|
28 | 28 | import traceback |
|
29 | 29 | import logging |
|
30 | from pylons.controllers.util import abort | |
|
31 | 30 | |
|
32 | 31 | from rhodecode.controllers.api import JSONRPCController, JSONRPCError |
|
33 | 32 | from rhodecode.lib.auth import PasswordGenerator, AuthUser, \ |
|
34 | 33 | HasPermissionAllDecorator, HasPermissionAnyDecorator, \ |
|
35 | 34 | HasPermissionAnyApi, HasRepoPermissionAnyApi |
|
36 | 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 | 38 | from rhodecode.model.meta import Session |
|
39 | 39 | from rhodecode.model.scm import ScmModel |
|
40 | 40 | from rhodecode.model.repo import RepoModel |
@@ -229,7 +229,8 b' class ApiController(JSONRPCController):' | |||
|
229 | 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 | 235 | Set locking state on particular repository by given user, if |
|
235 | 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 | 259 | if isinstance(userid, Optional): |
|
259 | 260 | userid = apiuser.user_id |
|
261 | ||
|
260 | 262 | user = get_user_or_error(userid) |
|
261 | locked = str2bool(locked) | |
|
262 | try: | |
|
263 | if locked: | |
|
264 | Repository.lock(repo, user.user_id) | |
|
263 | ||
|
264 | if isinstance(locked, Optional): | |
|
265 | lockobj = Repository.getlock(repo) | |
|
266 | ||
|
267 | if lockobj[0] is None: | |
|
268 | return ('Repo `%s` not locked. Locked=`False`.' | |
|
269 | % (repo.repo_name)) | |
|
265 | 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`' | |
|
269 | % (user.username, repo.repo_name, locked)) | |
|
270 | except Exception: | |
|
271 | log.error(traceback.format_exc()) | |
|
272 | raise JSONRPCError( | |
|
273 | 'Error occurred locking repository `%s`' % repo.repo_name | |
|
274 | ) | |
|
274 | return ('Repo `%s` locked by `%s`. Locked=`True`. ' | |
|
275 | 'Locked since: `%s`' | |
|
276 | % (repo.repo_name, user.username, | |
|
277 | h.fmt_date(time_to_datetime(time_)))) | |
|
278 | ||
|
279 | else: | |
|
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 | 295 | @HasPermissionAllDecorator('hg.admin') |
|
277 | 296 | def show_ip(self, apiuser, userid): |
@@ -1002,6 +1002,10 b' class Repository(Base, BaseModel):' | |||
|
1002 | 1002 | Session().add(repo) |
|
1003 | 1003 | Session().commit() |
|
1004 | 1004 | |
|
1005 | @classmethod | |
|
1006 | def getlock(cls, repo): | |
|
1007 | return repo.locked | |
|
1008 | ||
|
1005 | 1009 | @property |
|
1006 | 1010 | def last_db_change(self): |
|
1007 | 1011 | return self.updated_on |
@@ -370,6 +370,18 b' class BaseTestApi(object):' | |||
|
370 | 370 | % (TEST_USER_ADMIN_LOGIN, self.REPO, True)) |
|
371 | 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 | 385 | @mock.patch.object(Repository, 'lock', crash) |
|
374 | 386 | def test_api_lock_error(self): |
|
375 | 387 | id_, params = _build_data(self.apikey, 'lock', |
General Comments 0
You need to be logged in to leave comments.
Login now