changeset 2765:186b1cf7f759 beta

Step6a for migrations from 1.3.6 to 1.4.0
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 01 Sep 2012 19:31:31 +0200
parents c7a27b04ce58
children 66493675dd5a
files rhodecode/lib/db_manage.py rhodecode/lib/dbmigrate/migrate/changeset/ansisql.py rhodecode/lib/dbmigrate/migrate/changeset/databases/sqlite.py rhodecode/lib/dbmigrate/schema/db_1_3_0.py rhodecode/lib/dbmigrate/versions/006_version_1_4_0.py rhodecode/model/db.py
diffstat 6 files changed, 233 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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:
--- 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,
--- 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
--- 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):
--- 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')