Files
service-finder/migrations/versions/553ef1388276_rebuild_schema_v2.py

264 lines
15 KiB
Python
Executable File

"""rebuild_schema_v2
Revision ID: 553ef1388276
Revises: c21c2c7e70d4
Create Date: 2026-01-25 11:32:10.692756
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '553ef1388276'
down_revision: Union[str, Sequence[str], None] = 'c21c2c7e70d4'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('system_settings',
sa.Column('key', sa.String(), nullable=False),
sa.Column('value', sa.JSON(), nullable=False),
sa.Column('description', sa.String(), nullable=True),
sa.PrimaryKeyConstraint('key'),
schema='data'
)
op.create_index(op.f('ix_data_system_settings_key'), 'system_settings', ['key'], unique=False, schema='data')
op.drop_table('costs', schema='data')
op.drop_table('point_rules', schema='data')
op.drop_table('regional_settings', schema='data')
op.drop_table('level_configs', schema='data')
op.drop_table('vehicle_history', schema='data')
op.alter_column('badges', 'description',
existing_type=sa.TEXT(),
type_=sa.String(length=255),
nullable=False,
schema='data')
op.alter_column('badges', 'icon_url',
existing_type=sa.VARCHAR(length=255),
type_=sa.String(length=500),
existing_nullable=True,
schema='data')
op.create_index(op.f('ix_data_badges_id'), 'badges', ['id'], unique=False, schema='data')
op.create_unique_constraint(None, 'badges', ['name'], schema='data')
op.drop_column('badges', 'created_at', schema='data')
op.drop_column('badges', 'criteria_json', schema='data')
op.alter_column('points_ledger', 'user_id',
existing_type=sa.INTEGER(),
nullable=False,
schema='data')
op.alter_column('points_ledger', 'timestamp',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=False,
existing_server_default=sa.text('now()'),
schema='data')
op.create_index(op.f('ix_data_points_ledger_id'), 'points_ledger', ['id'], unique=False, schema='data')
op.create_index(op.f('ix_data_points_ledger_user_id'), 'points_ledger', ['user_id'], unique=False, schema='data')
op.add_column('translations', sa.Column('is_published', sa.Boolean(), nullable=True), schema='data')
op.drop_constraint('translations_key_lang_code_key', 'translations', schema='data', type_='unique')
op.create_index(op.f('ix_data_translations_id'), 'translations', ['id'], unique=False, schema='data')
op.create_index(op.f('ix_data_translations_key'), 'translations', ['key'], unique=False, schema='data')
op.create_index(op.f('ix_data_translations_lang_code'), 'translations', ['lang_code'], unique=False, schema='data')
op.create_unique_constraint('uq_translation_key_lang', 'translations', ['key', 'lang_code'], schema='data')
op.alter_column('user_badges', 'user_id',
existing_type=sa.INTEGER(),
nullable=False,
schema='data')
op.alter_column('user_badges', 'badge_id',
existing_type=sa.INTEGER(),
nullable=False,
schema='data')
op.alter_column('user_badges', 'earned_at',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=False,
existing_server_default=sa.text('now()'),
schema='data')
op.drop_constraint('user_badges_user_id_badge_id_key', 'user_badges', schema='data', type_='unique')
op.alter_column('user_stats', 'total_points',
existing_type=sa.INTEGER(),
nullable=False,
existing_server_default=sa.text('0'),
schema='data')
op.alter_column('user_stats', 'current_level',
existing_type=sa.INTEGER(),
nullable=False,
existing_server_default=sa.text('1'),
schema='data')
op.alter_column('user_stats', 'last_updated',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=False,
existing_server_default=sa.text('now()'),
schema='data')
# --- JAVÍTOTT RÉSZ KEZDETE (Role konverzió default kezeléssel) ---
# 1. Meglévő default eldobása
op.execute('ALTER TABLE data.users ALTER COLUMN role DROP DEFAULT')
# 2. Típusmódosítás
op.alter_column('users', 'role',
existing_type=postgresql.ENUM('SUPERUSER', 'REGIONAL_ADMIN', 'MODERATOR', 'BUSINESS_PARTNER', 'USER', name='user_role', schema='data'),
type_=sa.Enum('SUPERUSER', 'REGIONAL_ADMIN', 'MODERATOR', 'BUSINESS_PARTNER', 'USER', name='userrole'),
nullable=False,
schema='data',
postgresql_using='role::text::userrole')
# 3. Új default beállítása az új típussal
op.execute("ALTER TABLE data.users ALTER COLUMN role SET DEFAULT 'USER'::userrole")
# --- JAVÍTOTT RÉSZ VÉGE ---
op.drop_index('idx_users_role', table_name='users', schema='data')
op.create_index(op.f('ix_data_users_region_code'), 'users', ['region_code'], unique=False, schema='data')
op.create_foreign_key(None, 'vehicle_assignments', 'user_vehicles', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data')
op.drop_index('ix_data_vehicle_events_vehicle_id', table_name='vehicle_events', schema='data')
op.create_foreign_key(None, 'vehicle_events', 'user_vehicles', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data')
op.create_foreign_key(None, 'vehicle_ownerships', 'user_vehicles', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data')
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey')
op.drop_constraint(None, 'vehicle_events', schema='data', type_='foreignkey')
op.create_index('ix_data_vehicle_events_vehicle_id', 'vehicle_events', ['vehicle_id'], unique=False, schema='data')
op.drop_constraint(None, 'vehicle_assignments', schema='data', type_='foreignkey')
op.drop_index(op.f('ix_data_users_region_code'), table_name='users', schema='data')
op.create_index('idx_users_role', 'users', ['role'], unique=False, schema='data')
op.alter_column('users', 'role',
existing_type=sa.Enum('SUPERUSER', 'REGIONAL_ADMIN', 'MODERATOR', 'BUSINESS_PARTNER', 'USER', name='userrole'),
type_=postgresql.ENUM('SUPERUSER', 'REGIONAL_ADMIN', 'MODERATOR', 'BUSINESS_PARTNER', 'USER', name='user_role', schema='data'),
nullable=True,
existing_server_default=sa.text("'USER'::data.user_role"),
schema='data')
op.alter_column('user_stats', 'last_updated',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=True,
existing_server_default=sa.text('now()'),
schema='data')
op.alter_column('user_stats', 'current_level',
existing_type=sa.INTEGER(),
nullable=True,
existing_server_default=sa.text('1'),
schema='data')
op.alter_column('user_stats', 'total_points',
existing_type=sa.INTEGER(),
nullable=True,
existing_server_default=sa.text('0'),
schema='data')
op.create_unique_constraint('user_badges_user_id_badge_id_key', 'user_badges', ['user_id', 'badge_id'], schema='data')
op.alter_column('user_badges', 'earned_at',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=True,
existing_server_default=sa.text('now()'),
schema='data')
op.alter_column('user_badges', 'badge_id',
existing_type=sa.INTEGER(),
nullable=True,
schema='data')
op.alter_column('user_badges', 'user_id',
existing_type=sa.INTEGER(),
nullable=True,
schema='data')
op.drop_constraint('uq_translation_key_lang', 'translations', schema='data', type_='unique')
op.drop_index(op.f('ix_data_translations_lang_code'), table_name='translations', schema='data')
op.drop_index(op.f('ix_data_translations_key'), table_name='translations', schema='data')
op.drop_index(op.f('ix_data_translations_id'), table_name='translations', schema='data')
op.create_unique_constraint('translations_key_lang_code_key', 'translations', ['key', 'lang_code'], schema='data')
op.drop_column('translations', 'is_published', schema='data')
op.drop_index(op.f('ix_data_points_ledger_user_id'), table_name='points_ledger', schema='data')
op.drop_index(op.f('ix_data_points_ledger_id'), table_name='points_ledger', schema='data')
op.alter_column('points_ledger', 'timestamp',
existing_type=postgresql.TIMESTAMP(timezone=True),
nullable=True,
existing_server_default=sa.text('now()'),
schema='data')
op.alter_column('points_ledger', 'user_id',
existing_type=sa.INTEGER(),
nullable=True,
schema='data')
op.add_column('badges', sa.Column('criteria_json', postgresql.JSONB(astext_type=sa.Text()), autoincrement=False, nullable=True), schema='data')
op.add_column('badges', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True), schema='data')
op.drop_constraint(None, 'badges', schema='data', type_='unique')
op.drop_index(op.f('ix_data_badges_id'), table_name='badges', schema='data')
op.alter_column('badges', 'icon_url',
existing_type=sa.String(length=500),
type_=sa.VARCHAR(length=255),
existing_nullable=True,
schema='data')
op.alter_column('badges', 'description',
existing_type=sa.String(length=255),
type_=sa.TEXT(),
nullable=True,
schema='data')
op.create_table('vehicle_history',
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('data.vehicle_history_id_seq'::regclass)"), autoincrement=True, nullable=False),
sa.Column('vehicle_id', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('role', sa.VARCHAR(length=20), autoincrement=False, nullable=False),
sa.Column('start_date', sa.DATE(), autoincrement=False, nullable=False),
sa.Column('end_date', sa.DATE(), autoincrement=False, nullable=True),
sa.Column('start_mileage', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('end_mileage', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('is_active', sa.BOOLEAN(), sa.Computed('(end_date IS NULL)', persisted=True), autoincrement=False, nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], name='vehicle_history_user_id_fkey'),
sa.PrimaryKeyConstraint('id', name='vehicle_history_pkey'),
schema='data'
)
op.create_table('level_configs',
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('data.level_configs_id_seq'::regclass)"), autoincrement=True, nullable=False),
sa.Column('level_number', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('min_points', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('name_translation_key', sa.VARCHAR(length=100), autoincrement=False, nullable=True),
sa.Column('region_code', sa.VARCHAR(length=5), server_default=sa.text("'GLOBAL'::character varying"), autoincrement=False, nullable=True),
sa.PrimaryKeyConstraint('id', name='level_configs_pkey'),
sa.UniqueConstraint('level_number', name='level_configs_level_number_key'),
schema='data'
)
op.create_table('regional_settings',
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('data.regional_settings_id_seq'::regclass)"), autoincrement=True, nullable=False),
sa.Column('region_code', sa.VARCHAR(length=5), autoincrement=False, nullable=False),
sa.Column('setting_key', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
sa.Column('value', postgresql.JSONB(astext_type=sa.Text()), autoincrement=False, nullable=False),
sa.Column('start_date', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
sa.Column('end_date', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
sa.PrimaryKeyConstraint('id', name='regional_settings_pkey'),
schema='data'
)
op.create_table('point_rules',
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('data.point_rules_id_seq'::regclass)"), autoincrement=True, nullable=False),
sa.Column('rule_key', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
sa.Column('points', sa.INTEGER(), autoincrement=False, nullable=False),
sa.Column('start_date', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
sa.Column('end_date', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
sa.Column('region_code', sa.VARCHAR(length=5), server_default=sa.text("'GLOBAL'::character varying"), autoincrement=False, nullable=True),
sa.Column('is_active', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=True),
sa.PrimaryKeyConstraint('id', name='point_rules_pkey'),
schema='data'
)
op.create_table('alembic_version',
sa.Column('version_num', sa.VARCHAR(length=32), autoincrement=False, nullable=False),
sa.PrimaryKeyConstraint('version_num', name='alembic_version_pkc')
)
op.create_table('costs',
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('data.costs_id_seq'::regclass)"), autoincrement=True, nullable=False),
sa.Column('vehicle_id', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('cost_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
sa.Column('amount', sa.NUMERIC(precision=10, scale=2), autoincrement=False, nullable=False),
sa.Column('date', sa.DATE(), autoincrement=False, nullable=False),
sa.Column('mileage_at_cost', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
sa.Column('document_url', sa.VARCHAR(length=255), autoincrement=False, nullable=True),
sa.Column('created_at', postgresql.TIMESTAMP(), server_default=sa.text('now()'), autoincrement=False, nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], name='costs_user_id_fkey'),
sa.PrimaryKeyConstraint('id', name='costs_pkey'),
schema='data'
)
op.drop_index(op.f('ix_data_system_settings_key'), table_name='system_settings', schema='data')
op.drop_table('system_settings', schema='data')
# ### end Alembic commands ###