comparison rhodecode/model/db.py @ 1136:93b980ebee55

changes for release 1.1.5
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 17 Mar 2011 01:13:48 +0100
parents af6ca51fb80f
children a3b2b4b4e440
comparison
equal deleted inserted replaced
1095:3cdacd152b24 1136:93b980ebee55
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.interfaces import MapperExtension
35 35
36 from rhodecode.model.meta import Base 36 from rhodecode.model.meta import Base, Session
37 37
38 log = logging.getLogger(__name__) 38 log = logging.getLogger(__name__)
39 39
40 class BaseModel(object): 40
41 41 class RhodeCodeSettings(Base):
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' 42 __tablename__ = 'rhodecode_settings'
74 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':True}) 43 __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) 44 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) 45 app_settings_name = Column("app_settings_name", String(length=255, 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) 46 app_settings_value = Column("app_settings_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
78 47
79 def __init__(self, k='', v=''): 48 def __init__(self, k='', v=''):
80 self.app_settings_name = k 49 self.app_settings_name = k
81 self.app_settings_value = v 50 self.app_settings_value = v
82 51
83 def __repr__(self): 52 def __repr__(self):
84 return "<%s('%s:%s')>" % (self.__class__.__name__, 53 return "<%s('%s:%s')>" % (self.__class__.__name__,
85 self.app_settings_name, self.app_settings_value) 54 self.app_settings_name, self.app_settings_value)
86 55
87 class RhodeCodeUi(Base, BaseModel): 56 class RhodeCodeUi(Base):
88 __tablename__ = 'rhodecode_ui' 57 __tablename__ = 'rhodecode_ui'
89 __table_args__ = {'useexisting':True} 58 __table_args__ = {'useexisting':True}
90 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 59 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) 60 ui_section = Column("ui_section", String(length=255, 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) 61 ui_key = Column("ui_key", String(length=255, 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) 62 ui_value = Column("ui_value", String(length=255, 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) 63 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
95 64
96 65
97 class User(Base, BaseModel): 66 class User(Base):
98 __tablename__ = 'users' 67 __tablename__ = 'users'
99 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True}) 68 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True})
100 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 69 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) 70 username = Column("username", String(length=255, 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) 71 password = Column("password", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
103 active = Column("active", Boolean(), nullable=True, unique=None, default=None) 72 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
104 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False) 73 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
105 name = Column("name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 74 name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
106 lastname = Column("lastname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 75 lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
107 email = Column("email", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 76 email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
108 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None) 77 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
109 is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False) 78 is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False)
110 79
111 user_log = relationship('UserLog', cascade='all') 80 user_log = relationship('UserLog', cascade='all')
112 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all') 81 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
116 85
117 @property 86 @property
118 def full_contact(self): 87 def full_contact(self):
119 return '%s %s <%s>' % (self.name, self.lastname, self.email) 88 return '%s %s <%s>' % (self.name, self.lastname, self.email)
120 89
90 @property
91 def short_contact(self):
92 return '%s %s' % (self.name, self.lastname)
93
121 94
122 @property 95 @property
123 def is_admin(self): 96 def is_admin(self):
124 return self.admin 97 return self.admin
125 98
126 def __repr__(self): 99 def __repr__(self):
127 return "<%s('id:%s:%s')>" % (self.__class__.__name__, 100 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
128 self.user_id, self.username) 101 self.user_id, self.username)
102
103 @classmethod
104 def by_username(cls, username):
105 return Session.query(cls).filter(cls.username == username).one()
106
129 107
130 def update_lastlogin(self): 108 def update_lastlogin(self):
131 """Update user lastlogin""" 109 """Update user lastlogin"""
132 110
133 try: 111 try:
138 log.debug('updated user %s lastlogin', self.username) 116 log.debug('updated user %s lastlogin', self.username)
139 except (DatabaseError,): 117 except (DatabaseError,):
140 session.rollback() 118 session.rollback()
141 119
142 120
143 class UserLog(Base, BaseModel): 121 class UserLog(Base):
144 __tablename__ = 'user_logs' 122 __tablename__ = 'user_logs'
145 __table_args__ = {'useexisting':True} 123 __table_args__ = {'useexisting':True}
146 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 124 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
147 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 125 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
148 repository_id = Column("repository_id", Integer(length=None, convert_unicode=False, assert_unicode=None), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None) 126 repository_id = Column("repository_id", Integer(length=None, convert_unicode=False, assert_unicode=None), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
149 repository_name = Column("repository_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 127 repository_name = Column("repository_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
150 user_ip = Column("user_ip", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 128 user_ip = Column("user_ip", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
151 action = Column("action", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 129 action = Column("action", UnicodeText(length=1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
152 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None) 130 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
153 131
154 @property 132 @property
155 def action_as_day(self): 133 def action_as_day(self):
156 return date(*self.action_date.timetuple()[:3]) 134 return date(*self.action_date.timetuple()[:3])
157 135
158 user = relationship('User') 136 user = relationship('User')
159 repository = relationship('Repository') 137 repository = relationship('Repository')
160 138
161 class Repository(Base, BaseModel): 139 class Repository(Base):
162 __tablename__ = 'repositories' 140 __tablename__ = 'repositories'
163 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},) 141 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},)
164 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 142 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
165 repo_name = Column("repo_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None) 143 repo_name = Column("repo_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
166 repo_type = Column("repo_type", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg') 144 repo_type = Column("repo_type", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
167 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None) 145 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
168 private = Column("private", Boolean(), nullable=True, unique=None, default=None) 146 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
169 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True) 147 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
170 description = Column("description", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 148 description = Column("description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
171 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None) 149 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
172 150
173 user = relationship('User') 151 user = relationship('User')
174 fork = relationship('Repository', remote_side=repo_id) 152 fork = relationship('Repository', remote_side=repo_id)
175 repo_to_perm = relationship('RepoToPerm', cascade='all') 153 repo_to_perm = relationship('RepoToPerm', cascade='all')
176 stats = relationship('Statistics', cascade='all', uselist=False) 154 stats = relationship('Statistics', cascade='all', uselist=False)
177 155
178 repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all') 156 repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
179 157
180 logs = relationship('UserLog', cascade='all') 158 logs = relationship('UserLog', cascade='all')
181 159
182 def __repr__(self): 160 def __repr__(self):
183 return "<%s('%s:%s')>" % (self.__class__.__name__, 161 return "<%s('%s:%s')>" % (self.__class__.__name__,
184 self.repo_id, self.repo_name) 162 self.repo_id, self.repo_name)
185 163
186 class Permission(Base, BaseModel): 164 class Permission(Base):
187 __tablename__ = 'permissions' 165 __tablename__ = 'permissions'
188 __table_args__ = {'useexisting':True} 166 __table_args__ = {'useexisting':True}
189 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 167 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
190 permission_name = Column("permission_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 168 permission_name = Column("permission_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
191 permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 169 permission_longname = Column("permission_longname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
192 170
193 def __repr__(self): 171 def __repr__(self):
194 return "<%s('%s:%s')>" % (self.__class__.__name__, 172 return "<%s('%s:%s')>" % (self.__class__.__name__,
195 self.permission_id, self.permission_name) 173 self.permission_id, self.permission_name)
196 174
197 class RepoToPerm(Base, BaseModel): 175 class RepoToPerm(Base):
198 __tablename__ = 'repo_to_perm' 176 __tablename__ = 'repo_to_perm'
199 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True}) 177 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True})
200 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 178 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
201 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 179 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
202 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None) 180 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
204 182
205 user = relationship('User') 183 user = relationship('User')
206 permission = relationship('Permission') 184 permission = relationship('Permission')
207 repository = relationship('Repository') 185 repository = relationship('Repository')
208 186
209 class UserToPerm(Base, BaseModel): 187 class UserToPerm(Base):
210 __tablename__ = 'user_to_perm' 188 __tablename__ = 'user_to_perm'
211 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True}) 189 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True})
212 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 190 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
213 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None) 191 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
214 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None) 192 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
215 193
216 user = relationship('User') 194 user = relationship('User')
217 permission = relationship('Permission') 195 permission = relationship('Permission')
218 196
219 class Statistics(Base, BaseModel): 197 class Statistics(Base):
220 __tablename__ = 'statistics' 198 __tablename__ = 'statistics'
221 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True}) 199 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True})
222 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 200 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
223 repository_id = Column("repository_id", Integer(), ForeignKey(u'repositories.repo_id'), nullable=False, unique=True, default=None) 201 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
224 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False) 202 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
225 commit_activity = Column("commit_activity", LargeBinary(), nullable=False)#JSON data 203 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
226 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data 204 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
227 languages = Column("languages", LargeBinary(), nullable=False)#JSON data 205 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
228 206
229 repository = relationship('Repository', single_parent=True) 207 repository = relationship('Repository', single_parent=True)
230 208
231 class UserFollowing(Base, BaseModel): 209 class UserFollowing(Base):
232 __tablename__ = 'user_followings' 210 __tablename__ = 'user_followings'
233 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'), 211 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
234 UniqueConstraint('user_id', 'follows_user_id') 212 UniqueConstraint('user_id', 'follows_user_id')
235 , {'useexisting':True}) 213 , {'useexisting':True})
236 214
242 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id') 220 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
243 221
244 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id') 222 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
245 follows_repository = relationship('Repository', order_by='Repository.repo_name') 223 follows_repository = relationship('Repository', order_by='Repository.repo_name')
246 224
247 class CacheInvalidation(Base, BaseModel): 225 class CacheInvalidation(Base):
248 __tablename__ = 'cache_invalidation' 226 __tablename__ = 'cache_invalidation'
249 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True}) 227 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True})
250 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) 228 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
251 cache_key = Column("cache_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 229 cache_key = Column("cache_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
252 cache_args = Column("cache_args", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) 230 cache_args = Column("cache_args", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
253 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False) 231 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
254 232
255 233
256 def __init__(self, cache_key, cache_args=''): 234 def __init__(self, cache_key, cache_args=''):
257 self.cache_key = cache_key 235 self.cache_key = cache_key
260 238
261 def __repr__(self): 239 def __repr__(self):
262 return "<%s('%s:%s')>" % (self.__class__.__name__, 240 return "<%s('%s:%s')>" % (self.__class__.__name__,
263 self.cache_id, self.cache_key) 241 self.cache_id, self.cache_key)
264 242
265 class DbMigrateVersion(Base, BaseModel): 243 class DbMigrateVersion(Base):
266 __tablename__ = 'db_migrate_version' 244 __tablename__ = 'db_migrate_version'
267 __table_args__ = {'useexisting':True} 245 __table_args__ = {'useexisting':True}
268 repository_id = Column('repository_id', String(250), primary_key=True) 246 repository_id = Column('repository_id', String(255), primary_key=True)
269 repository_path = Column('repository_path', Text) 247 repository_path = Column('repository_path', Text)
270 version = Column('version', Integer) 248 version = Column('version', Integer)
271 249