Mercurial > kallithea
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) |