From 3c2e3033ed19b1d54b020338a8532a941239a83c Mon Sep 17 00:00:00 2001 From: Ethan-clay03 <ethanclay2017@gmail.com> Date: Mon, 17 Feb 2025 14:42:35 +0000 Subject: [PATCH] Update checkout page and begin to update receipt and boarding passes --- app/__init__.py | 22 +++++++----- app/bookings/routes.py | 2 -- app/main/utils.py | 38 +++++++++++++++++--- app/models/bookings.py | 2 ++ app/static/core/1.jpg | Bin 0 -> 15777 bytes app/templates/bookings/payment_success.html | 28 +++++++++------ barcode.png | Bin 0 -> 12058 bytes 7 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 app/static/core/1.jpg create mode 100644 barcode.png diff --git a/app/__init__.py b/app/__init__.py index 1cbd84a..02e52f4 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -6,7 +6,7 @@ from flask_login import LoginManager, current_user from flask_principal import Principal, Permission, RoleNeed, identity_loaded from flask_wtf.csrf import CSRFProtect from dotenv import load_dotenv -from app.logger import auth_logger +from app.logger import auth_logger, error_logger from functools import wraps import os import pymysql @@ -36,17 +36,23 @@ user_permission = Permission(RoleNeed('user')) def create_database_if_not_exists(db_host, db_user, db_password, db_name): - # Connect using Root to create schema if doesn't exist and then create user for that schema - connection = pymysql.connect( - host=db_host, - user='root', - password=db_password - ) + try: + connection = pymysql.connect( + host=db_host, + user='root', + password=db_password + ) + except: + error_message = 'Unable to connect to database as the root user, is the docker database running? If issue persists check README.md for help' + print(error_message) + error_logger.error(error_message) + exit() + try: with connection.cursor() as cursor: cursor.execute(f"CREATE DATABASE IF NOT EXISTS {db_name}") - # Create the user from .env details + # Create the user cursor.execute(f"CREATE USER IF NOT EXISTS '{db_user}'@'%' IDENTIFIED BY '{db_password}'") cursor.execute(f"GRANT ALL PRIVILEGES ON {db_name}.* TO '{db_user}'@'%'") cursor.execute(f"FLUSH PRIVILEGES") diff --git a/app/bookings/routes.py b/app/bookings/routes.py index ec50e6c..102b876 100644 --- a/app/bookings/routes.py +++ b/app/bookings/routes.py @@ -340,8 +340,6 @@ def filter_bookings(): results_html = render_template('_results.html', items=paginated_items, page=page, total_pages=total_pages, discount=discount, days_away=days_away, seat_type=seat_type) return jsonify({'html': results_html}) - - def process_images(listings): for item in listings: main_image = next((img for img in item.listing_images if img.main_image), None) diff --git a/app/main/utils.py b/app/main/utils.py index e362fda..949e0da 100644 --- a/app/main/utils.py +++ b/app/main/utils.py @@ -8,6 +8,7 @@ import qrcode import barcode from barcode.writer import ImageWriter from io import BytesIO +import os from PIL import Image def allowed_image_files(filename): @@ -50,32 +51,61 @@ def pretty_time(unformatted_time, to_12_hour=True): return formatted_time + +def get_static_files(*path_parts): + return os.path.join(current_app.root_path, 'static', *path_parts) + def create_receipt(seat_num, seat_type, depart_date, listing): pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) + # Add company logo + company_logo_path = get_static_files('core', '1.jpg') + pdf.image(company_logo_path, x=10, y=8, w=33) + + # Adjust y position to avoid overlapping + pdf.set_xy(10, 45) pdf.cell(200, 10, txt="Receipt", ln=True, align='C') - + pdf.cell(200, 10, txt=f"Seat Number: {seat_num}", ln=True) pdf.cell(200, 10, txt=f"Seat Type: {seat_type}", ln=True) pdf.cell(200, 10, txt=f"Departure Date: {depart_date}", ln=True) pdf.cell(200, 10, txt=f"Departure Location: {listing.depart_location}", ln=True) pdf.cell(200, 10, txt=f"Destination Location: {listing.destination_location}", ln=True) - + if seat_type.lower() == 'economy': cost = listing.economy_fair_cost elif seat_type.lower() == 'business': cost = listing.business_fair_cost pdf.cell(200, 10, txt=f"Total Cost: {cost}", ln=True) - + + # Generate barcode + receipt_data = f"{seat_num},{seat_type},{depart_date},{listing.depart_location},{listing.destination_location},{cost}" + code128 = barcode.get('code128', receipt_data, writer=ImageWriter()) + barcode_image = BytesIO() + code128.write(barcode_image) + barcode_image.seek(0) + + # Save barcode image + with open("barcode.png", "wb") as f: + f.write(barcode_image.read()) + + pdf.image("barcode.png", x=150, y=8, w=50) + + # Add thank you message + pdf.set_font("Arial", size=16, style='B') + pdf.set_xy(10, 250) + pdf.cell(200, 10, txt="Thanks for choosing Horizon Travels!", ln=True, align='C') + output = BytesIO() pdf.output(output) output.seek(0) - + return output + def create_plane_ticket(seat_num, seat_type, depart_date, listing, booking_id): for i in range(seat_num): seat_number = f"{seat_num + 1 - i:02d}" diff --git a/app/models/bookings.py b/app/models/bookings.py index eb1e650..34b1551 100644 --- a/app/models/bookings.py +++ b/app/models/bookings.py @@ -11,6 +11,8 @@ class Bookings(UserMixin, db.Model): seat_type = db.Column(db.String(50), nullable=False) num_seats = db.Column(db.Integer, nullable=False) cancelled = db.Column(db.Boolean, default=False) + booking_date = db.Column(db.Date, nullable=False) + last_four_card_nums = db.Column(db.String(4), nullable=False) @staticmethod def create_booking(listing_id, user_id, amount_paid, seat_type, num_seats): diff --git a/app/static/core/1.jpg b/app/static/core/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7efd61d2d445c696b4f4689a845e8274123d2656 GIT binary patch literal 15777 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 QIqkZ`|Fo+}kk0>`0PVa46aWAK literal 0 HcmV?d00001 diff --git a/app/templates/bookings/payment_success.html b/app/templates/bookings/payment_success.html index 65a99ea..5cfb912 100644 --- a/app/templates/bookings/payment_success.html +++ b/app/templates/bookings/payment_success.html @@ -1,15 +1,23 @@ {% extends 'base.html' %} {% block content %} - <body> - <h1>Payment Successful!</h1> - <p>Your payment has been processed successfully.</p> - <p>Click the buttons below to download your receipt and plane ticket:</p> - <form action="{{ url_for('bookings.generate_receipt', id=id) }}" method="get"> - <button type="submit">Download Receipt</button> - </form> - <form action="{{ url_for('bookings.generate_ticket', id=id) }}" method="get"> - <button type="submit">Download Plane Ticket</button> - </form> + <div class="container text-center mt-5"> + <h1 class="text-success">Payment Successful!</h1> + <p class="lead">Your payment has been processed successfully.</p> + <p>Click the buttons below to download your receipt and plane ticket:</p> + <div class="mt-4"> + <form action="{{ url_for('bookings.generate_receipt', id=id) }}" method="get" class="d-inline"> + <button type="submit" class="btn btn-success btn-lg">Download Receipt</button> + </form> + <form action="{{ url_for('bookings.generate_ticket', id=id) }}" method="get" class="d-inline"> + <button type="submit" class="btn btn-primary btn-lg">Download Plane Ticket</button> + </form> + </div> + <div class="mt-4"> + <a href="{{ url_for('main.index') }}" class="btn btn-warning btn-lg"> + <i class="fas fa-home"></i> Go Home + </a> + </div> + </div> </body> {% endblock %} diff --git a/barcode.png b/barcode.png new file mode 100644 index 0000000000000000000000000000000000000000..6316549fa9149ba0f79c580fc4d8ab0adf42cdb3 GIT binary patch literal 12058 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 literal 0 HcmV?d00001 -- GitLab