From 3f57296c3b0bd0f6ca6b50601070d8563fa6078e Mon Sep 17 00:00:00 2001 From: Ethan-clay03 <ethanclay2017@gmail.com> Date: Wed, 19 Feb 2025 12:32:01 +0000 Subject: [PATCH] Remove legacy migrations as switched to inital creation, use migration for future builds, update index.html --- README | 6 +- app/models/listing_images.py | 1 - app/static/listings.css | 19 +--- app/templates/index.html | 73 ++++++++------- .../22de5b143d05_create_user_roles.py | 34 ------- ...2e785_create_listing_availibility_table.py | 30 ------- .../489bab9aaf4f_add_listing_images_table.py | 32 ------- .../6791cbf31235_add_listing_table.py | 37 -------- ...89ef13132_add_main_listing_image_column.py | 23 ----- ...6c7070736062_add_role_id_to_users_table.py | 26 ------ migrations/versions/77815275598c_.py | 24 ----- ...5_add_fs_uniquifier_field_to_user_model.py | 89 ------------------- .../ac9d4555724d_add_api_token_and_expiry.py | 36 -------- ...hange_depart_time_and_destination_time_.py | 31 ------- .../e49c7ce461b6_create_bookings_table.py | 37 -------- 15 files changed, 44 insertions(+), 454 deletions(-) delete mode 100644 migrations/versions/22de5b143d05_create_user_roles.py delete mode 100644 migrations/versions/28932a02e785_create_listing_availibility_table.py delete mode 100644 migrations/versions/489bab9aaf4f_add_listing_images_table.py delete mode 100644 migrations/versions/6791cbf31235_add_listing_table.py delete mode 100644 migrations/versions/68d89ef13132_add_main_listing_image_column.py delete mode 100644 migrations/versions/6c7070736062_add_role_id_to_users_table.py delete mode 100644 migrations/versions/77815275598c_.py delete mode 100644 migrations/versions/9a8cc1906445_add_fs_uniquifier_field_to_user_model.py delete mode 100644 migrations/versions/ac9d4555724d_add_api_token_and_expiry.py delete mode 100644 migrations/versions/ce28a5ddecee_change_depart_time_and_destination_time_.py delete mode 100644 migrations/versions/e49c7ce461b6_create_bookings_table.py diff --git a/README b/README index b2227e8..ccb8bfe 100644 --- a/README +++ b/README @@ -83,12 +83,12 @@ to be fully setup. # Then run the following, if you are not on port 5000 you will need to force it with the '--port 5000' arg flask run (Will run on 127.0.0.1:5000) -# To apply database changes/run migrations -flask db upgrade - # Creating new migration file (for development) flask db migrate -m "Add age column to User model" +# To apply database changes/run migrations +flask db upgrade + ########################################## # Database Commands # ########################################## diff --git a/app/models/listing_images.py b/app/models/listing_images.py index d6b43d2..c7e9f56 100644 --- a/app/models/listing_images.py +++ b/app/models/listing_images.py @@ -11,7 +11,6 @@ class ListingImages(db.Model): id = db.Column(db.Integer(), nullable=False, primary_key=True) image_location = db.Column(db.String(255), nullable=False) - image_description = db.Column(db.String(255), nullable=True) main_image = db.Column(db.SmallInteger(), nullable=False) listing_id = db.Column(Integer, ForeignKey('listings.id'), nullable=False) listing = relationship("Listings", back_populates="listing_images") diff --git a/app/static/listings.css b/app/static/listings.css index 4fc4a6a..82d15d1 100644 --- a/app/static/listings.css +++ b/app/static/listings.css @@ -7,21 +7,4 @@ font-family: "Work Sans", sans-serif; padding: 20px 20px; } - -.deals_underline { -position: relative; -white-space: nowrap; -&:after { - --deco-height: 0.3125em; - content: ""; - position: absolute; - left: 0; - right: 0; - bottom: calc(var(--deco-height) * -0.625); - height: var(--deco-height); - background-image: url("data:image/svg+xml,%3Csvg width='100' height='64' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23a)'%3E%3Cpath d='M-17 30.5C-1 22 72-4 54 13 37.9 28.2-2.5 57.5 16 55.5s72-29 104-40' stroke='%2300FDCF' stroke-width='10'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath fill='%23fff' d='M0 0h100v64H0z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A"); - background-size: auto 100%; - background-repeat: round; - background-position: 0em; -} -} + diff --git a/app/templates/index.html b/app/templates/index.html index 6990c26..1ec15c6 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -7,12 +7,25 @@ <script src="https://cdn.jsdelivr.net/npm/swiffy-slider@1.6.0/dist/js/swiffy-slider.min.js" crossorigin="anonymous" defer></script> <style> .slider-wrapper { - transform: scale(0.8); width: 100%; + margin-bottom: 30px; + } + .deals_text { + text-align: center; + font-size: 1.5rem; + font-weight: bold; + margin-bottom: 20px; + } + .slider-nav { + opacity: 0.7; + } + .slider-nav:hover { + opacity: 1; } </style> </head> <div class="container mt-4"> + <h2 class="text-center mb-4">Book Your Trip</h2> <form id="travelForm" class="row g-3" action="{{ url_for('bookings.listings') }}" method="GET"> <div class="col-md-6"> <label for="departLocation" class="form-label">Departure Location:</label> @@ -53,37 +66,36 @@ </div> </form> </div> -<div> - <div class="deals_text"><span class="deals_underline">Currently Hot Locations</span></div> - <div class="slider-wrapper"> - <div class="swiffy-slider slider-item-show2 slider-item-reveal slider-nav-outside slider-nav-round slider-nav-visible slider-nav-loop slider-indicators-outside slider-indicators-round slider-indicators-dark slider-nav-animation slider-nav-animation-fadein slider-item-first-visible"> - <ul class="slider-container py-4"> - {% for listing in top_listings %} - <li class="slide-visible"> - <div class="card shadow h-100"> - <div class="ratio ratio-16x9"> - <th>{{top_listing_images[listing.id]}}</th> - <img src="{{ url_for('main.upload_file', filename=top_listing_images[listing.id]) }}" class="card-img-top" loading="lazy" alt="Main Image"> - </div> - <div class="card-body p-3 p-xl-4"> - <h3 class="card-title h5">{{listing.destination_location}}</h3> - <p class="card-text">Add Location description here once implemented</p> - <div><a href="#" class="btn btn-primary">Book now</a> +<div class="container mt-5"> + <div class="deals_text"><span style="font-size: 35px;">Currently Hot Deals</span></div> + <div class="slider-wrapper"> + <div class="swiffy-slider slider-item-show3 slider-item-reveal slider-nav-outside slider-nav-round slider-nav-visible slider-nav-loop slider-indicators-outside slider-indicators-round slider-indicators-dark slider-nav-animation slider-nav-animation-slide"> + <ul class="slider-container py-4"> + {% for listing in top_listings %} + <li class="slide-visible"> + <div class="card shadow h-100"> + <div class="ratio ratio-16x9"> + <img src="{{ url_for('main.upload_file', filename=top_listing_images[listing.id]) }}" class="card-img-top" loading="lazy" alt="Main Image"> + </div> + <div class="card-body p-3 p-xl-4"> + <h3 class="card-title h5">{{listing.destination_location}}</h3> + <p class="card-text">Add Location description here once implemented</p> + <div><a href="#" class="btn btn-primary">Book now</a> + </div> </div> </div> - </div> - </li> - {% endfor %} - </ul> + </li> + {% endfor %} + </ul> - <button type="button" class="slider-nav slider-nav-prev" aria-label="Go left"></button> - <button type="button" class="slider-nav slider-nav-next" aria-label="Go right"></button> + <button type="button" class="slider-nav slider-nav-prev" aria-label="Go left"></button> + <button type="button" class="slider-nav slider-nav-next" aria-label="Go right"></button> - <div class="slider-indicators"> - <button class="active" aria-label="Go to slide"></button> - <button aria-label="Go to slide"></button> - <button aria-label="Go to slide"></button> - <button aria-label="Go to slide"></button> + <div class="slider-indicators"> + <button class="active" aria-label="Go to slide"></button> + <button aria-label="Go to slide"></button> + <button aria-label="Go to slide"></button> + </div> </div> </div> </div> @@ -103,25 +115,20 @@ }); const departDateInput = document.getElementById('departDate'); - const resetDateButton = document.getElementById('resetDate'); - // Open date picker when the date field is clicked departDateInput.addEventListener('focus', (event) => { event.preventDefault(); departDateInput.showPicker(); }); - // Prevent any dates being changed by the user manually typing departDateInput.addEventListener('keydown', (event) => { event.preventDefault(); }); - // Set default date to today and prevent selecting past dates const today = new Date().toISOString().split('T')[0]; departDateInput.value = today; departDateInput.setAttribute('min', today); - // Set max date to 90 days from today let maxDate = new Date(); maxDate.setDate(maxDate.getDate() + 90); departDateInput.setAttribute('max', maxDate.toISOString().split('T')[0]); diff --git a/migrations/versions/22de5b143d05_create_user_roles.py b/migrations/versions/22de5b143d05_create_user_roles.py deleted file mode 100644 index 5e6a586..0000000 --- a/migrations/versions/22de5b143d05_create_user_roles.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Create user roles - -Revision ID: 22de5b143d05 -Revises: 9a8cc1906445 -Create Date: 2025-01-06 13:40:11.307880 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.sql import table, column - -# revision identifiers, used by Alembic. -revision = '22de5b143d05' -down_revision = '9a8cc1906445' -branch_labels = None -depends_on = None - -roles_table = table('roles', - column('id', sa.Integer), - column('name', sa.String), - column('description', sa.String) -) - -def upgrade(): - roles = [ - {'name': 'super-admin', 'description': 'Super Admin, all admin perms and can create new admins'}, - {'name': 'admin', 'description': 'Can create/delete and modify bookings'}, - {'name': 'user', 'description': 'Standard user'} - ] - - op.bulk_insert(roles_table, roles) - -def downgrade(): - op.execute('DELETE FROM roles WHERE name IN ("super-admin", "admin", "user")') diff --git a/migrations/versions/28932a02e785_create_listing_availibility_table.py b/migrations/versions/28932a02e785_create_listing_availibility_table.py deleted file mode 100644 index 9c9e498..0000000 --- a/migrations/versions/28932a02e785_create_listing_availibility_table.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Create listing availibility table - -Revision ID: 28932a02e785 -Revises: e49c7ce461b6 -Create Date: 2025-01-08 18:41:40.962877 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql -from sqlalchemy.engine.reflection import Inspector - -# revision identifiers, used by Alembic. -revision = '28932a02e785' -down_revision = 'e49c7ce461b6' -branch_labels = None -depends_on = None - -def upgrade(): - bind = op.get_bind() - inspector = Inspector.from_engine(bind) - if 'listing_availability' not in inspector.get_table_names(): - op.create_table( - 'listing_availability', - sa.Column('id', sa.Integer(), nullable=False, autoincrement=True, primary_key=True), - sa.Column('listing_id', sa.Integer(), nullable=False), - sa.Column('business_tickets', sa.Integer(), nullable=False), - sa.Column('economy_tickets', sa.Integer(), nullable=False), - sa.ForeignKeyConstraint(['listing_id'], ['listings.id'], ondelete='CASCADE') - ) diff --git a/migrations/versions/489bab9aaf4f_add_listing_images_table.py b/migrations/versions/489bab9aaf4f_add_listing_images_table.py deleted file mode 100644 index 3a08224..0000000 --- a/migrations/versions/489bab9aaf4f_add_listing_images_table.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Add listing images table - -Revision ID: 489bab9aaf4f -Revises: 6791cbf31235 -Create Date: 2024-11-05 11:13:50.215159 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.engine.reflection import Inspector - - -# revision identifiers, used by Alembic. -revision = '489bab9aaf4f' -down_revision = '6791cbf31235' -branch_labels = None -depends_on = None - - -def upgrade(): - bind = op.get_bind() - inspector = Inspector.from_engine(bind) - - # Check if the 'users' table exists - if 'listing_images' not in inspector.get_table_names(): - op.create_table( - 'listing_images', - sa.Column('id', sa.Integer(), nullable=False, autoincrement=True, primary_key=True), - sa.Column('listing_id', sa.Integer(), nullable=False), - sa.Column('image_location', sa.String(255), nullable=False), - sa.Column('image_description', sa.String(255), nullable=True) - ) diff --git a/migrations/versions/6791cbf31235_add_listing_table.py b/migrations/versions/6791cbf31235_add_listing_table.py deleted file mode 100644 index a8202a8..0000000 --- a/migrations/versions/6791cbf31235_add_listing_table.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Add listing table - -Revision ID: 6791cbf31235 -Revises: ac9d4555724d -Create Date: 2024-11-05 10:36:32.872815 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.engine.reflection import Inspector - - -# revision identifiers, used by Alembic. -revision = '6791cbf31235' -down_revision = 'ac9d4555724d' -branch_labels = None -depends_on = None - - -def upgrade(): - bind = op.get_bind() - inspector = Inspector.from_engine(bind) - - # Check if the 'users' table exists - if 'listings' not in inspector.get_table_names(): - op.create_table( - 'listings', - sa.Column('id', sa.Integer(), nullable=False, autoincrement=True, primary_key=True), - sa.Column('depart_location', sa.String(255), nullable=False), - sa.Column('depart_time', sa.DateTime(), nullable=False), - sa.Column('destination_location', sa.String(255), nullable=False), - sa.Column('destination_time', sa.DateTime(), nullable=False), - sa.Column('fair_cost', sa.Float(2), nullable=False), - sa.Column('transport_type', sa.String(255), nullable=False), - sa.Column('business_tickets', sa.Integer(), nullable=False), - sa.Column('economy_tickets', sa.Integer(), nullable=False) - ) \ No newline at end of file diff --git a/migrations/versions/68d89ef13132_add_main_listing_image_column.py b/migrations/versions/68d89ef13132_add_main_listing_image_column.py deleted file mode 100644 index 9ccafd8..0000000 --- a/migrations/versions/68d89ef13132_add_main_listing_image_column.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Add main Listing Image Column - -Revision ID: 68d89ef13132 -Revises: 489bab9aaf4f -Create Date: 2024-11-29 10:29:38.126811 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql - -# revision identifiers, used by Alembic. -revision = '68d89ef13132' -down_revision = '489bab9aaf4f' -branch_labels = None -depends_on = None - - -def upgrade(): - op.add_column( - 'listing_images', - sa.Column('main_image', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()) - ) \ No newline at end of file diff --git a/migrations/versions/6c7070736062_add_role_id_to_users_table.py b/migrations/versions/6c7070736062_add_role_id_to_users_table.py deleted file mode 100644 index b08cdd2..0000000 --- a/migrations/versions/6c7070736062_add_role_id_to_users_table.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Add role_id to users table - -Revision ID: 6c7070736062 -Revises: 22de5b143d05 -Create Date: 2025-01-06 20:16:19.191868 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql - -# revision identifiers, used by Alembic. -revision = '6c7070736062' -down_revision = '22de5b143d05' -branch_labels = None -depends_on = None - -def upgrade(): - # Add column role_id to users table - op.add_column('users', sa.Column('role_id', sa.Integer(), nullable=True)) - op.create_foreign_key(None, 'users', 'roles', ['role_id'], ['id']) - -def downgrade(): - # Remove column role_id from users table - op.drop_constraint(None, 'users', type_='foreignkey') - op.drop_column('users', 'role_id') diff --git a/migrations/versions/77815275598c_.py b/migrations/versions/77815275598c_.py deleted file mode 100644 index 6c4f331..0000000 --- a/migrations/versions/77815275598c_.py +++ /dev/null @@ -1,24 +0,0 @@ -"""empty message - -Revision ID: 77815275598c -Revises: 6c7070736062 -Create Date: 2025-01-08 16:57:53.560001 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '77815275598c' -down_revision = '6c7070736062' -branch_labels = None -depends_on = None - - -def upgrade(): - pass - - -def downgrade(): - pass diff --git a/migrations/versions/9a8cc1906445_add_fs_uniquifier_field_to_user_model.py b/migrations/versions/9a8cc1906445_add_fs_uniquifier_field_to_user_model.py deleted file mode 100644 index 7bacfee..0000000 --- a/migrations/versions/9a8cc1906445_add_fs_uniquifier_field_to_user_model.py +++ /dev/null @@ -1,89 +0,0 @@ -"""Add fs_uniquifier field to User model - -Revision ID: 9a8cc1906445 -Revises: 68d89ef13132 -Create Date: 2025-01-06 12:52:57.272220 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql -import os - -# revision identifiers, used by Alembic. -revision = '9a8cc1906445' -down_revision = '68d89ef13132' -branch_labels = None -depends_on = None - -def column_exists(table_name, column_name): - inspector = sa.inspect(op.get_bind()) - return column_name in [col['name'] for col in inspector.get_columns(table_name)] - -def index_exists(table_name, index_name): - inspector = sa.inspect(op.get_bind()) - indexes = inspector.get_indexes(table_name) - return any(index['name'] == index_name for index in indexes) - -def upgrade(): - # Conditionally create roles table - if not op.get_bind().dialect.has_table(op.get_bind(), "roles"): - op.create_table('roles', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(length=80), nullable=True), - sa.Column('description', sa.String(length=255), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('name') - ) - - # Conditionally create roles_users table - if not op.get_bind().dialect.has_table(op.get_bind(), "roles_users"): - op.create_table('roles_users', - sa.Column('user_id', sa.Integer(), nullable=True), - sa.Column('role_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['role_id'], ['roles.id']), - sa.ForeignKeyConstraint(['user_id'], ['users.id']) - ) - - with op.batch_alter_table('listing_images', schema=None) as batch_op: - batch_op.alter_column('main_image', - existing_type=mysql.TINYINT(display_width=1), - type_=sa.SmallInteger(), - existing_nullable=False, - existing_server_default=sa.text("'0'")) - - # Assign unique values to fs_uniquifier for existing users before adding the unique constraint - conn = op.get_bind() - users = conn.execute(sa.text("SELECT id FROM users WHERE fs_uniquifier IS NULL OR fs_uniquifier = ''")).fetchall() - for user in users: - conn.execute(sa.text("UPDATE users SET fs_uniquifier = :fs_uniquifier WHERE id = :id"), {'fs_uniquifier': os.urandom(32).hex(), 'id': user.id}) - - with op.batch_alter_table('users', schema=None) as batch_op: - if index_exists('users', 'api_token'): - batch_op.drop_index('api_token') - batch_op.create_unique_constraint(None, ['fs_uniquifier']) - if column_exists('users', 'token_expiry'): - batch_op.drop_column('token_expiry') - if column_exists('users', 'api_token'): - batch_op.drop_column('api_token') - if column_exists('users', 'role_id'): - batch_op.drop_column('role_id') - -def downgrade(): - with op.batch_alter_table('users', schema=None) as batch_op: - batch_op.add_column(sa.Column('role_id', mysql.SMALLINT(), server_default=sa.text("'1'"), autoincrement=False, nullable=False)) - batch_op.add_column(sa.Column('api_token', mysql.VARCHAR(length=255), nullable=True)) - batch_op.add_column(sa.Column('token_expiry', mysql.DATETIME(), nullable=True)) - batch_op.drop_constraint(None, type_='unique') - batch_op.create_index('api_token', ['api_token'], unique=True) - batch_op.drop_column('fs_uniquifier') - - with op.batch_alter_table('listing_images', schema=None) as batch_op: - batch_op.alter_column('main_image', - existing_type=sa.SmallInteger(), - type_=mysql.TINYINT(display_width=1), - existing_nullable=False, - existing_server_default=sa.text("'0'")) - - op.drop_table('roles_users') - op.drop_table('roles') diff --git a/migrations/versions/ac9d4555724d_add_api_token_and_expiry.py b/migrations/versions/ac9d4555724d_add_api_token_and_expiry.py deleted file mode 100644 index 26f22ae..0000000 --- a/migrations/versions/ac9d4555724d_add_api_token_and_expiry.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Add api token and expiry - -Revision ID: ac9d4555724d -Revises: -Create Date: 2024-11-01 10:56:05.827705 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql -from sqlalchemy.engine.reflection import Inspector - -# revision identifiers, used by Alembic. -revision = 'ac9d4555724d' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade(): - bind = op.get_bind() - inspector = Inspector.from_engine(bind) - - # Check if the 'users' table exists - if 'users' not in inspector.get_table_names(): - op.create_table( - 'users', - sa.Column('id', sa.Integer(), nullable=False, autoincrement=True, primary_key=True), - sa.Column('username', sa.String(255), nullable=False, unique=True), - sa.Column('email', sa.String(255), nullable=False, unique=True), - sa.Column('password', sa.String(255), nullable=False), - sa.Column('role_id', sa.SmallInteger(), nullable=False, server_default='3') - ) - -def downgrade(): - op.drop_table('users') diff --git a/migrations/versions/ce28a5ddecee_change_depart_time_and_destination_time_.py b/migrations/versions/ce28a5ddecee_change_depart_time_and_destination_time_.py deleted file mode 100644 index d8cb781..0000000 --- a/migrations/versions/ce28a5ddecee_change_depart_time_and_destination_time_.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Change depart_time and destination_time from DateTime to Time - -Revision ID: ce28a5ddecee -Revises: 28932a02e785 -Create Date: 2025-01-17 14:36:45.488306 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql - -# revision identifiers, used by Alembic. -revision = 'ce28a5ddecee' -down_revision = '28932a02e785' -branch_labels = None -depends_on = None - - -def upgrade(): - with op.batch_alter_table('listing_images', schema=None) as batch_op: - batch_op.create_foreign_key(None, 'listings', ['listing_id'], ['id']) - - with op.batch_alter_table('listings', schema=None) as batch_op: - batch_op.alter_column('depart_time', - existing_type=mysql.DATETIME(), - type_=sa.Time(), - existing_nullable=False) - batch_op.alter_column('destination_time', - existing_type=mysql.DATETIME(), - type_=sa.Time(), - existing_nullable=False) diff --git a/migrations/versions/e49c7ce461b6_create_bookings_table.py b/migrations/versions/e49c7ce461b6_create_bookings_table.py deleted file mode 100644 index 142d587..0000000 --- a/migrations/versions/e49c7ce461b6_create_bookings_table.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Create bookings table - -Revision ID: e49c7ce461b6 -Revises: 77815275598c -Create Date: 2025-01-08 17:08:51.080297 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql -from sqlalchemy.engine.reflection import Inspector - -# revision identifiers, used by Alembic. -revision = 'e49c7ce461b6' -down_revision = '77815275598c' -branch_labels = None -depends_on = None - -def upgrade(): - bind = op.get_bind() - inspector = Inspector.from_engine(bind) - if 'bookings' not in inspector.get_table_names(): - op.create_table( - 'bookings', - sa.Column('id', sa.Integer(), nullable=False, autoincrement=True, primary_key=True), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('listing_id', sa.Integer(), nullable=False), - sa.Column('amount_paid', sa.Integer(), nullable=False), - sa.Column('cancelled', sa.Boolean(), nullable=False), - sa.ForeignKeyConstraint(['listing_id'], ['listings.id'], ondelete='CASCADE'), - sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE') - ) - - #Remove columns from listing as moved to new table - op.drop_column('listings', 'economy_tickets') - op.drop_column('listings', 'business_tickets') - -- GitLab