comparison rhodecode/controllers/api/api.py @ 3959:e1a0fdaecf63 beta

backported update_repo API method from rhodecode-pam
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 07 Jun 2013 00:21:45 +0200
parents 1cb0a1f82fb4
children 5293d4bbb1ea
comparison
equal deleted inserted replaced
3958:1cb0a1f82fb4 3959:e1a0fdaecf63
33 from rhodecode.lib.auth import PasswordGenerator, AuthUser, \ 33 from rhodecode.lib.auth import PasswordGenerator, AuthUser, \
34 HasPermissionAllDecorator, HasPermissionAnyDecorator, \ 34 HasPermissionAllDecorator, HasPermissionAnyDecorator, \
35 HasPermissionAnyApi, HasRepoPermissionAnyApi 35 HasPermissionAnyApi, HasRepoPermissionAnyApi
36 from rhodecode.lib.utils import map_groups, repo2db_mapper 36 from rhodecode.lib.utils import map_groups, repo2db_mapper
37 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_int 37 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_int
38 from rhodecode.lib import helpers as h
39 from rhodecode.model.meta import Session 38 from rhodecode.model.meta import Session
40 from rhodecode.model.scm import ScmModel 39 from rhodecode.model.scm import ScmModel
41 from rhodecode.model.repo import RepoModel 40 from rhodecode.model.repo import RepoModel
42 from rhodecode.model.user import UserModel 41 from rhodecode.model.user import UserModel
43 from rhodecode.model.users_group import UserGroupModel 42 from rhodecode.model.users_group import UserGroupModel
43 from rhodecode.model.repos_group import ReposGroupModel
44 from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap,\ 44 from rhodecode.model.db import Repository, RhodeCodeSetting, UserIpMap,\
45 Permission, User, Gist 45 Permission, User, Gist
46 from rhodecode.lib.compat import json 46 from rhodecode.lib.compat import json
47 from rhodecode.lib.exceptions import DefaultUserException 47 from rhodecode.lib.exceptions import DefaultUserException
48 from rhodecode.model.gist import GistModel 48 from rhodecode.model.gist import GistModel
49 49
50 log = logging.getLogger(__name__) 50 log = logging.getLogger(__name__)
51 51
52 52
53 def store_update(updates, attr, name):
54 """
55 Stores param in updates dict if it's not instance of Optional
56 allows easy updates of passed in params
57 """
58 if not isinstance(attr, Optional):
59 updates[name] = attr
60
61
53 class OptionalAttr(object): 62 class OptionalAttr(object):
54 """ 63 """
55 Special Optional Option that defines other attribute 64 Special Optional Option that defines other attribute
56 """ 65 """
57 def __init__(self, attr_name): 66 def __init__(self, attr_name):
120 """ 129 """
121 repo = RepoModel().get_repo(repoid) 130 repo = RepoModel().get_repo(repoid)
122 if repo is None: 131 if repo is None:
123 raise JSONRPCError('repository `%s` does not exist' % (repoid)) 132 raise JSONRPCError('repository `%s` does not exist' % (repoid))
124 return repo 133 return repo
134
135
136 def get_repo_group_or_error(repogroupid):
137 """
138 Get repo group by id or name or return JsonRPCError if not found
139
140 :param repogroupid:
141 """
142 repo_group = ReposGroupModel()._get_repo_group(repogroupid)
143 if repo_group is None:
144 raise JSONRPCError(
145 'repository group `%s` does not exist' % (repogroupid,))
146 return repo_group
125 147
126 148
127 def get_users_group_or_error(usersgroupid): 149 def get_users_group_or_error(usersgroupid):
128 """ 150 """
129 Get user group by id or name or return JsonRPCError if not found 151 Get user group by id or name or return JsonRPCError if not found
827 ) 849 )
828 except Exception: 850 except Exception:
829 log.error(traceback.format_exc()) 851 log.error(traceback.format_exc())
830 raise JSONRPCError('failed to create repository `%s`' % repo_name) 852 raise JSONRPCError('failed to create repository `%s`' % repo_name)
831 853
854 # permission check inside
855 def update_repo(self, apiuser, repoid, name=Optional(None),
856 owner=Optional(OAttr('apiuser')),
857 group=Optional(None),
858 description=Optional(''), private=Optional(False),
859 clone_uri=Optional(None), landing_rev=Optional('tip'),
860 enable_statistics=Optional(False),
861 enable_locking=Optional(False),
862 enable_downloads=Optional(False)):
863
864 """
865 Updates repo
866
867 :param apiuser: filled automatically from apikey
868 :type apiuser: AuthUser
869 :param repoid: repository name or repository id
870 :type repoid: str or int
871 :param name:
872 :param owner:
873 :param group:
874 :param description:
875 :param private:
876 :param clone_uri:
877 :param landing_rev:
878 :param enable_statistics:
879 :param enable_locking:
880 :param enable_downloads:
881 """
882 repo = get_repo_or_error(repoid)
883 if not HasPermissionAnyApi('hg.admin')(user=apiuser):
884 # check if we have admin permission for this repo !
885 if not HasRepoPermissionAnyApi('repository.admin')(user=apiuser,
886 repo_name=repo.repo_name):
887 raise JSONRPCError('repository `%s` does not exist' % (repoid,))
888
889 updates = {
890 # update function requires this.
891 'repo_name': repo.repo_name
892 }
893 repo_group = group
894 if not isinstance(repo_group, Optional):
895 repo_group = get_repo_group_or_error(repo_group)
896 repo_group = repo_group.group_id
897 try:
898 store_update(updates, name, 'repo_name')
899 store_update(updates, repo_group, 'repo_group')
900 store_update(updates, owner, 'user')
901 store_update(updates, description, 'repo_description')
902 store_update(updates, private, 'repo_private')
903 store_update(updates, clone_uri, 'clone_uri')
904 store_update(updates, landing_rev, 'repo_landing_rev')
905 store_update(updates, enable_statistics, 'repo_enable_statistics')
906 store_update(updates, enable_locking, 'repo_enable_locking')
907 store_update(updates, enable_downloads, 'repo_enable_downloads')
908
909 RepoModel().update(repo, **updates)
910 Session().commit()
911 return dict(
912 msg='updated repo ID:%s %s' % (repo.repo_id, repo.repo_name),
913 repository=repo.get_api_data()
914 )
915 except Exception:
916 log.error(traceback.format_exc())
917 raise JSONRPCError('failed to update repo `%s`' % repoid)
918
832 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository') 919 @HasPermissionAnyDecorator('hg.admin', 'hg.fork.repository')
833 def fork_repo(self, apiuser, repoid, fork_name, owner=Optional(OAttr('apiuser')), 920 def fork_repo(self, apiuser, repoid, fork_name, owner=Optional(OAttr('apiuser')),
834 description=Optional(''), copy_permissions=Optional(False), 921 description=Optional(''), copy_permissions=Optional(False),
835 private=Optional(False), landing_rev=Optional('tip')): 922 private=Optional(False), landing_rev=Optional('tip')):
836 repo = get_repo_or_error(repoid) 923 repo = get_repo_or_error(repoid)