##// END OF EJS Templates
merge beta fixes into stable
marcink -
r1518:55856097 merge default
parent child Browse files
Show More
@@ -1,358 +1,361 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.repo
4 4 ~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Repository model for rhodecode
7 7
8 8 :created_on: Jun 5, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25 import os
26 26 import shutil
27 27 import logging
28 28 import traceback
29 29 from datetime import datetime
30 30
31 31 from sqlalchemy.orm import joinedload, make_transient
32 32
33 33 from vcs.utils.lazy import LazyProperty
34 34 from vcs.backends import get_backend
35 35
36 36 from rhodecode.lib import safe_str
37 37
38 38 from rhodecode.model import BaseModel
39 39 from rhodecode.model.caching_query import FromCache
40 40 from rhodecode.model.db import Repository, RepoToPerm, User, Permission, \
41 41 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, Group
42 42 from rhodecode.model.user import UserModel
43 43
44 44 log = logging.getLogger(__name__)
45 45
46 46
47 47 class RepoModel(BaseModel):
48 48
49 49 @LazyProperty
50 50 def repos_path(self):
51 51 """Get's the repositories root path from database
52 52 """
53 53
54 54 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
55 55 return q.ui_value
56 56
57 57 def get(self, repo_id, cache=False):
58 58 repo = self.sa.query(Repository)\
59 59 .filter(Repository.repo_id == repo_id)
60 60
61 61 if cache:
62 62 repo = repo.options(FromCache("sql_cache_short",
63 63 "get_repo_%s" % repo_id))
64 64 return repo.scalar()
65 65
66 66 def get_by_repo_name(self, repo_name, cache=False):
67 67 repo = self.sa.query(Repository)\
68 68 .filter(Repository.repo_name == repo_name)
69 69
70 70 if cache:
71 71 repo = repo.options(FromCache("sql_cache_short",
72 72 "get_repo_%s" % repo_name))
73 73 return repo.scalar()
74 74
75 75
76 76 def get_users_js(self):
77 77
78 78 users = self.sa.query(User).filter(User.active == True).all()
79 79 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
80 80 users_array = '[%s]' % '\n'.join([u_tmpl % (u.user_id, u.name,
81 81 u.lastname, u.username)
82 82 for u in users])
83 83 return users_array
84 84
85 85 def get_users_groups_js(self):
86 86 users_groups = self.sa.query(UsersGroup)\
87 87 .filter(UsersGroup.users_group_active == True).all()
88 88
89 89 g_tmpl = '''{id:%s, grname:"%s",grmembers:"%s"},'''
90 90
91 91 users_groups_array = '[%s]' % '\n'.join([g_tmpl % \
92 92 (gr.users_group_id, gr.users_group_name,
93 93 len(gr.members))
94 94 for gr in users_groups])
95 95 return users_groups_array
96 96
97 97 def update(self, repo_name, form_data):
98 98 try:
99 99 cur_repo = self.get_by_repo_name(repo_name, cache=False)
100 100
101 101 #update permissions
102 102 for member, perm, member_type in form_data['perms_updates']:
103 103 if member_type == 'user':
104 104 r2p = self.sa.query(RepoToPerm)\
105 105 .filter(RepoToPerm.user == User.by_username(member))\
106 106 .filter(RepoToPerm.repository == cur_repo)\
107 107 .one()
108 108
109 109 r2p.permission = self.sa.query(Permission)\
110 110 .filter(Permission.permission_name ==
111 111 perm).scalar()
112 112 self.sa.add(r2p)
113 113 else:
114 114 g2p = self.sa.query(UsersGroupRepoToPerm)\
115 115 .filter(UsersGroupRepoToPerm.users_group ==
116 116 UsersGroup.get_by_group_name(member))\
117 117 .filter(UsersGroupRepoToPerm.repository ==
118 118 cur_repo).one()
119 119
120 120 g2p.permission = self.sa.query(Permission)\
121 121 .filter(Permission.permission_name ==
122 122 perm).scalar()
123 123 self.sa.add(g2p)
124 124
125 125 #set new permissions
126 126 for member, perm, member_type in form_data['perms_new']:
127 127 if member_type == 'user':
128 128 r2p = RepoToPerm()
129 129 r2p.repository = cur_repo
130 130 r2p.user = User.by_username(member)
131 131
132 132 r2p.permission = self.sa.query(Permission)\
133 133 .filter(Permission.
134 134 permission_name == perm)\
135 135 .scalar()
136 136 self.sa.add(r2p)
137 137 else:
138 138 g2p = UsersGroupRepoToPerm()
139 139 g2p.repository = cur_repo
140 140 g2p.users_group = UsersGroup.get_by_group_name(member)
141 141 g2p.permission = self.sa.query(Permission)\
142 142 .filter(Permission.
143 143 permission_name == perm)\
144 144 .scalar()
145 145 self.sa.add(g2p)
146 146
147 147 #update current repo
148 148 for k, v in form_data.items():
149 149 if k == 'user':
150 150 cur_repo.user = User.by_username(v)
151 151 elif k == 'repo_name':
152 152 cur_repo.repo_name = form_data['repo_name_full']
153 153 elif k == 'repo_group':
154 154 cur_repo.group_id = v
155 155
156 156 else:
157 157 setattr(cur_repo, k, v)
158 158
159 159 self.sa.add(cur_repo)
160 160
161 161 if repo_name != form_data['repo_name_full']:
162 162 # rename repository
163 163 self.__rename_repo(old=repo_name,
164 164 new=form_data['repo_name_full'])
165 165
166 166 self.sa.commit()
167 167 except:
168 168 log.error(traceback.format_exc())
169 169 self.sa.rollback()
170 170 raise
171 171
172 172 def create(self, form_data, cur_user, just_db=False, fork=False):
173 173
174 174 try:
175 175 if fork:
176 176 repo_name = form_data['fork_name']
177 177 org_name = form_data['repo_name']
178 178 org_full_name = org_name
179 179
180 180 else:
181 181 org_name = repo_name = form_data['repo_name']
182 182 repo_name_full = form_data['repo_name_full']
183 183
184 184 new_repo = Repository()
185 185 new_repo.enable_statistics = False
186 186 for k, v in form_data.items():
187 187 if k == 'repo_name':
188 188 if fork:
189 189 v = repo_name
190 190 else:
191 191 v = repo_name_full
192 192 if k == 'repo_group':
193 193 k = 'group_id'
194 194
195 if k == 'description':
196 v = v or repo_name
197
195 198 setattr(new_repo, k, v)
196 199
197 200 if fork:
198 201 parent_repo = self.sa.query(Repository)\
199 202 .filter(Repository.repo_name == org_full_name).one()
200 203 new_repo.fork = parent_repo
201 204
202 205 new_repo.user_id = cur_user.user_id
203 206 self.sa.add(new_repo)
204 207
205 208 #create default permission
206 209 repo_to_perm = RepoToPerm()
207 210 default = 'repository.read'
208 211 for p in UserModel(self.sa).get_by_username('default',
209 212 cache=False).user_perms:
210 213 if p.permission.permission_name.startswith('repository.'):
211 214 default = p.permission.permission_name
212 215 break
213 216
214 217 default_perm = 'repository.none' if form_data['private'] else default
215 218
216 219 repo_to_perm.permission_id = self.sa.query(Permission)\
217 220 .filter(Permission.permission_name == default_perm)\
218 221 .one().permission_id
219 222
220 223 repo_to_perm.repository = new_repo
221 224 repo_to_perm.user_id = UserModel(self.sa)\
222 225 .get_by_username('default', cache=False).user_id
223 226
224 227 self.sa.add(repo_to_perm)
225 228
226 229 if not just_db:
227 230 self.__create_repo(repo_name, form_data['repo_type'],
228 231 form_data['repo_group'],
229 232 form_data['clone_uri'])
230 233
231 234 self.sa.commit()
232 235
233 236 #now automatically start following this repository as owner
234 237 from rhodecode.model.scm import ScmModel
235 238 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
236 239 cur_user.user_id)
237 240
238 241 except:
239 242 log.error(traceback.format_exc())
240 243 self.sa.rollback()
241 244 raise
242 245
243 246 def create_fork(self, form_data, cur_user):
244 247 from rhodecode.lib.celerylib import tasks, run_task
245 248 run_task(tasks.create_repo_fork, form_data, cur_user)
246 249
247 250 def delete(self, repo):
248 251 try:
249 252 self.sa.delete(repo)
250 253 self.__delete_repo(repo)
251 254 self.sa.commit()
252 255 except:
253 256 log.error(traceback.format_exc())
254 257 self.sa.rollback()
255 258 raise
256 259
257 260 def delete_perm_user(self, form_data, repo_name):
258 261 try:
259 262 self.sa.query(RepoToPerm)\
260 263 .filter(RepoToPerm.repository \
261 264 == self.get_by_repo_name(repo_name))\
262 265 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
263 266 self.sa.commit()
264 267 except:
265 268 log.error(traceback.format_exc())
266 269 self.sa.rollback()
267 270 raise
268 271
269 272 def delete_perm_users_group(self, form_data, repo_name):
270 273 try:
271 274 self.sa.query(UsersGroupRepoToPerm)\
272 275 .filter(UsersGroupRepoToPerm.repository \
273 276 == self.get_by_repo_name(repo_name))\
274 277 .filter(UsersGroupRepoToPerm.users_group_id \
275 278 == form_data['users_group_id']).delete()
276 279 self.sa.commit()
277 280 except:
278 281 log.error(traceback.format_exc())
279 282 self.sa.rollback()
280 283 raise
281 284
282 285 def delete_stats(self, repo_name):
283 286 try:
284 287 self.sa.query(Statistics)\
285 288 .filter(Statistics.repository == \
286 289 self.get_by_repo_name(repo_name)).delete()
287 290 self.sa.commit()
288 291 except:
289 292 log.error(traceback.format_exc())
290 293 self.sa.rollback()
291 294 raise
292 295
293 296 def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
294 297 """
295 298 makes repository on filesystem. It's group aware means it'll create
296 299 a repository within a group, and alter the paths accordingly of
297 300 group location
298 301
299 302 :param repo_name:
300 303 :param alias:
301 304 :param parent_id:
302 305 :param clone_uri:
303 306 """
304 307 from rhodecode.lib.utils import is_valid_repo
305
308
306 309 if new_parent_id:
307 310 paths = Group.get(new_parent_id).full_path.split(Group.url_sep())
308 311 new_parent_path = os.sep.join(paths)
309 312 else:
310 313 new_parent_path = ''
311 314
312 315 repo_path = os.path.join(*map(lambda x:safe_str(x),
313 316 [self.repos_path, new_parent_path, repo_name]))
314 317
315 318 if is_valid_repo(repo_path, self.repos_path) is False:
316 319 log.info('creating repo %s in %s @ %s', repo_name, repo_path,
317 320 clone_uri)
318 321 backend = get_backend(alias)
319 322
320 323 backend(repo_path, create=True, src_url=clone_uri)
321 324
322 325
323 326 def __rename_repo(self, old, new):
324 327 """
325 328 renames repository on filesystem
326 329
327 330 :param old: old name
328 331 :param new: new name
329 332 """
330 333 log.info('renaming repo from %s to %s', old, new)
331 334
332 335 old_path = os.path.join(self.repos_path, old)
333 336 new_path = os.path.join(self.repos_path, new)
334 337 if os.path.isdir(new_path):
335 338 raise Exception('Was trying to rename to already existing dir %s' \
336 339 % new_path)
337 340 shutil.move(old_path, new_path)
338 341
339 342 def __delete_repo(self, repo):
340 343 """
341 344 removes repo from filesystem, the removal is acctually made by
342 345 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
343 346 repository is no longer valid for rhodecode, can be undeleted later on
344 347 by reverting the renames on this repository
345 348
346 349 :param repo: repo object
347 350 """
348 351 rm_path = os.path.join(self.repos_path, repo.repo_name)
349 352 log.info("Removing %s", rm_path)
350 353 #disable hg/git
351 354 alias = repo.repo_type
352 355 shutil.move(os.path.join(rm_path, '.%s' % alias),
353 356 os.path.join(rm_path, 'rm__.%s' % alias))
354 357 #disable repo
355 358 shutil.move(rm_path, os.path.join(self.repos_path, 'rm__%s__%s' \
356 359 % (datetime.today()\
357 360 .strftime('%Y%m%d_%H%M%S_%f'),
358 361 repo.repo_name)))
@@ -1,387 +1,388 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.user
4 4 ~~~~~~~~~~~~~~~~~~~~
5 5
6 6 users model for RhodeCode
7 7
8 8 :created_on: Apr 9, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25
26 26 import logging
27 27 import traceback
28 28
29 29 from pylons.i18n.translation import _
30 30
31 from rhodecode.lib import safe_unicode
31 32 from rhodecode.model import BaseModel
32 33 from rhodecode.model.caching_query import FromCache
33 34 from rhodecode.model.db import User, RepoToPerm, Repository, Permission, \
34 35 UserToPerm, UsersGroupRepoToPerm, UsersGroupToPerm, UsersGroupMember
35 36 from rhodecode.lib.exceptions import DefaultUserException, \
36 37 UserOwnsReposException
37 38
38 39 from sqlalchemy.exc import DatabaseError
39 40 from rhodecode.lib import generate_api_key
40 41 from sqlalchemy.orm import joinedload
41 42
42 43 log = logging.getLogger(__name__)
43 44
44 45 PERM_WEIGHTS = {'repository.none': 0,
45 46 'repository.read': 1,
46 47 'repository.write': 3,
47 48 'repository.admin': 3}
48 49
49 50
50 51 class UserModel(BaseModel):
51 52
52 53 def get(self, user_id, cache=False):
53 54 user = self.sa.query(User)
54 55 if cache:
55 56 user = user.options(FromCache("sql_cache_short",
56 57 "get_user_%s" % user_id))
57 58 return user.get(user_id)
58 59
59 60 def get_by_username(self, username, cache=False, case_insensitive=False):
60 61
61 62 if case_insensitive:
62 63 user = self.sa.query(User).filter(User.username.ilike(username))
63 64 else:
64 65 user = self.sa.query(User)\
65 66 .filter(User.username == username)
66 67 if cache:
67 68 user = user.options(FromCache("sql_cache_short",
68 69 "get_user_%s" % username))
69 70 return user.scalar()
70 71
71 72 def get_by_api_key(self, api_key, cache=False):
72 73
73 74 user = self.sa.query(User)\
74 75 .filter(User.api_key == api_key)
75 76 if cache:
76 77 user = user.options(FromCache("sql_cache_short",
77 78 "get_user_%s" % api_key))
78 79 return user.scalar()
79 80
80 81 def create(self, form_data):
81 82 try:
82 83 new_user = User()
83 84 for k, v in form_data.items():
84 85 setattr(new_user, k, v)
85 86
86 87 new_user.api_key = generate_api_key(form_data['username'])
87 88 self.sa.add(new_user)
88 89 self.sa.commit()
89 90 except:
90 91 log.error(traceback.format_exc())
91 92 self.sa.rollback()
92 93 raise
93 94
94 95 def create_ldap(self, username, password, user_dn, attrs):
95 96 """
96 97 Checks if user is in database, if not creates this user marked
97 98 as ldap user
98 99 :param username:
99 100 :param password:
100 101 :param user_dn:
101 102 :param attrs:
102 103 """
103 104 from rhodecode.lib.auth import get_crypt_password
104 105 log.debug('Checking for such ldap account in RhodeCode database')
105 106 if self.get_by_username(username, case_insensitive=True) is None:
106 107 try:
107 108 new_user = User()
108 109 # add ldap account always lowercase
109 110 new_user.username = username.lower()
110 111 new_user.password = get_crypt_password(password)
111 112 new_user.api_key = generate_api_key(username)
112 113 new_user.email = attrs['email']
113 114 new_user.active = True
114 new_user.ldap_dn = user_dn
115 new_user.ldap_dn = safe_unicode(user_dn)
115 116 new_user.name = attrs['name']
116 117 new_user.lastname = attrs['lastname']
117 118
118 119 self.sa.add(new_user)
119 120 self.sa.commit()
120 121 return True
121 122 except (DatabaseError,):
122 123 log.error(traceback.format_exc())
123 124 self.sa.rollback()
124 125 raise
125 126 log.debug('this %s user exists skipping creation of ldap account',
126 127 username)
127 128 return False
128 129
129 130 def create_registration(self, form_data):
130 131 from rhodecode.lib.celerylib import tasks, run_task
131 132 try:
132 133 new_user = User()
133 134 for k, v in form_data.items():
134 135 if k != 'admin':
135 136 setattr(new_user, k, v)
136 137
137 138 self.sa.add(new_user)
138 139 self.sa.commit()
139 140 body = ('New user registration\n'
140 141 'username: %s\n'
141 142 'email: %s\n')
142 143 body = body % (form_data['username'], form_data['email'])
143 144
144 145 run_task(tasks.send_email, None,
145 146 _('[RhodeCode] New User registration'),
146 147 body)
147 148 except:
148 149 log.error(traceback.format_exc())
149 150 self.sa.rollback()
150 151 raise
151 152
152 153 def update(self, user_id, form_data):
153 154 try:
154 155 user = self.get(user_id, cache=False)
155 156 if user.username == 'default':
156 157 raise DefaultUserException(
157 158 _("You can't Edit this user since it's"
158 159 " crucial for entire application"))
159 160
160 161 for k, v in form_data.items():
161 162 if k == 'new_password' and v != '':
162 163 user.password = v
163 164 user.api_key = generate_api_key(user.username)
164 165 else:
165 166 setattr(user, k, v)
166 167
167 168 self.sa.add(user)
168 169 self.sa.commit()
169 170 except:
170 171 log.error(traceback.format_exc())
171 172 self.sa.rollback()
172 173 raise
173 174
174 175 def update_my_account(self, user_id, form_data):
175 176 try:
176 177 user = self.get(user_id, cache=False)
177 178 if user.username == 'default':
178 179 raise DefaultUserException(
179 180 _("You can't Edit this user since it's"
180 181 " crucial for entire application"))
181 182 for k, v in form_data.items():
182 183 if k == 'new_password' and v != '':
183 184 user.password = v
184 185 user.api_key = generate_api_key(user.username)
185 186 else:
186 187 if k not in ['admin', 'active']:
187 188 setattr(user, k, v)
188 189
189 190 self.sa.add(user)
190 191 self.sa.commit()
191 192 except:
192 193 log.error(traceback.format_exc())
193 194 self.sa.rollback()
194 195 raise
195 196
196 197 def delete(self, user_id):
197 198 try:
198 199 user = self.get(user_id, cache=False)
199 200 if user.username == 'default':
200 201 raise DefaultUserException(
201 202 _("You can't remove this user since it's"
202 203 " crucial for entire application"))
203 204 if user.repositories:
204 205 raise UserOwnsReposException(_('This user still owns %s '
205 206 'repositories and cannot be '
206 207 'removed. Switch owners or '
207 208 'remove those repositories') \
208 209 % user.repositories)
209 210 self.sa.delete(user)
210 211 self.sa.commit()
211 212 except:
212 213 log.error(traceback.format_exc())
213 214 self.sa.rollback()
214 215 raise
215 216
216 217 def reset_password_link(self, data):
217 218 from rhodecode.lib.celerylib import tasks, run_task
218 219 run_task(tasks.send_password_link, data['email'])
219 220
220 221 def reset_password(self, data):
221 222 from rhodecode.lib.celerylib import tasks, run_task
222 223 run_task(tasks.reset_user_password, data['email'])
223 224
224 225 def fill_data(self, auth_user, user_id=None, api_key=None):
225 226 """
226 227 Fetches auth_user by user_id,or api_key if present.
227 228 Fills auth_user attributes with those taken from database.
228 229 Additionally set's is_authenitated if lookup fails
229 230 present in database
230 231
231 232 :param auth_user: instance of user to set attributes
232 233 :param user_id: user id to fetch by
233 234 :param api_key: api key to fetch by
234 235 """
235 236 if user_id is None and api_key is None:
236 237 raise Exception('You need to pass user_id or api_key')
237 238
238 239 try:
239 240 if api_key:
240 241 dbuser = self.get_by_api_key(api_key)
241 242 else:
242 243 dbuser = self.get(user_id)
243 244
244 245 if dbuser is not None:
245 246 log.debug('filling %s data', dbuser)
246 247 for k, v in dbuser.get_dict().items():
247 248 setattr(auth_user, k, v)
248 249
249 250 except:
250 251 log.error(traceback.format_exc())
251 252 auth_user.is_authenticated = False
252 253
253 254 return auth_user
254 255
255 256 def fill_perms(self, user):
256 257 """
257 258 Fills user permission attribute with permissions taken from database
258 259 works for permissions given for repositories, and for permissions that
259 260 are granted to groups
260 261
261 262 :param user: user instance to fill his perms
262 263 """
263 264
264 265 user.permissions['repositories'] = {}
265 266 user.permissions['global'] = set()
266 267
267 268 #======================================================================
268 269 # fetch default permissions
269 270 #======================================================================
270 271 default_user = self.get_by_username('default', cache=True)
271 272
272 273 default_perms = self.sa.query(RepoToPerm, Repository, Permission)\
273 274 .join((Repository, RepoToPerm.repository_id ==
274 275 Repository.repo_id))\
275 276 .join((Permission, RepoToPerm.permission_id ==
276 277 Permission.permission_id))\
277 278 .filter(RepoToPerm.user == default_user).all()
278 279
279 280 if user.is_admin:
280 281 #==================================================================
281 282 # #admin have all default rights set to admin
282 283 #==================================================================
283 284 user.permissions['global'].add('hg.admin')
284 285
285 286 for perm in default_perms:
286 287 p = 'repository.admin'
287 288 user.permissions['repositories'][perm.RepoToPerm.
288 289 repository.repo_name] = p
289 290
290 291 else:
291 292 #==================================================================
292 293 # set default permissions
293 294 #==================================================================
294 295 uid = user.user_id
295 296
296 297 #default global
297 298 default_global_perms = self.sa.query(UserToPerm)\
298 299 .filter(UserToPerm.user == default_user)
299 300
300 301 for perm in default_global_perms:
301 302 user.permissions['global'].add(perm.permission.permission_name)
302 303
303 304 #default for repositories
304 305 for perm in default_perms:
305 306 if perm.Repository.private and not (perm.Repository.user_id ==
306 307 uid):
307 308 #diself.sable defaults for private repos,
308 309 p = 'repository.none'
309 310 elif perm.Repository.user_id == uid:
310 311 #set admin if owner
311 312 p = 'repository.admin'
312 313 else:
313 314 p = perm.Permission.permission_name
314 315
315 316 user.permissions['repositories'][perm.RepoToPerm.
316 317 repository.repo_name] = p
317 318
318 319 #==================================================================
319 320 # overwrite default with user permissions if any
320 321 #==================================================================
321 322
322 323 #user global
323 324 user_perms = self.sa.query(UserToPerm)\
324 325 .options(joinedload(UserToPerm.permission))\
325 326 .filter(UserToPerm.user_id == uid).all()
326 327
327 328 for perm in user_perms:
328 329 user.permissions['global'].add(perm.permission.
329 330 permission_name)
330 331
331 332 #user repositories
332 333 user_repo_perms = self.sa.query(RepoToPerm, Permission,
333 334 Repository)\
334 335 .join((Repository, RepoToPerm.repository_id ==
335 336 Repository.repo_id))\
336 337 .join((Permission, RepoToPerm.permission_id ==
337 338 Permission.permission_id))\
338 339 .filter(RepoToPerm.user_id == uid).all()
339 340
340 341 for perm in user_repo_perms:
341 342 # set admin if owner
342 343 if perm.Repository.user_id == uid:
343 344 p = 'repository.admin'
344 345 else:
345 346 p = perm.Permission.permission_name
346 347 user.permissions['repositories'][perm.RepoToPerm.
347 348 repository.repo_name] = p
348 349
349 350 #==================================================================
350 351 # check if user is part of groups for this repository and fill in
351 352 # (or replace with higher) permissions
352 353 #==================================================================
353 354
354 355 #users group global
355 356 user_perms_from_users_groups = self.sa.query(UsersGroupToPerm)\
356 357 .options(joinedload(UsersGroupToPerm.permission))\
357 358 .join((UsersGroupMember, UsersGroupToPerm.users_group_id ==
358 359 UsersGroupMember.users_group_id))\
359 360 .filter(UsersGroupMember.user_id == uid).all()
360 361
361 362 for perm in user_perms_from_users_groups:
362 363 user.permissions['global'].add(perm.permission.permission_name)
363 364
364 365 #users group repositories
365 366 user_repo_perms_from_users_groups = self.sa.query(
366 367 UsersGroupRepoToPerm,
367 368 Permission, Repository,)\
368 369 .join((Repository, UsersGroupRepoToPerm.repository_id ==
369 370 Repository.repo_id))\
370 371 .join((Permission, UsersGroupRepoToPerm.permission_id ==
371 372 Permission.permission_id))\
372 373 .join((UsersGroupMember, UsersGroupRepoToPerm.users_group_id ==
373 374 UsersGroupMember.users_group_id))\
374 375 .filter(UsersGroupMember.user_id == uid).all()
375 376
376 377 for perm in user_repo_perms_from_users_groups:
377 378 p = perm.Permission.permission_name
378 379 cur_perm = user.permissions['repositories'][perm.
379 380 UsersGroupRepoToPerm.
380 381 repository.repo_name]
381 382 #overwrite permission only if it's greater than permission
382 383 # given from other sources
383 384 if PERM_WEIGHTS[p] > PERM_WEIGHTS[cur_perm]:
384 385 user.permissions['repositories'][perm.UsersGroupRepoToPerm.
385 386 repository.repo_name] = p
386 387
387 388 return user
General Comments 0
You need to be logged in to leave comments. Login now