"""access_id in user_projects Revision ID: 987edda096f5 Revises: 8a3b10926153 Create Date: 2016-07-05 18:21:14.771273 """ # revision identifiers, used by Alembic. revision = '987edda096f5' down_revision = '8a3b10926153' from alembic import op import sqlalchemy as sa from sqlalchemy.sql import table, column acl = table ( 'access_levels', column('access', sa.String(255)) ) def upgrade(): ''' Add a foreign key in user_projects and projects_groups table for access_levels ''' # To allow N + 2 migrations easier # without going through N + 1 # Make sure, we have all the tables op.create_table( 'access_levels', sa.Column('access', sa.String(255), primary_key=True) ) op.bulk_insert( acl, [ {'access': 'ticket'}, {'access': 'commit'}, {'access': 'admin'}, ], ) op.add_column( 'user_projects', sa.Column( 'access', sa.String(255), sa.ForeignKey( 'access_levels.access', onupdate='CASCADE', ondelete='CASCADE', ), nullable=True, ), ) op.execute('UPDATE "user_projects" SET access=\'admin\'') op.alter_column( 'user_projects', 'access', nullable=False, existing_nullable=True, ) # for groups op.add_column( 'projects_groups', sa.Column( 'access', sa.String(255), sa.ForeignKey( 'access_levels.access', onupdate='CASCADE', ondelete='CASCADE', ), nullable=True, ), ) op.execute('UPDATE "projects_groups" SET access=\'admin\'') op.alter_column( 'projects_groups', 'access', nullable=False, existing_nullable=True, ) # alter the constraints op.drop_constraint('user_projects_project_id_fkey', 'user_projects') op.create_unique_constraint( None, 'user_projects', ["project_id", "user_id", "access"] ) op.drop_constraint('projects_groups_pkey', 'projects_groups') op.create_primary_key( None, 'projects_groups', ['project_id', 'group_id', 'access'], ) def downgrade(): ''' Remove column access_id from user_projects and projects_groups ''' # this removes the current constraints as well. op.drop_column('user_projects', 'access') op.drop_column('projects_groups', 'access') # recreate the previous constraints op.create_unique_constraint( None, 'user_projects', ['project_id', 'user_id'], ) op.create_primary_key( None, 'projects_groups', ['project_id', 'group_id'], ) op.drop_table('access_levels')