comparison rhodecode/model/db.py @ 1065:5d676b6ab71c beta

Moved BaseModel into base class for declarative base. Added some handy methods into BaseModel like get() and query()
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 19 Feb 2011 01:06:47 +0100
parents 51b70569c330
children 70bf0be59653
comparison
equal deleted inserted replaced
1064:113a8db22852 1065:5d676b6ab71c
28 import datetime 28 import datetime
29 from datetime import date 29 from datetime import date
30 30
31 from sqlalchemy import * 31 from sqlalchemy import *
32 from sqlalchemy.exc import DatabaseError 32 from sqlalchemy.exc import DatabaseError
33 from sqlalchemy.orm import relationship, backref, class_mapper 33 from sqlalchemy.orm import relationship, backref
34 from sqlalchemy.orm.session import Session 34 from sqlalchemy.orm.session import Session
35 35
36 from rhodecode.model.meta import Base 36 from rhodecode.model.meta import Base
37 37
38 log = logging.getLogger(__name__) 38 log = logging.getLogger(__name__)
39 39
40 class BaseModel(object): 40 class RhodeCodeSettings(Base):
41
42 @classmethod
43 def _get_keys(cls):
44 """return column names for this model """
45 return class_mapper(cls).c.keys()
46
47 def get_dict(self):
48 """return dict with keys and values corresponding
49 to this model data """
50
51 d = {}
52 for k in self._get_keys():
53 d[k] = getattr(self, k)
54 return d
55
56 def get_appstruct(self):
57 """return list with keys and values tupples corresponding
58 to this model data """
59
60 l = []
61 for k in self._get_keys():
62 l.append((k, getattr(self, k),))
63 return l
64
65 def populate_obj(self, populate_dict):
66 """populate model with data from given populate_dict"""
67
68 for k in self._get_keys():
69 if k in populate_dict:
70 setattr(self, k, populate_dict[k])
71
72 class RhodeCodeSettings(Base, BaseModel):
73 __tablename__ = 'rhodecode_settings' 41 __tablename__ = 'rhodecode_settings'
74 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':True}) 42 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':True})
75 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 43 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
76 app_settings_name = Column("app_settings_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 44 app_settings_name = Column("app_settings_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
77 app_settings_value = Column("app_settings_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 45 app_settings_value = Column("app_settings_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
82 50
83 def __repr__(self): 51 def __repr__(self):
84 return "<%s('%s:%s')>" % (self.__class__.__name__, 52 return "<%s('%s:%s')>" % (self.__class__.__name__,
85 self.app_settings_name, self.app_settings_value) 53 self.app_settings_name, self.app_settings_value)
86 54
87 class RhodeCodeUi(Base, BaseModel): 55 class RhodeCodeUi(Base):
88 __tablename__ = 'rhodecode_ui' 56 __tablename__ = 'rhodecode_ui'
89 __table_args__ = {'useexisting':True} 57 __table_args__ = {'useexisting':True}
90 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 58 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
91 ui_section = Column("ui_section", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 59 ui_section = Column("ui_section", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
92 ui_key = Column("ui_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 60 ui_key = Column("ui_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
93 ui_value = Column("ui_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 61 ui_value = Column("ui_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
94 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True) 62 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
95 63
96 64
97 class User(Base, BaseModel): 65 class User(Base):
98 __tablename__ = 'users' 66 __tablename__ = 'users'
99 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True}) 67 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True})
100 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 68 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
101 username = Column("username", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 69 username = Column("username", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
102 password = Column("password", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 70 password = Column("password", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
113 81
114 repositories = relationship('Repository') 82 repositories = relationship('Repository')
115 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all') 83 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
116 84
117 group_member = relationship('UsersGroupMember', cascade='all') 85 group_member = relationship('UsersGroupMember', cascade='all')
86
118 @property 87 @property
119 def full_contact(self): 88 def full_contact(self):
120 return '%s %s <%s>' % (self.name, self.lastname, self.email) 89 return '%s %s <%s>' % (self.name, self.lastname, self.email)
121 90
122
123 @property 91 @property
124 def is_admin(self): 92 def is_admin(self):
125 return self.admin 93 return self.admin
126 94
127 def __repr__(self): 95 def __repr__(self):
128 return "<%s('id:%s:%s')>" % (self.__class__.__name__, 96 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
129 self.user_id, self.username) 97 self.user_id, self.username)
98
99 @classmethod
100 def by_username(cls, username):
101 return Session.query(cls).filter(cls.username == username).one()
102
130 103
131 def update_lastlogin(self): 104 def update_lastlogin(self):
132 """Update user lastlogin""" 105 """Update user lastlogin"""
133 106
134 try: 107 try:
139 log.debug('updated user %s lastlogin', self.username) 112 log.debug('updated user %s lastlogin', self.username)
140 except (DatabaseError,): 113 except (DatabaseError,):
141 session.rollback() 114 session.rollback()
142 115
143 116
144 class UserLog(Base, BaseModel): 117 class UserLog(Base):
145 __tablename__ = 'user_logs' 118 __tablename__ = 'user_logs'
146 __table_args__ = {'useexisting':True} 119 __table_args__ = {'useexisting':True}
147 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 120 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
148 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 121 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
149 repository_id = Column("repository_id", Integer(length=None, convert_unicode=False, assert_unicode=None), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None) 122 repository_id = Column("repository_id", Integer(length=None, convert_unicode=False, assert_unicode=None), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
158 131
159 user = relationship('User') 132 user = relationship('User')
160 repository = relationship('Repository') 133 repository = relationship('Repository')
161 134
162 135
163 class UsersGroup(Base, BaseModel): 136 class UsersGroup(Base):
164 __tablename__ = 'users_groups' 137 __tablename__ = 'users_groups'
165 __table_args__ = {'useexisting':True} 138 __table_args__ = {'useexisting':True}
166 139
167 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 140 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
168 users_group_name = Column("users_group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None) 141 users_group_name = Column("users_group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
169 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None) 142 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
170 143
171 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined") 144 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
172 145
173 class UsersGroupMember(Base, BaseModel): 146 class UsersGroupMember(Base):
174 __tablename__ = 'users_groups_members' 147 __tablename__ = 'users_groups_members'
175 __table_args__ = {'useexisting':True} 148 __table_args__ = {'useexisting':True}
176 149
177 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 150 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
178 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None) 151 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
183 156
184 def __init__(self, gr_id='', u_id=''): 157 def __init__(self, gr_id='', u_id=''):
185 self.users_group_id = gr_id 158 self.users_group_id = gr_id
186 self.user_id = u_id 159 self.user_id = u_id
187 160
188 class Repository(Base, BaseModel): 161 class Repository(Base):
189 __tablename__ = 'repositories' 162 __tablename__ = 'repositories'
190 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},) 163 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},)
191 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 164 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
192 repo_name = Column("repo_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None) 165 repo_name = Column("repo_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
193 repo_type = Column("repo_type", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg') 166 repo_type = Column("repo_type", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
212 185
213 def __repr__(self): 186 def __repr__(self):
214 return "<%s('%s:%s')>" % (self.__class__.__name__, 187 return "<%s('%s:%s')>" % (self.__class__.__name__,
215 self.repo_id, self.repo_name) 188 self.repo_id, self.repo_name)
216 189
217 class Group(Base, BaseModel): 190 @classmethod
191 def by_repo_name(cls, repo_name):
192 return Session.query(cls).filter(cls.repo_name == repo_name).one()
193
194
195 class Group(Base):
218 __tablename__ = 'groups' 196 __tablename__ = 'groups'
219 __table_args__ = (UniqueConstraint('group_name'), {'useexisting':True},) 197 __table_args__ = (UniqueConstraint('group_name'), {'useexisting':True},)
220 198
221 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 199 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
222 group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None) 200 group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
231 209
232 def __repr__(self): 210 def __repr__(self):
233 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id, 211 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
234 self.group_name) 212 self.group_name)
235 213
236 class Permission(Base, BaseModel): 214 class Permission(Base):
237 __tablename__ = 'permissions' 215 __tablename__ = 'permissions'
238 __table_args__ = {'useexisting':True} 216 __table_args__ = {'useexisting':True}
239 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 217 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
240 permission_name = Column("permission_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 218 permission_name = Column("permission_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
241 permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 219 permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
242 220
243 def __repr__(self): 221 def __repr__(self):
244 return "<%s('%s:%s')>" % (self.__class__.__name__, 222 return "<%s('%s:%s')>" % (self.__class__.__name__,
245 self.permission_id, self.permission_name) 223 self.permission_id, self.permission_name)
246 224
247 class RepoToPerm(Base, BaseModel): 225 class RepoToPerm(Base):
248 __tablename__ = 'repo_to_perm' 226 __tablename__ = 'repo_to_perm'
249 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True}) 227 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True})
250 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 228 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
251 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 229 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
252 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None) 230 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
254 232
255 user = relationship('User') 233 user = relationship('User')
256 permission = relationship('Permission') 234 permission = relationship('Permission')
257 repository = relationship('Repository') 235 repository = relationship('Repository')
258 236
259 class UserToPerm(Base, BaseModel): 237 class UserToPerm(Base):
260 __tablename__ = 'user_to_perm' 238 __tablename__ = 'user_to_perm'
261 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True}) 239 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True})
262 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 240 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
263 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 241 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
264 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None) 242 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
265 243
266 user = relationship('User') 244 user = relationship('User')
267 permission = relationship('Permission') 245 permission = relationship('Permission')
268 246
269 247
270 class UsersGroupToPerm(Base, BaseModel): 248 class UsersGroupToPerm(Base):
271 __tablename__ = 'users_group_to_perm' 249 __tablename__ = 'users_group_to_perm'
272 __table_args__ = (UniqueConstraint('users_group_id', 'permission_id'), {'useexisting':True}) 250 __table_args__ = (UniqueConstraint('users_group_id', 'permission_id'), {'useexisting':True})
273 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 251 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
274 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None) 252 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
275 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None) 253 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
277 255
278 users_group = relationship('UsersGroup') 256 users_group = relationship('UsersGroup')
279 permission = relationship('Permission') 257 permission = relationship('Permission')
280 repository = relationship('Repository') 258 repository = relationship('Repository')
281 259
282 class GroupToPerm(Base, BaseModel): 260 class GroupToPerm(Base):
283 __tablename__ = 'group_to_perm' 261 __tablename__ = 'group_to_perm'
284 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'useexisting':True}) 262 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'useexisting':True})
285 263
286 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 264 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
287 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 265 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
290 268
291 user = relationship('User') 269 user = relationship('User')
292 permission = relationship('Permission') 270 permission = relationship('Permission')
293 group = relationship('Group') 271 group = relationship('Group')
294 272
295 class Statistics(Base, BaseModel): 273 class Statistics(Base):
296 __tablename__ = 'statistics' 274 __tablename__ = 'statistics'
297 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True}) 275 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True})
298 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 276 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
299 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None) 277 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
300 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False) 278 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
302 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data 280 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
303 languages = Column("languages", LargeBinary(), nullable=False)#JSON data 281 languages = Column("languages", LargeBinary(), nullable=False)#JSON data
304 282
305 repository = relationship('Repository', single_parent=True) 283 repository = relationship('Repository', single_parent=True)
306 284
307 class UserFollowing(Base, BaseModel): 285 class UserFollowing(Base):
308 __tablename__ = 'user_followings' 286 __tablename__ = 'user_followings'
309 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'), 287 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
310 UniqueConstraint('user_id', 'follows_user_id') 288 UniqueConstraint('user_id', 'follows_user_id')
311 , {'useexisting':True}) 289 , {'useexisting':True})
312 290
318 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id') 296 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
319 297
320 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id') 298 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
321 follows_repository = relationship('Repository', order_by='Repository.repo_name') 299 follows_repository = relationship('Repository', order_by='Repository.repo_name')
322 300
323 class CacheInvalidation(Base, BaseModel): 301 class CacheInvalidation(Base):
324 __tablename__ = 'cache_invalidation' 302 __tablename__ = 'cache_invalidation'
325 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True}) 303 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True})
326 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 304 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
327 cache_key = Column("cache_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 305 cache_key = Column("cache_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 cache_args = Column("cache_args", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 306 cache_args = Column("cache_args", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
336 314
337 def __repr__(self): 315 def __repr__(self):
338 return "<%s('%s:%s')>" % (self.__class__.__name__, 316 return "<%s('%s:%s')>" % (self.__class__.__name__,
339 self.cache_id, self.cache_key) 317 self.cache_id, self.cache_key)
340 318
341 class DbMigrateVersion(Base, BaseModel): 319 class DbMigrateVersion(Base):
342 __tablename__ = 'db_migrate_version' 320 __tablename__ = 'db_migrate_version'
343 __table_args__ = {'useexisting':True} 321 __table_args__ = {'useexisting':True}
344 repository_id = Column('repository_id', String(250), primary_key=True) 322 repository_id = Column('repository_id', String(250), primary_key=True)
345 repository_path = Column('repository_path', Text) 323 repository_path = Column('repository_path', Text)
346 version = Column('version', Integer) 324 version = Column('version', Integer)