# HG changeset patch # User Marcin Kuzminski # Date 1346520691 -7200 # Node ID 186b1cf7f75942f56832a6a99076c62470de0e78 # Parent c7a27b04ce581ecd4880ed0ea351d9887845e17c Step6a for migrations from 1.3.6 to 1.4.0 diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/lib/db_manage.py --- a/rhodecode/lib/db_manage.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/lib/db_manage.py Sat Sep 01 19:31:31 2012 +0200 @@ -31,17 +31,20 @@ from os.path import dirname as dn, join as jn from rhodecode import __dbversion__ -from rhodecode.model import meta from rhodecode.model.user import UserModel from rhodecode.lib.utils import ask_ok from rhodecode.model import init_model from rhodecode.model.db import User, Permission, RhodeCodeUi, \ - RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup,\ + RhodeCodeSetting, UserToPerm, DbMigrateVersion, RepoGroup, \ UserRepoGroupToPerm from sqlalchemy.engine import create_engine +from sqlalchemy.schema import MetaData from rhodecode.model.repos_group import ReposGroupModel +#from rhodecode.model import meta +from rhodecode.model.meta import Session, Base + log = logging.getLogger(__name__) @@ -59,7 +62,7 @@ def init_db(self): engine = create_engine(self.dburi, echo=self.log_sql) init_model(engine) - self.sa = meta.Session() + self.sa = Session() def create_tables(self, override=False, defaults={}): """ @@ -74,10 +77,10 @@ if not destroy: sys.exit() if destroy: - meta.Base.metadata.drop_all() + Base.metadata.drop_all() checkfirst = not override - meta.Base.metadata.create_all(checkfirst=checkfirst) + Base.metadata.create_all(checkfirst=checkfirst) log.info('Created tables for %s' % self.dbname) def set_db_version(self): @@ -179,7 +182,42 @@ pass def step_6(self): - pass + print ('re-checking permissions') + self.klass.create_permissions() + + print ('installing new hooks') + hooks4 = RhodeCodeUi() + hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH + hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push' + Session().add(hooks4) + + hooks6 = RhodeCodeUi() + hooks6.ui_section = 'hooks' + hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL + hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull' + Session().add(hooks6) + + print ('installing hgsubversion option') + # enable hgsubversion disabled by default + hgsubversion = RhodeCodeUi() + hgsubversion.ui_section = 'extensions' + hgsubversion.ui_key = 'hgsubversion' + hgsubversion.ui_value = '' + hgsubversion.ui_active = False + Session().add(hgsubversion) + + print ('installing hg git option') + # enable hggit disabled by default + hggit = RhodeCodeUi() + hggit.ui_section = 'extensions' + hggit.ui_key = 'hggit' + hggit.ui_value = '' + hggit.ui_active = False + Session().add(hggit) + + print ('re-check default permissions') + self.klass.populate_default_permissions() + upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1) # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE @@ -276,9 +314,9 @@ self.create_user(username, password, email, True) else: log.info('creating admin and regular test users') - from rhodecode.tests import TEST_USER_ADMIN_LOGIN,\ - TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL,\ - TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,\ + from rhodecode.tests import TEST_USER_ADMIN_LOGIN, \ + TEST_USER_ADMIN_PASS, TEST_USER_ADMIN_EMAIL, \ + TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS, \ TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR2_LOGIN, \ TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR2_EMAIL @@ -524,30 +562,21 @@ default_user = User.get_by_username('default') - reg_perm = UserToPerm() - reg_perm.user = default_user - reg_perm.permission = self.sa.query(Permission)\ - .filter(Permission.permission_name == 'hg.register.manual_activate')\ - .scalar() - self.sa.add(reg_perm) - - create_repo_perm = UserToPerm() - create_repo_perm.user = default_user - create_repo_perm.permission = self.sa.query(Permission)\ - .filter(Permission.permission_name == 'hg.create.repository')\ - .scalar() - self.sa.add(create_repo_perm) + for def_perm in ['hg.register.manual_activate', 'hg.create.repository', + 'hg.fork.repository', 'repository.read']: - default_fork_perm = UserToPerm() - default_fork_perm.user = default_user - default_fork_perm.permission = self.sa.query(Permission)\ - .filter(Permission.permission_name == 'hg.fork.repository')\ - .scalar() - self.sa.add(default_fork_perm) - - default_repo_perm = UserToPerm() - default_repo_perm.user = default_user - default_repo_perm.permission = self.sa.query(Permission)\ - .filter(Permission.permission_name == 'repository.read')\ - .scalar() - self.sa.add(default_repo_perm) + perm = self.sa.query(Permission)\ + .filter(Permission.permission_name == def_perm)\ + .scalar() + if not perm: + raise Exception( + 'CRITICAL: permission %s not found inside database !!' + % def_perm + ) + if not UserToPerm.query()\ + .filter(UserToPerm.permission == perm)\ + .filter(UserToPerm.user == default_user).scalar(): + reg_perm = UserToPerm() + reg_perm.user = default_user + reg_perm.permission = perm + self.sa.add(reg_perm) diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/lib/dbmigrate/migrate/changeset/ansisql.py --- a/rhodecode/lib/dbmigrate/migrate/changeset/ansisql.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/lib/dbmigrate/migrate/changeset/ansisql.py Sat Sep 01 19:31:31 2012 +0200 @@ -94,6 +94,7 @@ table = self.start_alter_table(column) self.append("ADD ") + self.append(self.get_column_specification(column)) for cons in column.constraints: diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/lib/dbmigrate/migrate/changeset/databases/sqlite.py --- a/rhodecode/lib/dbmigrate/migrate/changeset/databases/sqlite.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/lib/dbmigrate/migrate/changeset/databases/sqlite.py Sat Sep 01 19:31:31 2012 +0200 @@ -49,6 +49,7 @@ else: column = delta table = self._to_table(column.table) + self.recreate_table(table,column,delta) class SQLiteColumnGenerator(SQLiteSchemaGenerator, diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/lib/dbmigrate/schema/db_1_3_0.py --- a/rhodecode/lib/dbmigrate/schema/db_1_3_0.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/lib/dbmigrate/schema/db_1_3_0.py Sat Sep 01 19:31:31 2012 +0200 @@ -1290,3 +1290,31 @@ repository_id = Column('repository_id', String(250), primary_key=True) repository_path = Column('repository_path', Text) version = Column('version', Integer) + +## this is migration from 1_4_0, but now it's here to overcome a problem of +## attaching a FK to this from 1_3_0 ! + + +class PullRequest(Base, BaseModel): + __tablename__ = 'pull_requests' + __table_args__ = ( + {'extend_existing': True, 'mysql_engine': 'InnoDB', + 'mysql_charset': 'utf8'}, + ) + + STATUS_NEW = u'new' + STATUS_OPEN = u'open' + STATUS_CLOSED = u'closed' + + pull_request_id = Column('pull_request_id', Integer(), nullable=False, primary_key=True) + title = Column('title', Unicode(256), nullable=True) + description = Column('description', UnicodeText(10240), nullable=True) + status = Column('status', Unicode(256), nullable=False, default=STATUS_NEW) + created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) + updated_on = Column('updated_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) + user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None) + _revisions = Column('revisions', UnicodeText(20500)) # 500 revisions max + org_repo_id = Column('org_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False) + org_ref = Column('org_ref', Unicode(256), nullable=False) + other_repo_id = Column('other_repo_id', Integer(), ForeignKey('repositories.repo_id'), nullable=False) + other_ref = Column('other_ref', Unicode(256), nullable=False) \ No newline at end of file diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/lib/dbmigrate/versions/006_version_1_4_0.py --- a/rhodecode/lib/dbmigrate/versions/006_version_1_4_0.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/lib/dbmigrate/versions/006_version_1_4_0.py Sat Sep 01 19:31:31 2012 +0200 @@ -5,21 +5,156 @@ from sqlalchemy.exc import DatabaseError from sqlalchemy.orm import relation, backref, class_mapper from sqlalchemy.orm.session import Session +from sqlalchemy.ext.declarative import declarative_base from rhodecode.lib.dbmigrate.migrate import * from rhodecode.lib.dbmigrate.migrate.changeset import * from rhodecode.model.meta import Base +from rhodecode.model import meta log = logging.getLogger(__name__) def upgrade(migrate_engine): - """ Upgrade operations go here. + """ + Upgrade operations go here. Don't create your own engine; bind migrate_engine to your metadata """ - #TODO when 1.4 is ready fill it ! + #========================================================================== + # USEREMAILMAP + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_4_0 import UserEmailMap + tbl = UserEmailMap.__table__ + tbl.create() + #========================================================================== + # PULL REQUEST + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_4_0 import PullRequest + tbl = PullRequest.__table__ + tbl.create() + + #========================================================================== + # PULL REQUEST REVIEWERS + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_4_0 import PullRequestReviewers + tbl = PullRequestReviewers.__table__ + tbl.create() + + #========================================================================== + # CHANGESET STATUS + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_4_0 import ChangesetStatus + tbl = ChangesetStatus.__table__ + tbl.create() + + ## RESET COMPLETLY THE metadata for sqlalchemy to use the 1_3_0 Base + Base = declarative_base() + Base.metadata.clear() + Base.metadata = MetaData() + Base.metadata.bind = migrate_engine + meta.Base = Base + + #========================================================================== + # USERS TABLE + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import User + tbl = User.__table__ + + # change column name -> firstname + col = User.__table__.columns.name + col.alter(index=Index('u_username_idx', 'username')) + col.alter(index=Index('u_email_idx', 'email')) + col.alter(name="firstname", table=tbl) + + inherit_default_permissions = Column("inherit_default_permissions", + Boolean(), nullable=True, unique=None, + default=True) + inherit_default_permissions.create(table=tbl) + inherit_default_permissions.alter(nullable=False, default=True, table=tbl) + + #========================================================================== + # REPOSITORIES + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import Repository + tbl = Repository.__table__ + + enable_locking = Column("enable_locking", Boolean(), nullable=True, + unique=None, default=False) + enable_locking.create(table=tbl) + enable_locking.alter(nullable=False, default=False, table=tbl) + + _locked = Column("locked", String(255), nullable=True, unique=False, + default=None) + _locked.create(table=tbl) + + landing_rev = Column("landing_revision", String(255), nullable=True, + unique=False, default='tip') + landing_rev.create(table=tbl) + landing_rev.alter(nullable=False, default='tip', table=tbl) + + #========================================================================== + # GROUPS + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import RepoGroup + tbl = RepoGroup.__table__ + enable_locking = Column("enable_locking", Boolean(), nullable=True, + unique=None, default=False) + enable_locking.create(table=tbl) + enable_locking.alter(nullable=False, default=False) + + #========================================================================== + # CACHE INVALIDATION + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import CacheInvalidation + tbl = CacheInvalidation.__table__ + + # change column name -> firstname + col = CacheInvalidation.__table__.columns.cache_key + col.alter(index=Index('key_idx', 'cache_key')) + + #========================================================================== + # NOTIFICATION + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import Notification + tbl = Notification.__table__ + + # change column name -> firstname + col = Notification.__table__.columns.type + col.alter(index=Index('notification_type_idx', 'type'),) + + #========================================================================== + # CHANGESET_COMMENTS + #========================================================================== + from rhodecode.lib.dbmigrate.schema.db_1_3_0 import ChangesetComment + + tbl = ChangesetComment.__table__ + + col = ChangesetComment.__table__.columns.revision + col.alter(index=Index('cc_revision_idx', 'revision'),) + + hl_lines = Column('hl_lines', Unicode(512), nullable=True) + hl_lines.create(table=tbl) + + created_on = Column('created_on', DateTime(timezone=False), nullable=True, + default=datetime.datetime.now) + created_on.create(table=tbl) + created_on.alter(nullable=False, default=datetime.datetime.now) + modified_at = Column('modified_at', DateTime(timezone=False), nullable=False, + default=datetime.datetime.now) + modified_at.alter(type=DateTime(timezone=False), table=tbl) + + pull_request_id = Column("pull_request_id", Integer(), + ForeignKey('pull_requests.pull_request_id'), + nullable=True) + pull_request_id.create(table=tbl) + ## RESET COMPLETLY THE metadata for sqlalchemy back after using 1_3_0 + Base = declarative_base() + Base.metadata.clear() + Base.metadata = MetaData() + Base.metadata.bind = migrate_engine + meta.Base = Base def downgrade(migrate_engine): diff -r c7a27b04ce58 -r 186b1cf7f759 rhodecode/model/db.py --- a/rhodecode/model/db.py Fri Aug 31 14:48:38 2012 +0200 +++ b/rhodecode/model/db.py Sat Sep 01 19:31:31 2012 +0200 @@ -469,7 +469,8 @@ email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None) _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None) - + + test = Column("test", String(255),nullable=False,default=True) user = relationship('User', lazy='joined') @validates('_email')