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