##// END OF EJS Templates
updated db migrations to schema 3
marcink -
r1023:e7478ac1 beta
parent child Browse files
Show More
@@ -1,52 +1,90 b''
1 1 import logging
2 2 import datetime
3 3
4 4 from sqlalchemy import *
5 5 from sqlalchemy.exc import DatabaseError
6 6 from sqlalchemy.orm import relation, backref, class_mapper
7 7 from sqlalchemy.orm.session import Session
8 8
9 9 from rhodecode.lib.dbmigrate.migrate import *
10 10 from rhodecode.lib.dbmigrate.migrate.changeset import *
11 11
12 12 from rhodecode.model.meta import Base
13 13 from rhodecode.model.db import BaseModel
14 14
15 15 log = logging.getLogger(__name__)
16 16
17 17 def upgrade(migrate_engine):
18 18 """ Upgrade operations go here.
19 19 Don't create your own engine; bind migrate_engine to your metadata
20 20 """
21 21
22 22 #==========================================================================
23 23 # Add table `groups``
24 24 #==========================================================================
25 from rhodecode.model.db import Group
26 Group().__table__.create()
25 # from rhodecode.model.db import Group
26 # Group().__table__.create()
27 27
28 28 #==========================================================================
29 29 # Add table `group_to_perm`
30 30 #==========================================================================
31 from rhodecode.model.db import GroupToPerm
32 GroupToPerm().__table__.create()
31 # from rhodecode.model.db import GroupToPerm
32 # GroupToPerm().__table__.create()
33
34 #==========================================================================
35 # Add table `users_groups`
36 #==========================================================================
37 # from rhodecode.model.db import UsersGroup
38 # UsersGroup().__table__.create()
39
40 #==========================================================================
41 # Add table `users_groups_members`
42 #==========================================================================
43 from rhodecode.model.db import UsersGroupMember
44 UsersGroupMember().__table__.create()
45
46 #==========================================================================
47 # Add table `users_group_to_perm`
48 #==========================================================================
49 from rhodecode.model.db import UsersGroupToPerm
50 UsersGroupToPerm().__table__.create()
51
52
53 #==========================================================================
54 # Upgrade of `users` table
55 #==========================================================================
56 from rhodecode.model.db import User
57
58 #add column
59 ldap_dn = Column("ldap_dn", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
60 ldap_dn.create(User().__table__)
61
62
63 #remove old column
64 is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False)
65 is_ldap.drop(User().__table__)
66
33 67
34 68 #==========================================================================
35 69 # Upgrade of `repositories` table
36 70 #==========================================================================
37 71 from rhodecode.model.db import Repository
38 72
73 #ADD downloads column#
74 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
75 enable_downloads.create(Repository().__table__)
76
39 77 #ADD group_id column#
40 78 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'),
41 79 nullable=True, unique=False, default=None)
42 80
43 81 group_id.create(Repository().__table__)
44 82
45 83 return
46 84
47 85
48 86 def downgrade(migrate_engine):
49 87 meta = MetaData()
50 88 meta.bind = migrate_engine
51 89
52 90
@@ -1,346 +1,346 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.db
4 4 ~~~~~~~~~~~~~~~~~~
5 5
6 6 Database Models for RhodeCode
7 7
8 8 :created_on: Apr 08, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software; you can redistribute it and/or
14 14 # modify it under the terms of the GNU General Public License
15 15 # as published by the Free Software Foundation; version 2
16 16 # of the License or (at your opinion) any later version of the license.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program; if not, write to the Free Software
25 25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 26 # MA 02110-1301, USA.
27 27 import logging
28 28 import datetime
29 29 from datetime import date
30 30
31 31 from sqlalchemy import *
32 32 from sqlalchemy.exc import DatabaseError
33 33 from sqlalchemy.orm import relationship, backref, class_mapper
34 34 from sqlalchemy.orm.session import Session
35 35
36 36 from rhodecode.model.meta import Base
37 37
38 38 log = logging.getLogger(__name__)
39 39
40 40 class BaseModel(object):
41 41
42 42 @classmethod
43 43 def _get_keys(cls):
44 44 """return column names for this model """
45 45 return class_mapper(cls).c.keys()
46 46
47 47 def get_dict(self):
48 48 """return dict with keys and values corresponding
49 49 to this model data """
50 50
51 51 d = {}
52 52 for k in self._get_keys():
53 53 d[k] = getattr(self, k)
54 54 return d
55 55
56 56 def get_appstruct(self):
57 57 """return list with keys and values tupples corresponding
58 58 to this model data """
59 59
60 60 l = []
61 61 for k in self._get_keys():
62 62 l.append((k, getattr(self, k),))
63 63 return l
64 64
65 65 def populate_obj(self, populate_dict):
66 66 """populate model with data from given populate_dict"""
67 67
68 68 for k in self._get_keys():
69 69 if k in populate_dict:
70 70 setattr(self, k, populate_dict[k])
71 71
72 72 class RhodeCodeSettings(Base, BaseModel):
73 73 __tablename__ = 'rhodecode_settings'
74 74 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':True})
75 75 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
76 76 app_settings_name = Column("app_settings_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
77 77 app_settings_value = Column("app_settings_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
78 78
79 79 def __init__(self, k='', v=''):
80 80 self.app_settings_name = k
81 81 self.app_settings_value = v
82 82
83 83 def __repr__(self):
84 84 return "<%s('%s:%s')>" % (self.__class__.__name__,
85 85 self.app_settings_name, self.app_settings_value)
86 86
87 87 class RhodeCodeUi(Base, BaseModel):
88 88 __tablename__ = 'rhodecode_ui'
89 89 __table_args__ = {'useexisting':True}
90 90 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
91 91 ui_section = Column("ui_section", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
92 92 ui_key = Column("ui_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
93 93 ui_value = Column("ui_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
94 94 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
95 95
96 96
97 97 class User(Base, BaseModel):
98 98 __tablename__ = 'users'
99 99 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True})
100 100 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
101 101 username = Column("username", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
102 102 password = Column("password", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
103 103 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
104 104 admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
105 105 name = Column("name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
106 106 lastname = Column("lastname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
107 107 email = Column("email", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
108 108 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
109 109 ldap_dn = Column("ldap_dn", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
110 110
111 111 user_log = relationship('UserLog', cascade='all')
112 112 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
113 113
114 114 repositories = relationship('Repository')
115 115 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
116 116
117 117 @property
118 118 def full_contact(self):
119 119 return '%s %s <%s>' % (self.name, self.lastname, self.email)
120 120
121 121
122 122 @property
123 123 def is_admin(self):
124 124 return self.admin
125 125
126 126 def __repr__(self):
127 127 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
128 128 self.user_id, self.username)
129 129
130 130 def update_lastlogin(self):
131 131 """Update user lastlogin"""
132 132
133 133 try:
134 134 session = Session.object_session(self)
135 135 self.last_login = datetime.datetime.now()
136 136 session.add(self)
137 137 session.commit()
138 138 log.debug('updated user %s lastlogin', self.username)
139 139 except (DatabaseError,):
140 140 session.rollback()
141 141
142 142
143 143 class UserLog(Base, BaseModel):
144 144 __tablename__ = 'user_logs'
145 145 __table_args__ = {'useexisting':True}
146 146 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
147 147 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
148 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)
149 149 repository_name = Column("repository_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
150 150 user_ip = Column("user_ip", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
151 151 action = Column("action", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
152 152 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
153 153
154 154 @property
155 155 def action_as_day(self):
156 156 return date(*self.action_date.timetuple()[:3])
157 157
158 158 user = relationship('User')
159 159 repository = relationship('Repository')
160 160
161 161
162 162 class UsersGroup(Base, BaseModel):
163 163 __tablename__ = 'users_groups'
164 164 __table_args__ = {'useexisting':True}
165 165
166 166 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
167 167 users_group_name = Column("users_group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
168 168 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
169 169
170 170 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
171 171
172 172 class UsersGroupMember(Base, BaseModel):
173 173 __tablename__ = 'users_groups_members'
174 174 __table_args__ = {'useexisting':True}
175 175
176 176 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
177 177 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
178 178 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
179 179
180 180 user = relationship('User', lazy='joined')
181 181 users_group = relationship('UsersGroup')
182 182
183 def __init__(self, gr_id, u_id):
183 def __init__(self, gr_id='', u_id=''):
184 184 self.users_group_id = gr_id
185 185 self.user_id = u_id
186 186
187 187 class Repository(Base, BaseModel):
188 188 __tablename__ = 'repositories'
189 189 __table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},)
190 190 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
191 191 repo_name = Column("repo_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
192 192 repo_type = Column("repo_type", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
193 193 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
194 194 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
195 195 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
196 196 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
197 197 description = Column("description", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
198 198 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
199 199 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
200 200
201 201 user = relationship('User')
202 202 fork = relationship('Repository', remote_side=repo_id)
203 203 group = relationship('Group')
204 204 repo_to_perm = relationship('RepoToPerm', cascade='all')
205 205 users_group_to_perm = relationship('UsersGroupToPerm', cascade='all')
206 206 stats = relationship('Statistics', cascade='all', uselist=False)
207 207
208 208 repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
209 209
210 210 logs = relationship('UserLog', cascade='all')
211 211
212 212 def __repr__(self):
213 213 return "<%s('%s:%s')>" % (self.__class__.__name__,
214 214 self.repo_id, self.repo_name)
215 215
216 216 class Group(Base, BaseModel):
217 217 __tablename__ = 'groups'
218 218 __table_args__ = (UniqueConstraint('group_name'), {'useexisting':True},)
219 219
220 220 group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
221 221 group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
222 222 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
223 223
224 224 parent_group = relationship('Group', remote_side=group_id)
225 225
226 226
227 227 def __init__(self, group_name='', parent_group=None):
228 228 self.group_name = group_name
229 229 self.parent_group = parent_group
230 230
231 231 def __repr__(self):
232 232 return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
233 233 self.group_name)
234 234
235 235 class Permission(Base, BaseModel):
236 236 __tablename__ = 'permissions'
237 237 __table_args__ = {'useexisting':True}
238 238 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
239 239 permission_name = Column("permission_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
240 240 permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
241 241
242 242 def __repr__(self):
243 243 return "<%s('%s:%s')>" % (self.__class__.__name__,
244 244 self.permission_id, self.permission_name)
245 245
246 246 class RepoToPerm(Base, BaseModel):
247 247 __tablename__ = 'repo_to_perm'
248 248 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':True})
249 249 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
250 250 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
251 251 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
252 252 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
253 253
254 254 user = relationship('User')
255 255 permission = relationship('Permission')
256 256 repository = relationship('Repository')
257 257
258 258 class UserToPerm(Base, BaseModel):
259 259 __tablename__ = 'user_to_perm'
260 260 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':True})
261 261 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
262 262 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
263 263 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
264 264
265 265 user = relationship('User')
266 266 permission = relationship('Permission')
267 267
268 268
269 269 class UsersGroupToPerm(Base, BaseModel):
270 270 __tablename__ = 'users_group_to_perm'
271 271 __table_args__ = (UniqueConstraint('users_group_id', 'permission_id'), {'useexisting':True})
272 272 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
273 273 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
274 274 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
275 275 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
276 276
277 277 users_group = relationship('UsersGroup')
278 278 permission = relationship('Permission')
279 279 repository = relationship('Repository')
280 280
281 281 class GroupToPerm(Base, BaseModel):
282 282 __tablename__ = 'group_to_perm'
283 283 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'useexisting':True})
284 284
285 285 group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
286 286 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
287 287 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
288 288 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
289 289
290 290 user = relationship('User')
291 291 permission = relationship('Permission')
292 292 group = relationship('Group')
293 293
294 294 class Statistics(Base, BaseModel):
295 295 __tablename__ = 'statistics'
296 296 __table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True})
297 297 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
298 298 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
299 299 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
300 300 commit_activity = Column("commit_activity", LargeBinary(), nullable=False)#JSON data
301 301 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
302 302 languages = Column("languages", LargeBinary(), nullable=False)#JSON data
303 303
304 304 repository = relationship('Repository', single_parent=True)
305 305
306 306 class UserFollowing(Base, BaseModel):
307 307 __tablename__ = 'user_followings'
308 308 __table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
309 309 UniqueConstraint('user_id', 'follows_user_id')
310 310 , {'useexisting':True})
311 311
312 312 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
313 313 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
314 314 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
315 315 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
316 316
317 317 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
318 318
319 319 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
320 320 follows_repository = relationship('Repository', order_by='Repository.repo_name')
321 321
322 322 class CacheInvalidation(Base, BaseModel):
323 323 __tablename__ = 'cache_invalidation'
324 324 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True})
325 325 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
326 326 cache_key = Column("cache_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
327 327 cache_args = Column("cache_args", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
328 328 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
329 329
330 330
331 331 def __init__(self, cache_key, cache_args=''):
332 332 self.cache_key = cache_key
333 333 self.cache_args = cache_args
334 334 self.cache_active = False
335 335
336 336 def __repr__(self):
337 337 return "<%s('%s:%s')>" % (self.__class__.__name__,
338 338 self.cache_id, self.cache_key)
339 339
340 340 class DbMigrateVersion(Base, BaseModel):
341 341 __tablename__ = 'db_migrate_version'
342 342 __table_args__ = {'useexisting':True}
343 343 repository_id = Column('repository_id', String(250), primary_key=True)
344 344 repository_path = Column('repository_path', Text)
345 345 version = Column('version', Integer)
346 346
General Comments 0
You need to be logged in to leave comments. Login now