##// END OF EJS Templates
removed leftover repr fix
marcink -
r1369:4b82a87b beta
parent child Browse files
Show More
@@ -1,705 +1,704 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.db
4 4 ~~~~~~~~~~~~~~~~~~
5 5
6 6 Database Models for RhodeCode
7 7
8 8 :created_on: Apr 08, 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 os
27 27 import logging
28 28 import datetime
29 29 import traceback
30 30 from datetime import date
31 31
32 32 from sqlalchemy import *
33 33 from sqlalchemy.exc import DatabaseError
34 34 from sqlalchemy.orm import relationship, backref, joinedload
35 35 from sqlalchemy.orm.interfaces import MapperExtension
36 36
37 37 from beaker.cache import cache_region, region_invalidate
38 38
39 39 from vcs import get_backend
40 40 from vcs.utils.helpers import get_scm
41 41 from vcs.exceptions import RepositoryError, VCSError
42 42 from vcs.utils.lazy import LazyProperty
43 43 from vcs.nodes import FileNode
44 44
45 45 from rhodecode.lib import str2bool
46 46 from rhodecode.model.meta import Base, Session
47 47 from rhodecode.model.caching_query import FromCache
48 48
49 49 log = logging.getLogger(__name__)
50 50
51 51 #==============================================================================
52 52 # MAPPER EXTENSIONS
53 53 #==============================================================================
54 54
55 55 class RepositoryMapper(MapperExtension):
56 56 def after_update(self, mapper, connection, instance):
57 57 pass
58 58
59 59
60 60 class RhodeCodeSettings(Base):
61 61 __tablename__ = 'rhodecode_settings'
62 62 __table_args__ = (UniqueConstraint('app_settings_name'), {'extend_existing':True})
63 63 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
64 64 app_settings_name = Column("app_settings_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
65 65 app_settings_value = Column("app_settings_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
66 66
67 67 def __init__(self, k='', v=''):
68 68 self.app_settings_name = k
69 69 self.app_settings_value = v
70 70
71 71 def __repr__(self):
72 72 return "<%s('%s:%s')>" % (self.__class__.__name__,
73 73 self.app_settings_name, self.app_settings_value)
74 74
75 75
76 76 @classmethod
77 77 def get_by_name(cls, ldap_key):
78 78 return Session.query(cls)\
79 79 .filter(cls.app_settings_name == ldap_key).scalar()
80 80
81 81 @classmethod
82 82 def get_app_settings(cls, cache=False):
83 83
84 84 ret = Session.query(cls)
85 85
86 86 if cache:
87 87 ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
88 88
89 89 if not ret:
90 90 raise Exception('Could not get application settings !')
91 91 settings = {}
92 92 for each in ret:
93 93 settings['rhodecode_' + each.app_settings_name] = \
94 94 each.app_settings_value
95 95
96 96 return settings
97 97
98 98 @classmethod
99 99 def get_ldap_settings(cls, cache=False):
100 100 ret = Session.query(cls)\
101 101 .filter(cls.app_settings_name.startswith('ldap_'))\
102 102 .all()
103 103 fd = {}
104 104 for row in ret:
105 105 fd.update({row.app_settings_name:row.app_settings_value})
106 106 return fd
107 107
108 108
109 109 class RhodeCodeUi(Base):
110 110 __tablename__ = 'rhodecode_ui'
111 111 __table_args__ = {'extend_existing':True}
112 112 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
113 113 ui_section = Column("ui_section", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
114 114 ui_key = Column("ui_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
115 115 ui_value = Column("ui_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
116 116 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
117 117
118 118
119 119 @classmethod
120 120 def get_by_key(cls, key):
121 121 return Session.query(cls).filter(cls.ui_key == key)
122 122
123 123
124 124 class User(Base):
125 125 __tablename__ = 'users'
126 126 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'extend_existing':True})
127 127 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
128 128 username = Column("username", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
129 129 password = Column("password", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
130 130 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
131 131 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
132 132 name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
133 133 lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
134 134 email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
135 135 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
136 136 ldap_dn = Column("ldap_dn", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
137 137 api_key = Column("api_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
138 138
139 139 user_log = relationship('UserLog', cascade='all')
140 140 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
141 141
142 142 repositories = relationship('Repository')
143 143 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
144 144 repo_to_perm = relationship('RepoToPerm', primaryjoin='RepoToPerm.user_id==User.user_id', cascade='all')
145 145
146 146 group_member = relationship('UsersGroupMember', cascade='all')
147 147
148 148 @property
149 149 def full_contact(self):
150 150 return '%s %s <%s>' % (self.name, self.lastname, self.email)
151 151
152 152 @property
153 153 def short_contact(self):
154 154 return '%s %s' % (self.name, self.lastname)
155 155
156 156
157 157 @property
158 158 def is_admin(self):
159 159 return self.admin
160 160
161 161 def __repr__(self):
162 return 'ahmmm'
163 162 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
164 163 self.user_id, self.username)
165 164
166 165 @classmethod
167 166 def by_username(cls, username):
168 167 return Session.query(cls).filter(cls.username == username).one()
169 168
170 169
171 170 def update_lastlogin(self):
172 171 """Update user lastlogin"""
173 172
174 173 try:
175 174 session = Session.object_session(self)
176 175 self.last_login = datetime.datetime.now()
177 176 session.add(self)
178 177 session.commit()
179 178 log.debug('updated user %s lastlogin', self.username)
180 179 except (DatabaseError,):
181 180 session.rollback()
182 181
183 182
184 183 class UserLog(Base):
185 184 __tablename__ = 'user_logs'
186 185 __table_args__ = {'extend_existing':True}
187 186 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
188 187 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
189 188 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
190 189 repository_name = Column("repository_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
191 190 user_ip = Column("user_ip", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
192 191 action = Column("action", UnicodeText(length=1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
193 192 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
194 193
195 194 @property
196 195 def action_as_day(self):
197 196 return date(*self.action_date.timetuple()[:3])
198 197
199 198 user = relationship('User')
200 199 repository = relationship('Repository')
201 200
202 201
203 202 class UsersGroup(Base):
204 203 __tablename__ = 'users_groups'
205 204 __table_args__ = {'extend_existing':True}
206 205
207 206 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
208 207 users_group_name = Column("users_group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
209 208 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
210 209
211 210 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
212 211
213 212
214 213 @classmethod
215 214 def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
216 215 if case_insensitive:
217 216 gr = Session.query(cls)\
218 217 .filter(cls.users_group_name.ilike(group_name))
219 218 else:
220 219 gr = Session.query(UsersGroup)\
221 220 .filter(UsersGroup.users_group_name == group_name)
222 221 if cache:
223 222 gr = gr.options(FromCache("sql_cache_short",
224 223 "get_user_%s" % group_name))
225 224 return gr.scalar()
226 225
227 226 class UsersGroupMember(Base):
228 227 __tablename__ = 'users_groups_members'
229 228 __table_args__ = {'extend_existing':True}
230 229
231 230 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
232 231 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
233 232 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
234 233
235 234 user = relationship('User', lazy='joined')
236 235 users_group = relationship('UsersGroup')
237 236
238 237 def __init__(self, gr_id='', u_id=''):
239 238 self.users_group_id = gr_id
240 239 self.user_id = u_id
241 240
242 241 class Repository(Base):
243 242 __tablename__ = 'repositories'
244 243 __table_args__ = (UniqueConstraint('repo_name'), {'extend_existing':True},)
245 244 __mapper_args__ = {'extension':RepositoryMapper()}
246 245
247 246 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
248 247 repo_name = Column("repo_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
249 248 clone_uri = Column("clone_uri", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
250 249 repo_type = Column("repo_type", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
251 250 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
252 251 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
253 252 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
254 253 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
255 254 description = Column("description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
256 255 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
257 256
258 257 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
259 258 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
260 259
261 260
262 261 user = relationship('User')
263 262 fork = relationship('Repository', remote_side=repo_id)
264 263 group = relationship('Group')
265 264 repo_to_perm = relationship('RepoToPerm', cascade='all', order_by='RepoToPerm.repo_to_perm_id')
266 265 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
267 266 stats = relationship('Statistics', cascade='all', uselist=False)
268 267
269 268 followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
270 269
271 270 logs = relationship('UserLog', cascade='all')
272 271
273 272 def __repr__(self):
274 273 return "<%s('%s:%s')>" % (self.__class__.__name__,
275 274 self.repo_id, self.repo_name)
276 275
277 276 @classmethod
278 277 def by_repo_name(cls, repo_name):
279 278 q = Session.query(cls).filter(cls.repo_name == repo_name)
280 279
281 280 q = q.options(joinedload(Repository.fork))\
282 281 .options(joinedload(Repository.user))\
283 282 .options(joinedload(Repository.group))\
284 283
285 284 return q.one()
286 285
287 286 @classmethod
288 287 def get_repo_forks(cls, repo_id):
289 288 return Session.query(cls).filter(Repository.fork_id == repo_id)
290 289
291 290 @property
292 291 def just_name(self):
293 292 return self.repo_name.split(os.sep)[-1]
294 293
295 294 @property
296 295 def groups_with_parents(self):
297 296 groups = []
298 297 if self.group is None:
299 298 return groups
300 299
301 300 cur_gr = self.group
302 301 groups.insert(0, cur_gr)
303 302 while 1:
304 303 gr = getattr(cur_gr, 'parent_group', None)
305 304 cur_gr = cur_gr.parent_group
306 305 if gr is None:
307 306 break
308 307 groups.insert(0, gr)
309 308
310 309 return groups
311 310
312 311 @property
313 312 def groups_and_repo(self):
314 313 return self.groups_with_parents, self.just_name
315 314
316 315 @LazyProperty
317 316 def repo_path(self):
318 317 """
319 318 Returns base full path for that repository means where it actually
320 319 exists on a filesystem
321 320 """
322 321 q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/')
323 322 q.options(FromCache("sql_cache_short", "repository_repo_path"))
324 323 return q.one().ui_value
325 324
326 325 @property
327 326 def repo_full_path(self):
328 327 p = [self.repo_path]
329 328 # we need to split the name by / since this is how we store the
330 329 # names in the database, but that eventually needs to be converted
331 330 # into a valid system path
332 331 p += self.repo_name.split('/')
333 332 return os.path.join(*p)
334 333
335 334 @property
336 335 def _ui(self):
337 336 """
338 337 Creates an db based ui object for this repository
339 338 """
340 339 from mercurial import ui
341 340 from mercurial import config
342 341 baseui = ui.ui()
343 342
344 343 #clean the baseui object
345 344 baseui._ocfg = config.config()
346 345 baseui._ucfg = config.config()
347 346 baseui._tcfg = config.config()
348 347
349 348
350 349 ret = Session.query(RhodeCodeUi)\
351 350 .options(FromCache("sql_cache_short",
352 351 "repository_repo_ui")).all()
353 352
354 353 hg_ui = ret
355 354 for ui_ in hg_ui:
356 355 if ui_.ui_active:
357 356 log.debug('settings ui from db[%s]%s:%s', ui_.ui_section,
358 357 ui_.ui_key, ui_.ui_value)
359 358 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
360 359
361 360 return baseui
362 361
363 362 #==========================================================================
364 363 # SCM CACHE INSTANCE
365 364 #==========================================================================
366 365
367 366 @property
368 367 def invalidate(self):
369 368 """
370 369 Returns Invalidation object if this repo should be invalidated
371 370 None otherwise. `cache_active = False` means that this cache
372 371 state is not valid and needs to be invalidated
373 372 """
374 373 return Session.query(CacheInvalidation)\
375 374 .filter(CacheInvalidation.cache_key == self.repo_name)\
376 375 .filter(CacheInvalidation.cache_active == False)\
377 376 .scalar()
378 377
379 378 @property
380 379 def set_invalidate(self):
381 380 """
382 381 set a cache for invalidation for this instance
383 382 """
384 383 inv = Session.query(CacheInvalidation)\
385 384 .filter(CacheInvalidation.cache_key == self.repo_name)\
386 385 .scalar()
387 386
388 387 if inv is None:
389 388 inv = CacheInvalidation(self.repo_name)
390 389 inv.cache_active = True
391 390 Session.add(inv)
392 391 Session.commit()
393 392
394 393 @property
395 394 def scm_instance(self):
396 395 return self.__get_instance(self.repo_name)
397 396
398 397 @property
399 398 def scm_instance_cached(self):
400 399 @cache_region('long_term')
401 400 def _c(repo_name):
402 401 return self.__get_instance(repo_name)
403 402
404 403 inv = self.invalidate
405 404 if inv:
406 405 region_invalidate(_c, None, self.repo_name)
407 406 #update our cache
408 407 inv.cache_key.cache_active = True
409 408 Session.add(inv)
410 409 Session.commit()
411 410
412 411 return _c(self.repo_name)
413 412
414 413 def __get_instance(self, repo_name):
415 414
416 415 repo_full_path = self.repo_full_path
417 416
418 417 try:
419 418 alias = get_scm(repo_full_path)[0]
420 419 log.debug('Creating instance of %s repository', alias)
421 420 backend = get_backend(alias)
422 421 except VCSError:
423 422 log.error(traceback.format_exc())
424 423 log.error('Perhaps this repository is in db and not in '
425 424 'filesystem run rescan repositories with '
426 425 '"destroy old data " option from admin panel')
427 426 return
428 427
429 428 if alias == 'hg':
430 429 repo = backend(repo_full_path, create=False,
431 430 baseui=self._ui)
432 431 #skip hidden web repository
433 432 if repo._get_hidden():
434 433 return
435 434 else:
436 435 repo = backend(repo_full_path, create=False)
437 436
438 437 return repo
439 438
440 439
441 440 class Group(Base):
442 441 __tablename__ = 'groups'
443 442 __table_args__ = (UniqueConstraint('group_name', 'group_parent_id'),
444 443 CheckConstraint('group_id != group_parent_id'), {'extend_existing':True},)
445 444 __mapper_args__ = {'order_by':'group_name'}
446 445
447 446 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
448 447 group_name = Column("group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
449 448 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
450 449 group_description = Column("group_description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
451 450
452 451 parent_group = relationship('Group', remote_side=group_id)
453 452
454 453
455 454 def __init__(self, group_name='', parent_group=None):
456 455 self.group_name = group_name
457 456 self.parent_group = parent_group
458 457
459 458 def __repr__(self):
460 459 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
461 460 self.group_name)
462 461
463 462 @classmethod
464 463 def url_sep(cls):
465 464 return '/'
466 465
467 466 @property
468 467 def parents(self):
469 468 parents_limit = 5
470 469 groups = []
471 470 if self.parent_group is None:
472 471 return groups
473 472 cur_gr = self.parent_group
474 473 groups.insert(0, cur_gr)
475 474 cnt = 0
476 475 while 1:
477 476 cnt += 1
478 477 gr = getattr(cur_gr, 'parent_group', None)
479 478 cur_gr = cur_gr.parent_group
480 479 if gr is None:
481 480 break
482 481 if cnt == parents_limit:
483 482 # this will prevent accidental infinit loops
484 483 log.error('group nested more than %s' %
485 484 parents_limit)
486 485 break
487 486
488 487 groups.insert(0, gr)
489 488 return groups
490 489
491 490
492 491 @property
493 492 def full_path(self):
494 493 return Group.url_sep().join([g.group_name for g in self.parents] +
495 494 [self.group_name])
496 495
497 496 @property
498 497 def repositories(self):
499 498 return Session.query(Repository).filter(Repository.group == self)
500 499
501 500 class Permission(Base):
502 501 __tablename__ = 'permissions'
503 502 __table_args__ = {'extend_existing':True}
504 503 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
505 504 permission_name = Column("permission_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
506 505 permission_longname = Column("permission_longname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
507 506
508 507 def __repr__(self):
509 508 return "<%s('%s:%s')>" % (self.__class__.__name__,
510 509 self.permission_id, self.permission_name)
511 510
512 511 @classmethod
513 512 def get_by_key(cls, key):
514 513 return Session.query(cls).filter(cls.permission_name == key).scalar()
515 514
516 515 class RepoToPerm(Base):
517 516 __tablename__ = 'repo_to_perm'
518 517 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'extend_existing':True})
519 518 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
520 519 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
521 520 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
522 521 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
523 522
524 523 user = relationship('User')
525 524 permission = relationship('Permission')
526 525 repository = relationship('Repository')
527 526
528 527 class UserToPerm(Base):
529 528 __tablename__ = 'user_to_perm'
530 529 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'extend_existing':True})
531 530 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
532 531 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
533 532 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
534 533
535 534 user = relationship('User')
536 535 permission = relationship('Permission')
537 536
538 537 @classmethod
539 538 def has_perm(cls, user_id, perm):
540 539 if not isinstance(perm, Permission):
541 540 raise Exception('perm needs to be an instance of Permission class')
542 541
543 542 return Session.query(cls).filter(cls.user_id == user_id)\
544 543 .filter(cls.permission == perm).scalar() is not None
545 544
546 545 @classmethod
547 546 def grant_perm(cls, user_id, perm):
548 547 if not isinstance(perm, Permission):
549 548 raise Exception('perm needs to be an instance of Permission class')
550 549
551 550 new = cls()
552 551 new.user_id = user_id
553 552 new.permission = perm
554 553 try:
555 554 Session.add(new)
556 555 Session.commit()
557 556 except:
558 557 Session.rollback()
559 558
560 559
561 560 @classmethod
562 561 def revoke_perm(cls, user_id, perm):
563 562 if not isinstance(perm, Permission):
564 563 raise Exception('perm needs to be an instance of Permission class')
565 564
566 565 try:
567 566 Session.query(cls).filter(cls.user_id == user_id)\
568 567 .filter(cls.permission == perm).delete()
569 568 Session.commit()
570 569 except:
571 570 Session.rollback()
572 571
573 572 class UsersGroupRepoToPerm(Base):
574 573 __tablename__ = 'users_group_repo_to_perm'
575 574 __table_args__ = (UniqueConstraint('users_group_id', 'permission_id'), {'extend_existing':True})
576 575 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
577 576 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
578 577 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
579 578 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
580 579
581 580 users_group = relationship('UsersGroup')
582 581 permission = relationship('Permission')
583 582 repository = relationship('Repository')
584 583
585 584
586 585 class UsersGroupToPerm(Base):
587 586 __tablename__ = 'users_group_to_perm'
588 587 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
589 588 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
590 589 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
591 590
592 591 users_group = relationship('UsersGroup')
593 592 permission = relationship('Permission')
594 593
595 594
596 595 @classmethod
597 596 def has_perm(cls, users_group_id, perm):
598 597 if not isinstance(perm, Permission):
599 598 raise Exception('perm needs to be an instance of Permission class')
600 599
601 600 return Session.query(cls).filter(cls.users_group_id ==
602 601 users_group_id)\
603 602 .filter(cls.permission == perm)\
604 603 .scalar() is not None
605 604
606 605 @classmethod
607 606 def grant_perm(cls, users_group_id, perm):
608 607 if not isinstance(perm, Permission):
609 608 raise Exception('perm needs to be an instance of Permission class')
610 609
611 610 new = cls()
612 611 new.users_group_id = users_group_id
613 612 new.permission = perm
614 613 try:
615 614 Session.add(new)
616 615 Session.commit()
617 616 except:
618 617 Session.rollback()
619 618
620 619
621 620 @classmethod
622 621 def revoke_perm(cls, users_group_id, perm):
623 622 if not isinstance(perm, Permission):
624 623 raise Exception('perm needs to be an instance of Permission class')
625 624
626 625 try:
627 626 Session.query(cls).filter(cls.users_group_id == users_group_id)\
628 627 .filter(cls.permission == perm).delete()
629 628 Session.commit()
630 629 except:
631 630 Session.rollback()
632 631
633 632
634 633 class GroupToPerm(Base):
635 634 __tablename__ = 'group_to_perm'
636 635 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'extend_existing':True})
637 636
638 637 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
639 638 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
640 639 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
641 640 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
642 641
643 642 user = relationship('User')
644 643 permission = relationship('Permission')
645 644 group = relationship('Group')
646 645
647 646 class Statistics(Base):
648 647 __tablename__ = 'statistics'
649 648 __table_args__ = (UniqueConstraint('repository_id'), {'extend_existing':True})
650 649 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
651 650 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
652 651 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
653 652 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
654 653 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
655 654 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
656 655
657 656 repository = relationship('Repository', single_parent=True)
658 657
659 658 class UserFollowing(Base):
660 659 __tablename__ = 'user_followings'
661 660 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
662 661 UniqueConstraint('user_id', 'follows_user_id')
663 662 , {'extend_existing':True})
664 663
665 664 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
666 665 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
667 666 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
668 667 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
669 668 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
670 669
671 670 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
672 671
673 672 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
674 673 follows_repository = relationship('Repository', order_by='Repository.repo_name')
675 674
676 675
677 676
678 677 @classmethod
679 678 def get_repo_followers(cls, repo_id):
680 679 return Session.query(cls).filter(cls.follows_repo_id == repo_id)
681 680
682 681 class CacheInvalidation(Base):
683 682 __tablename__ = 'cache_invalidation'
684 683 __table_args__ = (UniqueConstraint('cache_key'), {'extend_existing':True})
685 684 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
686 685 cache_key = Column("cache_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
687 686 cache_args = Column("cache_args", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
688 687 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
689 688
690 689
691 690 def __init__(self, cache_key, cache_args=''):
692 691 self.cache_key = cache_key
693 692 self.cache_args = cache_args
694 693 self.cache_active = False
695 694
696 695 def __repr__(self):
697 696 return "<%s('%s:%s')>" % (self.__class__.__name__,
698 697 self.cache_id, self.cache_key)
699 698
700 699 class DbMigrateVersion(Base):
701 700 __tablename__ = 'db_migrate_version'
702 701 __table_args__ = {'extend_existing':True}
703 702 repository_id = Column('repository_id', String(250), primary_key=True)
704 703 repository_path = Column('repository_path', Text)
705 704 version = Column('version', Integer)
General Comments 0
You need to be logged in to leave comments. Login now