Show More
@@ -31,17 +31,20 b' import logging' | |||||
31 | from os.path import dirname as dn, join as jn |
|
31 | from os.path import dirname as dn, join as jn | |
32 |
|
32 | |||
33 | from rhodecode import __dbversion__ |
|
33 | from rhodecode import __dbversion__ | |
34 | from rhodecode.model import meta |
|
|||
35 |
|
34 | |||
36 | from rhodecode.model.user import UserModel |
|
35 | from rhodecode.model.user import UserModel | |
37 | from rhodecode.lib.utils import ask_ok |
|
36 | from rhodecode.lib.utils import ask_ok | |
38 | from rhodecode.model import init_model |
|
37 | from rhodecode.model import init_model | |
39 | from rhodecode.model.db import User, Permission, RhodeCodeUi, \ |
|
38 | from rhodecode.model.db import User, Permission, RhodeCodeUi, \ | |
40 | RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup,\ |
|
39 | RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup, \ | |
41 | UserRepoGroupToPerm |
|
40 | UserRepoGroupToPerm | |
42 |
|
41 | |||
43 | from sqlalchemy.engine import create_engine |
|
42 | from sqlalchemy.engine import create_engine | |
|
43 | from sqlalchemy.schema import MetaData | |||
44 | from rhodecode.model.repos_group import ReposGroupModel |
|
44 | from rhodecode.model.repos_group import ReposGroupModel | |
|
45 | #from rhodecode.model import meta | |||
|
46 | from rhodecode.model.meta import Session, Base | |||
|
47 | ||||
45 |
|
48 | |||
46 | log = logging.getLogger(__name__) |
|
49 | log = logging.getLogger(__name__) | |
47 |
|
50 | |||
@@ -59,7 +62,7 b' class DbManage(object):' | |||||
59 | def init_db(self): |
|
62 | def init_db(self): | |
60 | engine = create_engine(self.dburi, echo=self.log_sql) |
|
63 | engine = create_engine(self.dburi, echo=self.log_sql) | |
61 | init_model(engine) |
|
64 | init_model(engine) | |
62 |
self.sa = |
|
65 | self.sa = Session() | |
63 |
|
66 | |||
64 | def create_tables(self, override=False, defaults={}): |
|
67 | def create_tables(self, override=False, defaults={}): | |
65 | """ |
|
68 | """ | |
@@ -74,10 +77,10 b' class DbManage(object):' | |||||
74 | if not destroy: |
|
77 | if not destroy: | |
75 | sys.exit() |
|
78 | sys.exit() | |
76 | if destroy: |
|
79 | if destroy: | |
77 |
|
|
80 | Base.metadata.drop_all() | |
78 |
|
81 | |||
79 | checkfirst = not override |
|
82 | checkfirst = not override | |
80 |
|
|
83 | Base.metadata.create_all(checkfirst=checkfirst) | |
81 | log.info('Created tables for %s' % self.dbname) |
|
84 | log.info('Created tables for %s' % self.dbname) | |
82 |
|
85 | |||
83 | def set_db_version(self): |
|
86 | def set_db_version(self): | |
@@ -179,7 +182,42 b' class DbManage(object):' | |||||
179 | pass |
|
182 | pass | |
180 |
|
183 | |||
181 | def step_6(self): |
|
184 | def step_6(self): | |
182 | pass |
|
185 | print ('re-checking permissions') | |
|
186 | self.klass.create_permissions() | |||
|
187 | ||||
|
188 | print ('installing new hooks') | |||
|
189 | hooks4 = RhodeCodeUi() | |||
|
190 | hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH | |||
|
191 | hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push' | |||
|
192 | Session().add(hooks4) | |||
|
193 | ||||
|
194 | hooks6 = RhodeCodeUi() | |||
|
195 | hooks6.ui_section = 'hooks' | |||
|
196 | hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL | |||
|
197 | hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull' | |||
|
198 | Session().add(hooks6) | |||
|
199 | ||||
|
200 | print ('installing hgsubversion option') | |||
|
201 | # enable hgsubversion disabled by default | |||
|
202 | hgsubversion = RhodeCodeUi() | |||
|
203 | hgsubversion.ui_section = 'extensions' | |||
|
204 | hgsubversion.ui_key = 'hgsubversion' | |||
|
205 | hgsubversion.ui_value = '' | |||
|
206 | hgsubversion.ui_active = False | |||
|
207 | Session().add(hgsubversion) | |||
|
208 | ||||
|
209 | print ('installing hg git option') | |||
|
210 | # enable hggit disabled by default | |||
|
211 | hggit = RhodeCodeUi() | |||
|
212 | hggit.ui_section = 'extensions' | |||
|
213 | hggit.ui_key = 'hggit' | |||
|
214 | hggit.ui_value = '' | |||
|
215 | hggit.ui_active = False | |||
|
216 | Session().add(hggit) | |||
|
217 | ||||
|
218 | print ('re-check default permissions') | |||
|
219 | self.klass.populate_default_permissions() | |||
|
220 | ||||
183 | upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1) |
|
221 | upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1) | |
184 |
|
222 | |||
185 | # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE |
|
223 | # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE | |
@@ -276,9 +314,9 b' class DbManage(object):' | |||||
276 | self.create_user(username, password, email, True) |
|
314 | self.create_user(username, password, email, True) | |
277 | else: |
|
315 | else: | |
278 | log.info('creating admin and regular test users') |
|
316 | log.info('creating admin and regular test users') | |
279 | from rhodecode.tests import TEST_USER_ADMIN_LOGIN,\ |
|
317 | from rhodecode.tests import TEST_USER_ADMIN_LOGIN, \ | |
280 | TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL,\ |
|
318 | TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL, \ | |
281 | TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,\ |
|
319 | TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS, \ | |
282 | TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR2_LOGIN, \ |
|
320 | TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR2_LOGIN, \ | |
283 | TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL |
|
321 | TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL | |
284 |
|
322 | |||
@@ -524,30 +562,21 b' class DbManage(object):' | |||||
524 |
|
562 | |||
525 | default_user = User.get_by_username('default') |
|
563 | default_user = User.get_by_username('default') | |
526 |
|
564 | |||
527 | reg_perm = UserToPerm() |
|
565 | for def_perm in ['hg.register.manual_activate', 'hg.create.repository', | |
528 | reg_perm.user = default_user |
|
566 | 'hg.fork.repository', 'repository.read']: | |
529 | reg_perm.permission = self.sa.query(Permission)\ |
|
|||
530 | .filter(Permission.permission_name == 'hg.register.manual_activate')\ |
|
|||
531 | .scalar() |
|
|||
532 | self.sa.add(reg_perm) |
|
|||
533 |
|
||||
534 | create_repo_perm = UserToPerm() |
|
|||
535 | create_repo_perm.user = default_user |
|
|||
536 | create_repo_perm.permission = self.sa.query(Permission)\ |
|
|||
537 | .filter(Permission.permission_name == 'hg.create.repository')\ |
|
|||
538 | .scalar() |
|
|||
539 | self.sa.add(create_repo_perm) |
|
|||
540 |
|
567 | |||
541 | default_fork_perm = UserToPerm() |
|
568 | perm = self.sa.query(Permission)\ | |
542 | default_fork_perm.user = default_user |
|
569 | .filter(Permission.permission_name == def_perm)\ | |
543 | default_fork_perm.permission = self.sa.query(Permission)\ |
|
570 | .scalar() | |
544 | .filter(Permission.permission_name == 'hg.fork.repository')\ |
|
571 | if not perm: | |
545 | .scalar() |
|
572 | raise Exception( | |
546 | self.sa.add(default_fork_perm) |
|
573 | 'CRITICAL: permission %s not found inside database !!' | |
547 |
|
574 | % def_perm | ||
548 | default_repo_perm = UserToPerm() |
|
575 | ) | |
549 | default_repo_perm.user = default_user |
|
576 | if not UserToPerm.query()\ | |
550 |
|
|
577 | .filter(UserToPerm.permission == perm)\ | |
551 | .filter(Permission.permission_name == 'repository.read')\ |
|
578 | .filter(UserToPerm.user == default_user).scalar(): | |
552 | .scalar() |
|
579 | reg_perm = UserToPerm() | |
553 | self.sa.add(default_repo_perm) |
|
580 | reg_perm.user = default_user | |
|
581 | reg_perm.permission = perm | |||
|
582 | self.sa.add(reg_perm) |
@@ -94,6 +94,7 b' class ANSIColumnGenerator(AlterTableVisi' | |||||
94 |
|
94 | |||
95 | table = self.start_alter_table(column) |
|
95 | table = self.start_alter_table(column) | |
96 | self.append("ADD ") |
|
96 | self.append("ADD ") | |
|
97 | ||||
97 | self.append(self.get_column_specification(column)) |
|
98 | self.append(self.get_column_specification(column)) | |
98 |
|
99 | |||
99 | for cons in column.constraints: |
|
100 | for cons in column.constraints: |
@@ -49,6 +49,7 b' class SQLiteHelper(SQLiteCommon):' | |||||
49 | else: |
|
49 | else: | |
50 | column = delta |
|
50 | column = delta | |
51 | table = self._to_table(column.table) |
|
51 | table = self._to_table(column.table) | |
|
52 | ||||
52 | self.recreate_table(table,column,delta) |
|
53 | self.recreate_table(table,column,delta) | |
53 |
|
54 | |||
54 | class SQLiteColumnGenerator(SQLiteSchemaGenerator, |
|
55 | class SQLiteColumnGenerator(SQLiteSchemaGenerator, |
@@ -1290,3 +1290,31 b' class DbMigrateVersion(Base, BaseModel):' | |||||
1290 | repository_id = Column('repository_id', String(250), primary_key=True) |
|
1290 | repository_id = Column('repository_id', String(250), primary_key=True) | |
1291 | repository_path = Column('repository_path', Text) |
|
1291 | repository_path = Column('repository_path', Text) | |
1292 | version = Column('version', Integer) |
|
1292 | version = Column('version', Integer) | |
|
1293 | ||||
|
1294 | ## this is migration from 1_4_0, but now it's here to overcome a problem of | |||
|
1295 | ## attaching a FK to this from 1_3_0 ! | |||
|
1296 | ||||
|
1297 | ||||
|
1298 | class PullRequest(Base, BaseModel): | |||
|
1299 | __tablename__ = 'pull_requests' | |||
|
1300 | __table_args__ = ( | |||
|
1301 | {'extend_existing': True, 'mysql_engine': 'InnoDB', | |||
|
1302 | 'mysql_charset': 'utf8'}, | |||
|
1303 | ) | |||
|
1304 | ||||
|
1305 | STATUS_NEW = u'new' | |||
|
1306 | STATUS_OPEN = u'open' | |||
|
1307 | STATUS_CLOSED = u'closed' | |||
|
1308 | ||||
|
1309 | pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True) | |||
|
1310 | title = Column('title', Unicode(256), nullable=True) | |||
|
1311 | description = Column('description', UnicodeText(10240), nullable=True) | |||
|
1312 | status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW) | |||
|
1313 | created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) | |||
|
1314 | updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) | |||
|
1315 | user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None) | |||
|
1316 | _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max | |||
|
1317 | org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False) | |||
|
1318 | org_ref = Column('org_ref', Unicode(256), nullable=False) | |||
|
1319 | other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False) | |||
|
1320 | other_ref = Column('other_ref', Unicode(256), nullable=False) No newline at end of file |
@@ -5,21 +5,156 b' from sqlalchemy import *' | |||||
5 | from sqlalchemy.exc import DatabaseError |
|
5 | from sqlalchemy.exc import DatabaseError | |
6 | from sqlalchemy.orm import relation, backref, class_mapper |
|
6 | from sqlalchemy.orm import relation, backref, class_mapper | |
7 | from sqlalchemy.orm.session import Session |
|
7 | from sqlalchemy.orm.session import Session | |
|
8 | from sqlalchemy.ext.declarative import declarative_base | |||
8 |
|
9 | |||
9 | from rhodecode.lib.dbmigrate.migrate import * |
|
10 | from rhodecode.lib.dbmigrate.migrate import * | |
10 | from rhodecode.lib.dbmigrate.migrate.changeset import * |
|
11 | from rhodecode.lib.dbmigrate.migrate.changeset import * | |
11 |
|
12 | |||
12 | from rhodecode.model.meta import Base |
|
13 | from rhodecode.model.meta import Base | |
|
14 | from rhodecode.model import meta | |||
13 |
|
15 | |||
14 | log = logging.getLogger(__name__) |
|
16 | log = logging.getLogger(__name__) | |
15 |
|
17 | |||
16 |
|
18 | |||
17 | def upgrade(migrate_engine): |
|
19 | def upgrade(migrate_engine): | |
18 | """ Upgrade operations go here. |
|
20 | """ | |
|
21 | Upgrade operations go here. | |||
19 | Don't create your own engine; bind migrate_engine to your metadata |
|
22 | Don't create your own engine; bind migrate_engine to your metadata | |
20 | """ |
|
23 | """ | |
21 |
|
24 | |||
22 | #TODO when 1.4 is ready fill it ! |
|
25 | #========================================================================== | |
|
26 | # USEREMAILMAP | |||
|
27 | #========================================================================== | |||
|
28 | from rhodecode.lib.dbmigrate.schema.db_1_4_0 import UserEmailMap | |||
|
29 | tbl = UserEmailMap.__table__ | |||
|
30 | tbl.create() | |||
|
31 | #========================================================================== | |||
|
32 | # PULL REQUEST | |||
|
33 | #========================================================================== | |||
|
34 | from rhodecode.lib.dbmigrate.schema.db_1_4_0 import PullRequest | |||
|
35 | tbl = PullRequest.__table__ | |||
|
36 | tbl.create() | |||
|
37 | ||||
|
38 | #========================================================================== | |||
|
39 | # PULL REQUEST REVIEWERS | |||
|
40 | #========================================================================== | |||
|
41 | from rhodecode.lib.dbmigrate.schema.db_1_4_0 import PullRequestReviewers | |||
|
42 | tbl = PullRequestReviewers.__table__ | |||
|
43 | tbl.create() | |||
|
44 | ||||
|
45 | #========================================================================== | |||
|
46 | # CHANGESET STATUS | |||
|
47 | #========================================================================== | |||
|
48 | from rhodecode.lib.dbmigrate.schema.db_1_4_0 import ChangesetStatus | |||
|
49 | tbl = ChangesetStatus.__table__ | |||
|
50 | tbl.create() | |||
|
51 | ||||
|
52 | ## RESET COMPLETLY THE metadata for sqlalchemy to use the 1_3_0 Base | |||
|
53 | Base = declarative_base() | |||
|
54 | Base.metadata.clear() | |||
|
55 | Base.metadata = MetaData() | |||
|
56 | Base.metadata.bind = migrate_engine | |||
|
57 | meta.Base = Base | |||
|
58 | ||||
|
59 | #========================================================================== | |||
|
60 | # USERS TABLE | |||
|
61 | #========================================================================== | |||
|
62 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import User | |||
|
63 | tbl = User.__table__ | |||
|
64 | ||||
|
65 | # change column name -> firstname | |||
|
66 | col = User.__table__.columns.name | |||
|
67 | col.alter(index=Index('u_username_idx', 'username')) | |||
|
68 | col.alter(index=Index('u_email_idx', 'email')) | |||
|
69 | col.alter(name="firstname", table=tbl) | |||
|
70 | ||||
|
71 | inherit_default_permissions = Column("inherit_default_permissions", | |||
|
72 | Boolean(), nullable=True, unique=None, | |||
|
73 | default=True) | |||
|
74 | inherit_default_permissions.create(table=tbl) | |||
|
75 | inherit_default_permissions.alter(nullable=False, default=True, table=tbl) | |||
|
76 | ||||
|
77 | #========================================================================== | |||
|
78 | # REPOSITORIES | |||
|
79 | #========================================================================== | |||
|
80 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import Repository | |||
|
81 | tbl = Repository.__table__ | |||
|
82 | ||||
|
83 | enable_locking = Column("enable_locking", Boolean(), nullable=True, | |||
|
84 | unique=None, default=False) | |||
|
85 | enable_locking.create(table=tbl) | |||
|
86 | enable_locking.alter(nullable=False, default=False, table=tbl) | |||
|
87 | ||||
|
88 | _locked = Column("locked", String(255), nullable=True, unique=False, | |||
|
89 | default=None) | |||
|
90 | _locked.create(table=tbl) | |||
|
91 | ||||
|
92 | landing_rev = Column("landing_revision", String(255), nullable=True, | |||
|
93 | unique=False, default='tip') | |||
|
94 | landing_rev.create(table=tbl) | |||
|
95 | landing_rev.alter(nullable=False, default='tip', table=tbl) | |||
|
96 | ||||
|
97 | #========================================================================== | |||
|
98 | # GROUPS | |||
|
99 | #========================================================================== | |||
|
100 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import RepoGroup | |||
|
101 | tbl = RepoGroup.__table__ | |||
|
102 | enable_locking = Column("enable_locking", Boolean(), nullable=True, | |||
|
103 | unique=None, default=False) | |||
|
104 | enable_locking.create(table=tbl) | |||
|
105 | enable_locking.alter(nullable=False, default=False) | |||
|
106 | ||||
|
107 | #========================================================================== | |||
|
108 | # CACHE INVALIDATION | |||
|
109 | #========================================================================== | |||
|
110 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import CacheInvalidation | |||
|
111 | tbl = CacheInvalidation.__table__ | |||
|
112 | ||||
|
113 | # change column name -> firstname | |||
|
114 | col = CacheInvalidation.__table__.columns.cache_key | |||
|
115 | col.alter(index=Index('key_idx', 'cache_key')) | |||
|
116 | ||||
|
117 | #========================================================================== | |||
|
118 | # NOTIFICATION | |||
|
119 | #========================================================================== | |||
|
120 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import Notification | |||
|
121 | tbl = Notification.__table__ | |||
|
122 | ||||
|
123 | # change column name -> firstname | |||
|
124 | col = Notification.__table__.columns.type | |||
|
125 | col.alter(index=Index('notification_type_idx', 'type'),) | |||
|
126 | ||||
|
127 | #========================================================================== | |||
|
128 | # CHANGESET_COMMENTS | |||
|
129 | #========================================================================== | |||
|
130 | from rhodecode.lib.dbmigrate.schema.db_1_3_0 import ChangesetComment | |||
|
131 | ||||
|
132 | tbl = ChangesetComment.__table__ | |||
|
133 | ||||
|
134 | col = ChangesetComment.__table__.columns.revision | |||
|
135 | col.alter(index=Index('cc_revision_idx', 'revision'),) | |||
|
136 | ||||
|
137 | hl_lines = Column('hl_lines', Unicode(512), nullable=True) | |||
|
138 | hl_lines.create(table=tbl) | |||
|
139 | ||||
|
140 | created_on = Column('created_on', DateTime(timezone=False), nullable=True, | |||
|
141 | default=datetime.datetime.now) | |||
|
142 | created_on.create(table=tbl) | |||
|
143 | created_on.alter(nullable=False, default=datetime.datetime.now) | |||
|
144 | modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, | |||
|
145 | default=datetime.datetime.now) | |||
|
146 | modified_at.alter(type=DateTime(timezone=False), table=tbl) | |||
|
147 | ||||
|
148 | pull_request_id = Column("pull_request_id", Integer(), | |||
|
149 | ForeignKey('pull_requests.pull_request_id'), | |||
|
150 | nullable=True) | |||
|
151 | pull_request_id.create(table=tbl) | |||
|
152 | ## RESET COMPLETLY THE metadata for sqlalchemy back after using 1_3_0 | |||
|
153 | Base = declarative_base() | |||
|
154 | Base.metadata.clear() | |||
|
155 | Base.metadata = MetaData() | |||
|
156 | Base.metadata.bind = migrate_engine | |||
|
157 | meta.Base = Base | |||
23 |
|
158 | |||
24 |
|
159 | |||
25 | def downgrade(migrate_engine): |
|
160 | def downgrade(migrate_engine): |
@@ -469,7 +469,8 b' class UserEmailMap(Base, BaseModel):' | |||||
469 | email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) |
|
469 | email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) | |
470 | user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None) |
|
470 | user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None) | |
471 | _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None) |
|
471 | _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None) | |
472 |
|
472 | |||
|
473 | test = Column("test", String(255),nullable=False,default=True) | |||
473 | user = relationship('User', lazy='joined') |
|
474 | user = relationship('User', lazy='joined') | |
474 |
|
475 | |||
475 | @validates('_email') |
|
476 | @validates('_email') |
General Comments 0
You need to be logged in to leave comments.
Login now