Merge db-migrations: Add Flask-Migrate support and clean up old migration system
This commit is contained in:
251
migrations/versions/c72667903a91_initial_migration.py
Normal file
251
migrations/versions/c72667903a91_initial_migration.py
Normal file
@@ -0,0 +1,251 @@
|
||||
"""Initial migration
|
||||
|
||||
Revision ID: c72667903a91
|
||||
Revises:
|
||||
Create Date: 2025-07-10 08:35:55.412151
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects import postgresql
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'c72667903a91'
|
||||
down_revision = None
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('kanban_card')
|
||||
op.drop_table('kanban_column')
|
||||
op.drop_table('kanban_board')
|
||||
op.drop_index(op.f('idx_invitation_company'), table_name='company_invitation')
|
||||
op.drop_index(op.f('idx_invitation_email'), table_name='company_invitation')
|
||||
op.drop_index(op.f('idx_invitation_expires'), table_name='company_invitation')
|
||||
op.drop_index(op.f('idx_invitation_token'), table_name='company_invitation')
|
||||
op.drop_constraint(op.f('company_settings_created_by_id_fkey'), 'company_settings', type_='foreignkey')
|
||||
op.drop_column('company_settings', 'allow_team_visibility_comments')
|
||||
op.drop_column('company_settings', 'round_time_to')
|
||||
op.drop_column('company_settings', 'time_tracking_mode')
|
||||
op.drop_column('company_settings', 'enable_projects')
|
||||
op.drop_column('company_settings', 'default_comment_visibility')
|
||||
op.drop_column('company_settings', 'require_task_assignment')
|
||||
op.drop_column('company_settings', 'enable_teams')
|
||||
op.drop_column('company_settings', 'require_project_selection')
|
||||
op.drop_column('company_settings', 'restrict_project_access_by_team')
|
||||
op.drop_column('company_settings', 'enable_invoicing')
|
||||
op.drop_column('company_settings', 'auto_break_deduction')
|
||||
op.drop_column('company_settings', 'allow_task_creation_by_members')
|
||||
op.drop_column('company_settings', 'created_by_id')
|
||||
op.drop_column('company_settings', 'enable_reports')
|
||||
op.drop_column('company_settings', 'require_daily_notes')
|
||||
op.drop_column('company_settings', 'min_hours_per_entry')
|
||||
op.drop_column('company_settings', 'default_currency')
|
||||
op.drop_column('company_settings', 'allow_manual_time')
|
||||
op.drop_constraint(op.f('uq_company_work_config'), 'company_work_config', type_='unique')
|
||||
op.drop_index(op.f('idx_note_folder'), table_name='note')
|
||||
op.drop_index(op.f('idx_note_folder_company'), table_name='note_folder')
|
||||
op.drop_index(op.f('idx_note_folder_created_by'), table_name='note_folder')
|
||||
op.drop_index(op.f('idx_note_folder_parent_path'), table_name='note_folder')
|
||||
op.drop_constraint(op.f('note_link_target_note_id_fkey'), 'note_link', type_='foreignkey')
|
||||
op.drop_constraint(op.f('note_link_source_note_id_fkey'), 'note_link', type_='foreignkey')
|
||||
op.create_foreign_key(None, 'note_link', 'note', ['target_note_id'], ['id'], ondelete='CASCADE')
|
||||
op.create_foreign_key(None, 'note_link', 'note', ['source_note_id'], ['id'], ondelete='CASCADE')
|
||||
op.drop_index(op.f('idx_note_share_created_by'), table_name='note_share')
|
||||
op.drop_index(op.f('idx_note_share_note_id'), table_name='note_share')
|
||||
op.drop_index(op.f('idx_note_share_token'), table_name='note_share')
|
||||
op.drop_table_comment(
|
||||
'note_share',
|
||||
existing_comment='Public sharing links for notes with optional password protection and view limits',
|
||||
schema=None
|
||||
)
|
||||
op.alter_column('project_category', 'name',
|
||||
existing_type=sa.VARCHAR(length=100),
|
||||
type_=sa.String(length=50),
|
||||
existing_nullable=False)
|
||||
op.alter_column('project_category', 'description',
|
||||
existing_type=sa.TEXT(),
|
||||
type_=sa.String(length=255),
|
||||
existing_nullable=True)
|
||||
op.drop_constraint(op.f('project_category_created_by_id_fkey'), 'project_category', type_='foreignkey')
|
||||
op.drop_column('project_category', 'icon')
|
||||
op.drop_column('project_category', 'created_by_id')
|
||||
op.drop_column('project_category', 'updated_at')
|
||||
op.alter_column('sub_task', 'status',
|
||||
existing_type=postgresql.ENUM('TODO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED', 'ARCHIVED', 'In Progress', 'To Do', 'Cancelled', 'In Review', 'Archived', 'Done', name='taskstatus'),
|
||||
nullable=True,
|
||||
existing_server_default=sa.text("'TODO'::taskstatus"))
|
||||
op.alter_column('task', 'status',
|
||||
existing_type=postgresql.ENUM('TODO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED', 'ARCHIVED', 'In Progress', 'To Do', 'Cancelled', 'In Review', 'Archived', 'Done', name='taskstatus'),
|
||||
nullable=True,
|
||||
existing_server_default=sa.text("'TODO'::taskstatus"))
|
||||
op.drop_index(op.f('idx_user_default_dashboard'), table_name='user_dashboard')
|
||||
op.drop_constraint(op.f('user_preferences_default_project_id_fkey'), 'user_preferences', type_='foreignkey')
|
||||
op.drop_column('user_preferences', 'daily_summary')
|
||||
op.drop_column('user_preferences', 'mention_notifications')
|
||||
op.drop_column('user_preferences', 'pomodoro_duration')
|
||||
op.drop_column('user_preferences', 'keyboard_shortcuts')
|
||||
op.drop_column('user_preferences', 'week_start')
|
||||
op.drop_column('user_preferences', 'default_project_id')
|
||||
op.drop_column('user_preferences', 'sound_enabled')
|
||||
op.drop_column('user_preferences', 'email_notifications')
|
||||
op.drop_column('user_preferences', 'task_assigned_notifications')
|
||||
op.drop_column('user_preferences', 'pomodoro_enabled')
|
||||
op.drop_column('user_preferences', 'email_daily_summary')
|
||||
op.drop_column('user_preferences', 'email_weekly_summary')
|
||||
op.drop_column('user_preferences', 'task_reminders')
|
||||
op.drop_column('user_preferences', 'auto_start_timer')
|
||||
op.drop_column('user_preferences', 'weekly_report')
|
||||
op.drop_column('user_preferences', 'push_notifications')
|
||||
op.drop_column('user_preferences', 'compact_mode')
|
||||
op.drop_column('user_preferences', 'pomodoro_break')
|
||||
op.drop_column('user_preferences', 'idle_time_detection')
|
||||
op.drop_column('user_preferences', 'task_completed_notifications')
|
||||
op.drop_column('user_preferences', 'show_weekends')
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('user_preferences', sa.Column('show_weekends', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('task_completed_notifications', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('idle_time_detection', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('pomodoro_break', sa.INTEGER(), server_default=sa.text('5'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('compact_mode', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('push_notifications', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('weekly_report', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('auto_start_timer', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('task_reminders', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('email_weekly_summary', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('email_daily_summary', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('pomodoro_enabled', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('task_assigned_notifications', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('email_notifications', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('sound_enabled', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('default_project_id', sa.INTEGER(), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('week_start', sa.INTEGER(), server_default=sa.text('1'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('keyboard_shortcuts', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('pomodoro_duration', sa.INTEGER(), server_default=sa.text('25'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('mention_notifications', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('user_preferences', sa.Column('daily_summary', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.create_foreign_key(op.f('user_preferences_default_project_id_fkey'), 'user_preferences', 'project', ['default_project_id'], ['id'])
|
||||
op.create_index(op.f('idx_user_default_dashboard'), 'user_dashboard', ['user_id', 'is_default'], unique=False)
|
||||
op.alter_column('task', 'status',
|
||||
existing_type=postgresql.ENUM('TODO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED', 'ARCHIVED', 'In Progress', 'To Do', 'Cancelled', 'In Review', 'Archived', 'Done', name='taskstatus'),
|
||||
nullable=False,
|
||||
existing_server_default=sa.text("'TODO'::taskstatus"))
|
||||
op.alter_column('sub_task', 'status',
|
||||
existing_type=postgresql.ENUM('TODO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'CANCELLED', 'ARCHIVED', 'In Progress', 'To Do', 'Cancelled', 'In Review', 'Archived', 'Done', name='taskstatus'),
|
||||
nullable=False,
|
||||
existing_server_default=sa.text("'TODO'::taskstatus"))
|
||||
op.add_column('project_category', sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True))
|
||||
op.add_column('project_category', sa.Column('created_by_id', sa.INTEGER(), autoincrement=False, nullable=False))
|
||||
op.add_column('project_category', sa.Column('icon', sa.VARCHAR(length=50), autoincrement=False, nullable=True))
|
||||
op.create_foreign_key(op.f('project_category_created_by_id_fkey'), 'project_category', 'user', ['created_by_id'], ['id'])
|
||||
op.alter_column('project_category', 'description',
|
||||
existing_type=sa.String(length=255),
|
||||
type_=sa.TEXT(),
|
||||
existing_nullable=True)
|
||||
op.alter_column('project_category', 'name',
|
||||
existing_type=sa.String(length=50),
|
||||
type_=sa.VARCHAR(length=100),
|
||||
existing_nullable=False)
|
||||
op.create_table_comment(
|
||||
'note_share',
|
||||
'Public sharing links for notes with optional password protection and view limits',
|
||||
existing_comment=None,
|
||||
schema=None
|
||||
)
|
||||
op.create_index(op.f('idx_note_share_token'), 'note_share', ['token'], unique=False)
|
||||
op.create_index(op.f('idx_note_share_note_id'), 'note_share', ['note_id'], unique=False)
|
||||
op.create_index(op.f('idx_note_share_created_by'), 'note_share', ['created_by_id'], unique=False)
|
||||
op.drop_constraint(None, 'note_link', type_='foreignkey')
|
||||
op.drop_constraint(None, 'note_link', type_='foreignkey')
|
||||
op.create_foreign_key(op.f('note_link_source_note_id_fkey'), 'note_link', 'note', ['source_note_id'], ['id'])
|
||||
op.create_foreign_key(op.f('note_link_target_note_id_fkey'), 'note_link', 'note', ['target_note_id'], ['id'])
|
||||
op.create_index(op.f('idx_note_folder_parent_path'), 'note_folder', ['parent_path'], unique=False)
|
||||
op.create_index(op.f('idx_note_folder_created_by'), 'note_folder', ['created_by_id'], unique=False)
|
||||
op.create_index(op.f('idx_note_folder_company'), 'note_folder', ['company_id'], unique=False)
|
||||
op.create_index(op.f('idx_note_folder'), 'note', ['folder'], unique=False)
|
||||
op.create_unique_constraint(op.f('uq_company_work_config'), 'company_work_config', ['company_id'])
|
||||
op.add_column('company_settings', sa.Column('allow_manual_time', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('default_currency', sa.VARCHAR(length=3), server_default=sa.text("'USD'::character varying"), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('min_hours_per_entry', postgresql.DOUBLE_PRECISION(precision=53), server_default=sa.text('0.0'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('require_daily_notes', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('enable_reports', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('created_by_id', sa.INTEGER(), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('allow_task_creation_by_members', sa.BOOLEAN(), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('auto_break_deduction', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('enable_invoicing', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('restrict_project_access_by_team', sa.BOOLEAN(), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('require_project_selection', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('enable_teams', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('require_task_assignment', sa.BOOLEAN(), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('default_comment_visibility', postgresql.ENUM('TEAM', 'COMPANY', name='commentvisibility'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('enable_projects', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('time_tracking_mode', sa.VARCHAR(length=20), server_default=sa.text("'flexible'::character varying"), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('round_time_to', sa.INTEGER(), server_default=sa.text('1'), autoincrement=False, nullable=True))
|
||||
op.add_column('company_settings', sa.Column('allow_team_visibility_comments', sa.BOOLEAN(), autoincrement=False, nullable=True))
|
||||
op.create_foreign_key(op.f('company_settings_created_by_id_fkey'), 'company_settings', 'user', ['created_by_id'], ['id'])
|
||||
op.create_index(op.f('idx_invitation_token'), 'company_invitation', ['token'], unique=False)
|
||||
op.create_index(op.f('idx_invitation_expires'), 'company_invitation', ['expires_at'], unique=False)
|
||||
op.create_index(op.f('idx_invitation_email'), 'company_invitation', ['email'], unique=False)
|
||||
op.create_index(op.f('idx_invitation_company'), 'company_invitation', ['company_id'], unique=False)
|
||||
op.create_table('kanban_board',
|
||||
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('kanban_board_id_seq'::regclass)"), autoincrement=True, nullable=False),
|
||||
sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
|
||||
sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
|
||||
sa.Column('company_id', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=True),
|
||||
sa.Column('is_default', sa.BOOLEAN(), autoincrement=False, nullable=True),
|
||||
sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.Column('created_by_id', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.ForeignKeyConstraint(['company_id'], ['company.id'], name='kanban_board_company_id_fkey'),
|
||||
sa.ForeignKeyConstraint(['created_by_id'], ['user.id'], name='kanban_board_created_by_id_fkey'),
|
||||
sa.PrimaryKeyConstraint('id', name='kanban_board_pkey'),
|
||||
sa.UniqueConstraint('company_id', 'name', name='uq_kanban_board_name_per_company'),
|
||||
postgresql_ignore_search_path=False
|
||||
)
|
||||
op.create_table('kanban_column',
|
||||
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('kanban_column_id_seq'::regclass)"), autoincrement=True, nullable=False),
|
||||
sa.Column('name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
|
||||
sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
|
||||
sa.Column('position', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.Column('color', sa.VARCHAR(length=7), autoincrement=False, nullable=True),
|
||||
sa.Column('wip_limit', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||
sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=True),
|
||||
sa.Column('board_id', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.ForeignKeyConstraint(['board_id'], ['kanban_board.id'], name='kanban_column_board_id_fkey'),
|
||||
sa.PrimaryKeyConstraint('id', name='kanban_column_pkey'),
|
||||
sa.UniqueConstraint('board_id', 'name', name='uq_kanban_column_name_per_board'),
|
||||
postgresql_ignore_search_path=False
|
||||
)
|
||||
op.create_table('kanban_card',
|
||||
sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
|
||||
sa.Column('title', sa.VARCHAR(length=200), autoincrement=False, nullable=False),
|
||||
sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
|
||||
sa.Column('position', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.Column('color', sa.VARCHAR(length=7), autoincrement=False, nullable=True),
|
||||
sa.Column('is_active', sa.BOOLEAN(), autoincrement=False, nullable=True),
|
||||
sa.Column('column_id', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.Column('project_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||
sa.Column('task_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||
sa.Column('assigned_to_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||
sa.Column('due_date', sa.DATE(), autoincrement=False, nullable=True),
|
||||
sa.Column('completed_date', sa.DATE(), autoincrement=False, nullable=True),
|
||||
sa.Column('created_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.Column('updated_at', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
|
||||
sa.Column('created_by_id', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||
sa.ForeignKeyConstraint(['assigned_to_id'], ['user.id'], name=op.f('kanban_card_assigned_to_id_fkey')),
|
||||
sa.ForeignKeyConstraint(['column_id'], ['kanban_column.id'], name=op.f('kanban_card_column_id_fkey')),
|
||||
sa.ForeignKeyConstraint(['created_by_id'], ['user.id'], name=op.f('kanban_card_created_by_id_fkey')),
|
||||
sa.ForeignKeyConstraint(['project_id'], ['project.id'], name=op.f('kanban_card_project_id_fkey')),
|
||||
sa.ForeignKeyConstraint(['task_id'], ['task.id'], name=op.f('kanban_card_task_id_fkey')),
|
||||
sa.PrimaryKeyConstraint('id', name=op.f('kanban_card_pkey'))
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
Reference in New Issue
Block a user