This commit is contained in:
Iliyan Angelov
2025-11-20 21:06:30 +02:00
parent 44e11520c5
commit a38ab4fa82
77 changed files with 7169 additions and 360 deletions

View File

@@ -0,0 +1,246 @@
"""add_section_title_fields_to_page_content
Revision ID: 1444eb61188e
Revises: ff515d77abbe
Create Date: 2025-11-20 15:51:29.671843
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
# revision identifiers, used by Alembic.
revision = '1444eb61188e'
down_revision = 'ff515d77abbe'
branch_labels = None
depends_on = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('bookings_room_id', table_name='bookings')
op.drop_index('bookings_status', table_name='bookings')
op.drop_index('bookings_user_id', table_name='bookings')
op.drop_index('ix_bookings_promotion_code', table_name='bookings')
op.create_index(op.f('ix_bookings_booking_number'), 'bookings', ['booking_number'], unique=True)
op.create_index(op.f('ix_bookings_id'), 'bookings', ['id'], unique=False)
op.drop_constraint('bookings_ibfk_1', 'bookings', type_='foreignkey')
op.drop_constraint('bookings_ibfk_2', 'bookings', type_='foreignkey')
op.create_foreign_key(None, 'bookings', 'rooms', ['room_id'], ['id'])
op.create_foreign_key(None, 'bookings', 'users', ['user_id'], ['id'])
op.drop_index('checkin_checkout_booking_id', table_name='checkin_checkout')
op.create_index(op.f('ix_checkin_checkout_id'), 'checkin_checkout', ['id'], unique=False)
op.create_unique_constraint(None, 'checkin_checkout', ['booking_id'])
op.drop_constraint('checkin_checkout_ibfk_1', 'checkin_checkout', type_='foreignkey')
op.drop_constraint('checkin_checkout_ibfk_2', 'checkin_checkout', type_='foreignkey')
op.drop_constraint('checkin_checkout_ibfk_3', 'checkin_checkout', type_='foreignkey')
op.create_foreign_key(None, 'checkin_checkout', 'users', ['checkin_by'], ['id'])
op.create_foreign_key(None, 'checkin_checkout', 'bookings', ['booking_id'], ['id'])
op.create_foreign_key(None, 'checkin_checkout', 'users', ['checkout_by'], ['id'])
op.drop_index('favorites_room_id', table_name='favorites')
op.drop_index('favorites_user_id', table_name='favorites')
op.drop_index('unique_user_room_favorite', table_name='favorites')
op.create_index(op.f('ix_favorites_id'), 'favorites', ['id'], unique=False)
op.drop_constraint('favorites_ibfk_1', 'favorites', type_='foreignkey')
op.drop_constraint('favorites_ibfk_2', 'favorites', type_='foreignkey')
op.create_foreign_key(None, 'favorites', 'rooms', ['room_id'], ['id'])
op.create_foreign_key(None, 'favorites', 'users', ['user_id'], ['id'])
op.add_column('page_contents', sa.Column('luxury_gallery_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_gallery_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_testimonials_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_testimonials_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_services_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_services_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_experiences_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_experiences_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('awards_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('awards_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('partners_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('partners_section_subtitle', sa.Text(), nullable=True))
op.alter_column('password_reset_tokens', 'used',
existing_type=mysql.TINYINT(display_width=1),
nullable=False,
existing_server_default=sa.text("'0'"))
op.drop_index('password_reset_tokens_token', table_name='password_reset_tokens')
op.drop_index('password_reset_tokens_user_id', table_name='password_reset_tokens')
op.drop_index('token', table_name='password_reset_tokens')
op.create_index(op.f('ix_password_reset_tokens_id'), 'password_reset_tokens', ['id'], unique=False)
op.create_index(op.f('ix_password_reset_tokens_token'), 'password_reset_tokens', ['token'], unique=True)
op.drop_constraint('password_reset_tokens_ibfk_1', 'password_reset_tokens', type_='foreignkey')
op.create_foreign_key(None, 'password_reset_tokens', 'users', ['user_id'], ['id'])
op.alter_column('payments', 'deposit_percentage',
existing_type=mysql.INTEGER(),
comment=None,
existing_comment='Percentage of deposit (e.g., 20, 30, 50)',
existing_nullable=True)
op.drop_index('payments_booking_id', table_name='payments')
op.drop_index('payments_payment_status', table_name='payments')
op.create_index(op.f('ix_payments_id'), 'payments', ['id'], unique=False)
op.drop_constraint('payments_ibfk_1', 'payments', type_='foreignkey')
op.drop_constraint('payments_related_payment_id_foreign_idx', 'payments', type_='foreignkey')
op.create_foreign_key(None, 'payments', 'payments', ['related_payment_id'], ['id'])
op.create_foreign_key(None, 'payments', 'bookings', ['booking_id'], ['id'])
op.drop_index('code', table_name='promotions')
op.drop_index('promotions_code', table_name='promotions')
op.drop_index('promotions_is_active', table_name='promotions')
op.create_index(op.f('ix_promotions_code'), 'promotions', ['code'], unique=True)
op.create_index(op.f('ix_promotions_id'), 'promotions', ['id'], unique=False)
op.drop_index('refresh_tokens_token', table_name='refresh_tokens')
op.drop_index('refresh_tokens_user_id', table_name='refresh_tokens')
op.drop_index('token', table_name='refresh_tokens')
op.create_index(op.f('ix_refresh_tokens_id'), 'refresh_tokens', ['id'], unique=False)
op.create_index(op.f('ix_refresh_tokens_token'), 'refresh_tokens', ['token'], unique=True)
op.drop_constraint('refresh_tokens_ibfk_1', 'refresh_tokens', type_='foreignkey')
op.create_foreign_key(None, 'refresh_tokens', 'users', ['user_id'], ['id'])
op.drop_index('reviews_room_id', table_name='reviews')
op.drop_index('reviews_status', table_name='reviews')
op.drop_index('reviews_user_id', table_name='reviews')
op.create_index(op.f('ix_reviews_id'), 'reviews', ['id'], unique=False)
op.drop_constraint('reviews_ibfk_2', 'reviews', type_='foreignkey')
op.drop_constraint('reviews_ibfk_1', 'reviews', type_='foreignkey')
op.create_foreign_key(None, 'reviews', 'users', ['user_id'], ['id'])
op.create_foreign_key(None, 'reviews', 'rooms', ['room_id'], ['id'])
op.drop_index('name', table_name='roles')
op.create_index(op.f('ix_roles_id'), 'roles', ['id'], unique=False)
op.create_index(op.f('ix_roles_name'), 'roles', ['name'], unique=True)
op.create_index(op.f('ix_room_types_id'), 'room_types', ['id'], unique=False)
op.drop_index('room_number', table_name='rooms')
op.drop_index('rooms_featured', table_name='rooms')
op.drop_index('rooms_room_type_id', table_name='rooms')
op.drop_index('rooms_status', table_name='rooms')
op.create_index(op.f('ix_rooms_id'), 'rooms', ['id'], unique=False)
op.create_index(op.f('ix_rooms_room_number'), 'rooms', ['room_number'], unique=True)
op.drop_constraint('rooms_ibfk_1', 'rooms', type_='foreignkey')
op.create_foreign_key(None, 'rooms', 'room_types', ['room_type_id'], ['id'])
op.drop_index('service_usages_booking_id', table_name='service_usages')
op.drop_index('service_usages_service_id', table_name='service_usages')
op.create_index(op.f('ix_service_usages_id'), 'service_usages', ['id'], unique=False)
op.drop_constraint('service_usages_ibfk_2', 'service_usages', type_='foreignkey')
op.drop_constraint('service_usages_ibfk_1', 'service_usages', type_='foreignkey')
op.create_foreign_key(None, 'service_usages', 'bookings', ['booking_id'], ['id'])
op.create_foreign_key(None, 'service_usages', 'services', ['service_id'], ['id'])
op.drop_index('services_category', table_name='services')
op.create_index(op.f('ix_services_id'), 'services', ['id'], unique=False)
op.drop_index('email', table_name='users')
op.drop_index('users_email', table_name='users')
op.drop_index('users_role_id', table_name='users')
op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)
op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False)
op.drop_constraint('users_ibfk_1', 'users', type_='foreignkey')
op.create_foreign_key(None, 'users', 'roles', ['role_id'], ['id'])
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'users', type_='foreignkey')
op.create_foreign_key('users_ibfk_1', 'users', 'roles', ['role_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_index(op.f('ix_users_id'), table_name='users')
op.drop_index(op.f('ix_users_email'), table_name='users')
op.create_index('users_role_id', 'users', ['role_id'], unique=False)
op.create_index('users_email', 'users', ['email'], unique=False)
op.create_index('email', 'users', ['email'], unique=False)
op.drop_index(op.f('ix_services_id'), table_name='services')
op.create_index('services_category', 'services', ['category'], unique=False)
op.drop_constraint(None, 'service_usages', type_='foreignkey')
op.drop_constraint(None, 'service_usages', type_='foreignkey')
op.create_foreign_key('service_usages_ibfk_1', 'service_usages', 'bookings', ['booking_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.create_foreign_key('service_usages_ibfk_2', 'service_usages', 'services', ['service_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_index(op.f('ix_service_usages_id'), table_name='service_usages')
op.create_index('service_usages_service_id', 'service_usages', ['service_id'], unique=False)
op.create_index('service_usages_booking_id', 'service_usages', ['booking_id'], unique=False)
op.drop_constraint(None, 'rooms', type_='foreignkey')
op.create_foreign_key('rooms_ibfk_1', 'rooms', 'room_types', ['room_type_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_index(op.f('ix_rooms_room_number'), table_name='rooms')
op.drop_index(op.f('ix_rooms_id'), table_name='rooms')
op.create_index('rooms_status', 'rooms', ['status'], unique=False)
op.create_index('rooms_room_type_id', 'rooms', ['room_type_id'], unique=False)
op.create_index('rooms_featured', 'rooms', ['featured'], unique=False)
op.create_index('room_number', 'rooms', ['room_number'], unique=False)
op.drop_index(op.f('ix_room_types_id'), table_name='room_types')
op.drop_index(op.f('ix_roles_name'), table_name='roles')
op.drop_index(op.f('ix_roles_id'), table_name='roles')
op.create_index('name', 'roles', ['name'], unique=False)
op.drop_constraint(None, 'reviews', type_='foreignkey')
op.drop_constraint(None, 'reviews', type_='foreignkey')
op.create_foreign_key('reviews_ibfk_1', 'reviews', 'users', ['user_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.create_foreign_key('reviews_ibfk_2', 'reviews', 'rooms', ['room_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.drop_index(op.f('ix_reviews_id'), table_name='reviews')
op.create_index('reviews_user_id', 'reviews', ['user_id'], unique=False)
op.create_index('reviews_status', 'reviews', ['status'], unique=False)
op.create_index('reviews_room_id', 'reviews', ['room_id'], unique=False)
op.drop_constraint(None, 'refresh_tokens', type_='foreignkey')
op.create_foreign_key('refresh_tokens_ibfk_1', 'refresh_tokens', 'users', ['user_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.drop_index(op.f('ix_refresh_tokens_token'), table_name='refresh_tokens')
op.drop_index(op.f('ix_refresh_tokens_id'), table_name='refresh_tokens')
op.create_index('token', 'refresh_tokens', ['token'], unique=False)
op.create_index('refresh_tokens_user_id', 'refresh_tokens', ['user_id'], unique=False)
op.create_index('refresh_tokens_token', 'refresh_tokens', ['token'], unique=False)
op.drop_index(op.f('ix_promotions_id'), table_name='promotions')
op.drop_index(op.f('ix_promotions_code'), table_name='promotions')
op.create_index('promotions_is_active', 'promotions', ['is_active'], unique=False)
op.create_index('promotions_code', 'promotions', ['code'], unique=False)
op.create_index('code', 'promotions', ['code'], unique=False)
op.drop_constraint(None, 'payments', type_='foreignkey')
op.drop_constraint(None, 'payments', type_='foreignkey')
op.create_foreign_key('payments_related_payment_id_foreign_idx', 'payments', 'payments', ['related_payment_id'], ['id'], onupdate='CASCADE', ondelete='SET NULL')
op.create_foreign_key('payments_ibfk_1', 'payments', 'bookings', ['booking_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_index(op.f('ix_payments_id'), table_name='payments')
op.create_index('payments_payment_status', 'payments', ['payment_status'], unique=False)
op.create_index('payments_booking_id', 'payments', ['booking_id'], unique=False)
op.alter_column('payments', 'deposit_percentage',
existing_type=mysql.INTEGER(),
comment='Percentage of deposit (e.g., 20, 30, 50)',
existing_nullable=True)
op.drop_constraint(None, 'password_reset_tokens', type_='foreignkey')
op.create_foreign_key('password_reset_tokens_ibfk_1', 'password_reset_tokens', 'users', ['user_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.drop_index(op.f('ix_password_reset_tokens_token'), table_name='password_reset_tokens')
op.drop_index(op.f('ix_password_reset_tokens_id'), table_name='password_reset_tokens')
op.create_index('token', 'password_reset_tokens', ['token'], unique=False)
op.create_index('password_reset_tokens_user_id', 'password_reset_tokens', ['user_id'], unique=False)
op.create_index('password_reset_tokens_token', 'password_reset_tokens', ['token'], unique=False)
op.alter_column('password_reset_tokens', 'used',
existing_type=mysql.TINYINT(display_width=1),
nullable=True,
existing_server_default=sa.text("'0'"))
op.drop_column('page_contents', 'partners_section_subtitle')
op.drop_column('page_contents', 'partners_section_title')
op.drop_column('page_contents', 'awards_section_subtitle')
op.drop_column('page_contents', 'awards_section_title')
op.drop_column('page_contents', 'luxury_experiences_section_subtitle')
op.drop_column('page_contents', 'luxury_experiences_section_title')
op.drop_column('page_contents', 'luxury_services_section_subtitle')
op.drop_column('page_contents', 'luxury_services_section_title')
op.drop_column('page_contents', 'luxury_testimonials_section_subtitle')
op.drop_column('page_contents', 'luxury_testimonials_section_title')
op.drop_column('page_contents', 'luxury_gallery_section_subtitle')
op.drop_column('page_contents', 'luxury_gallery_section_title')
op.drop_constraint(None, 'favorites', type_='foreignkey')
op.drop_constraint(None, 'favorites', type_='foreignkey')
op.create_foreign_key('favorites_ibfk_2', 'favorites', 'rooms', ['room_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.create_foreign_key('favorites_ibfk_1', 'favorites', 'users', ['user_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')
op.drop_index(op.f('ix_favorites_id'), table_name='favorites')
op.create_index('unique_user_room_favorite', 'favorites', ['user_id', 'room_id'], unique=False)
op.create_index('favorites_user_id', 'favorites', ['user_id'], unique=False)
op.create_index('favorites_room_id', 'favorites', ['room_id'], unique=False)
op.drop_constraint(None, 'checkin_checkout', type_='foreignkey')
op.drop_constraint(None, 'checkin_checkout', type_='foreignkey')
op.drop_constraint(None, 'checkin_checkout', type_='foreignkey')
op.create_foreign_key('checkin_checkout_ibfk_3', 'checkin_checkout', 'users', ['checkout_by'], ['id'], onupdate='CASCADE', ondelete='SET NULL')
op.create_foreign_key('checkin_checkout_ibfk_2', 'checkin_checkout', 'users', ['checkin_by'], ['id'], onupdate='CASCADE', ondelete='SET NULL')
op.create_foreign_key('checkin_checkout_ibfk_1', 'checkin_checkout', 'bookings', ['booking_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_constraint(None, 'checkin_checkout', type_='unique')
op.drop_index(op.f('ix_checkin_checkout_id'), table_name='checkin_checkout')
op.create_index('checkin_checkout_booking_id', 'checkin_checkout', ['booking_id'], unique=False)
op.drop_constraint(None, 'bookings', type_='foreignkey')
op.drop_constraint(None, 'bookings', type_='foreignkey')
op.create_foreign_key('bookings_ibfk_2', 'bookings', 'rooms', ['room_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.create_foreign_key('bookings_ibfk_1', 'bookings', 'users', ['user_id'], ['id'], onupdate='CASCADE', ondelete='RESTRICT')
op.drop_index(op.f('ix_bookings_id'), table_name='bookings')
op.drop_index(op.f('ix_bookings_booking_number'), table_name='bookings')
op.create_index('ix_bookings_promotion_code', 'bookings', ['promotion_code'], unique=False)
op.create_index('bookings_user_id', 'bookings', ['user_id'], unique=False)
op.create_index('bookings_status', 'bookings', ['status'], unique=False)
op.create_index('bookings_room_id', 'bookings', ['room_id'], unique=False)
# ### end Alembic commands ###

View File

@@ -0,0 +1,38 @@
"""add_luxury_section_fields_to_page_content
Revision ID: 17efc6439cc3
Revises: bfa74be4b256
Create Date: 2025-11-20 13:37:20.015422
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '17efc6439cc3'
down_revision = 'bfa74be4b256'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add luxury section fields to page_contents table
# Use TEXT instead of VARCHAR to avoid MySQL row size limits
op.add_column('page_contents', sa.Column('luxury_section_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_section_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_section_image', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('luxury_features', sa.Text(), nullable=True)) # JSON array
op.add_column('page_contents', sa.Column('luxury_gallery', sa.Text(), nullable=True)) # JSON array of image URLs
op.add_column('page_contents', sa.Column('luxury_testimonials', sa.Text(), nullable=True)) # JSON array of testimonials
def downgrade() -> None:
# Remove luxury section fields
op.drop_column('page_contents', 'luxury_testimonials')
op.drop_column('page_contents', 'luxury_gallery')
op.drop_column('page_contents', 'luxury_features')
op.drop_column('page_contents', 'luxury_section_image')
op.drop_column('page_contents', 'luxury_section_subtitle')
op.drop_column('page_contents', 'luxury_section_title')

View File

@@ -0,0 +1,36 @@
"""add_about_page_fields
Revision ID: f2a3b4c5d6e7
Revises: a1b2c3d4e5f6
Create Date: 2025-11-20 17:00:00.000000
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f2a3b4c5d6e7'
down_revision = 'a1b2c3d4e5f6'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add about page specific fields (all as TEXT to avoid row size issues)
op.add_column('page_contents', sa.Column('about_hero_image', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('mission', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('vision', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('team', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('timeline', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('achievements', sa.Text(), nullable=True))
def downgrade() -> None:
# Remove about page specific fields
op.drop_column('page_contents', 'achievements')
op.drop_column('page_contents', 'timeline')
op.drop_column('page_contents', 'team')
op.drop_column('page_contents', 'vision')
op.drop_column('page_contents', 'mission')
op.drop_column('page_contents', 'about_hero_image')

View File

@@ -0,0 +1,26 @@
"""add_copyright_text_to_page_content
Revision ID: a1b2c3d4e5f6
Revises: ff515d77abbe
Create Date: 2025-11-20 16:00:00.000000
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a1b2c3d4e5f6'
down_revision = '1444eb61188e'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add copyright_text column to page_contents table
op.add_column('page_contents', sa.Column('copyright_text', sa.Text(), nullable=True))
def downgrade() -> None:
# Remove copyright_text column from page_contents table
op.drop_column('page_contents', 'copyright_text')

View File

@@ -0,0 +1,53 @@
"""add_luxury_content_fields_to_page_content
Revision ID: bfa74be4b256
Revises: bd309b0742c1
Create Date: 2025-11-20 13:27:52.106013
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'bfa74be4b256'
down_revision = 'bd309b0742c1'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add luxury content fields to page_contents table
op.add_column('page_contents', sa.Column('amenities_section_title', sa.String(500), nullable=True))
op.add_column('page_contents', sa.Column('amenities_section_subtitle', sa.String(1000), nullable=True))
op.add_column('page_contents', sa.Column('amenities', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('testimonials_section_title', sa.String(500), nullable=True))
op.add_column('page_contents', sa.Column('testimonials_section_subtitle', sa.String(1000), nullable=True))
op.add_column('page_contents', sa.Column('testimonials', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('gallery_section_title', sa.String(500), nullable=True))
op.add_column('page_contents', sa.Column('gallery_section_subtitle', sa.String(1000), nullable=True))
op.add_column('page_contents', sa.Column('gallery_images', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('about_preview_title', sa.String(500), nullable=True))
op.add_column('page_contents', sa.Column('about_preview_subtitle', sa.String(1000), nullable=True))
op.add_column('page_contents', sa.Column('about_preview_content', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('about_preview_image', sa.String(1000), nullable=True))
op.add_column('page_contents', sa.Column('stats', sa.Text(), nullable=True))
def downgrade() -> None:
# Remove luxury content fields
op.drop_column('page_contents', 'stats')
op.drop_column('page_contents', 'about_preview_image')
op.drop_column('page_contents', 'about_preview_content')
op.drop_column('page_contents', 'about_preview_subtitle')
op.drop_column('page_contents', 'about_preview_title')
op.drop_column('page_contents', 'gallery_images')
op.drop_column('page_contents', 'gallery_section_subtitle')
op.drop_column('page_contents', 'gallery_section_title')
op.drop_column('page_contents', 'testimonials')
op.drop_column('page_contents', 'testimonials_section_subtitle')
op.drop_column('page_contents', 'testimonials_section_title')
op.drop_column('page_contents', 'amenities')
op.drop_column('page_contents', 'amenities_section_subtitle')
op.drop_column('page_contents', 'amenities_section_title')

View File

@@ -0,0 +1,43 @@
"""add_more_luxury_sections_to_page_content
Revision ID: ff515d77abbe
Revises: 17efc6439cc3
Create Date: 2025-11-20 15:17:50.977961
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'ff515d77abbe'
down_revision = '17efc6439cc3'
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add more luxury sections to page_contents table
op.add_column('page_contents', sa.Column('luxury_services', sa.Text(), nullable=True)) # JSON array of services
op.add_column('page_contents', sa.Column('luxury_experiences', sa.Text(), nullable=True)) # JSON array of experiences
op.add_column('page_contents', sa.Column('awards', sa.Text(), nullable=True)) # JSON array of awards
op.add_column('page_contents', sa.Column('cta_title', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('cta_subtitle', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('cta_button_text', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('cta_button_link', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('cta_image', sa.Text(), nullable=True))
op.add_column('page_contents', sa.Column('partners', sa.Text(), nullable=True)) # JSON array of partners
def downgrade() -> None:
# Remove luxury sections fields
op.drop_column('page_contents', 'partners')
op.drop_column('page_contents', 'cta_image')
op.drop_column('page_contents', 'cta_button_link')
op.drop_column('page_contents', 'cta_button_text')
op.drop_column('page_contents', 'cta_subtitle')
op.drop_column('page_contents', 'cta_title')
op.drop_column('page_contents', 'awards')
op.drop_column('page_contents', 'luxury_experiences')
op.drop_column('page_contents', 'luxury_services')