Skip to content

https://github.com/lzybkr/PSReadLine/issues/new #4963

@Schuschie26

Description

@Schuschie26

Prerequisites

  • Write a descriptive title.
  • Make sure you are able to repro it on the latest released version
  • Search the existing issues, especially the pinned issues.

Exception report

https://github.com/lzybkr/PSReadLine/issues/new

Screenshot

N/A

Environment data

import os
import sqlite3
from flask import Flask, request, session, redirect, url_for, render_template_string, flash
from uuid import uuid4
from datetime import datetime

app = Flask(__name__)
app.secret_key = os.getenv("BUYBANTU_SECRET", "dev_secret")
DB_PATH = os.getenv("BUYBANTU_DB", "buybantu.db")

@app.route("/health")
def health():
    return "OK", 200

def init_db():
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.executescript('''
    CREATE TABLE IF NOT EXISTS products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        sku TEXT,
        name TEXT NOT NULL,
        description TEXT,
        price REAL NOT NULL,
        category TEXT NOT NULL,
        image_url TEXT,
        created_at TEXT
    );
    CREATE TABLE IF NOT EXISTS delivery_prices (
        town TEXT PRIMARY KEY,
        price REAL NOT NULL
    );
    CREATE TABLE IF NOT EXISTS orders (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        tracking_code TEXT UNIQUE,
        customer_name TEXT,
        address TEXT,
        phone TEXT,
        town TEXT,
        delivery_price REAL,
        subtotal REAL,
        total REAL,
        status TEXT,
        created_at TEXT
    );
    CREATE TABLE IF NOT EXISTS order_items (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        order_id INTEGER,
        product_id INTEGER,
        product_name TEXT,
        qty INTEGER,
        unit_price REAL,
        FOREIGN KEY(order_id) REFERENCES orders(id)
    );
    ''')
    conn.commit()
    conn.close()

init_db()

@app.route("/")
def home():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute("SELECT * FROM products ORDER BY created_at DESC")
    products = c.fetchall()
    conn.close()
    return render_template_string('''
    <h1>BuyBantu</h1>
    <h3>Products</h3>
    <div>
      {% for p in products %}
      <div style="border:1px solid #ccc;padding:10px;margin:10px;">
        <h4>{{p['name']}}</h4>
        <p>${{p['price']}}</p>
        <form action="/cart/add/{{p['id']}}" method="post">
          <input type="number" name="qty" value="1" min="1">
          <button type="submit">Add to Cart</button>
        </form>
      </div>
      {% endfor %}
    </div>
    <a href="/cart">View Cart</a>
    ''', products=products)

@app.route("/cart")
def cart():
    cart = session.get("cart", {})
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    items, subtotal = [], 0
    for pid, qty in cart.items():
        c.execute("SELECT * FROM products WHERE id=?", (pid,))
        p = c.fetchone()
        if p:
            total = p['price']*qty
            subtotal += total
            items.append({"id":pid,"name":p['name'],"qty":qty,"price":p['price'],"total":total})
    conn.close()
    return render_template_string('''
    <h2>Your Cart</h2>
    {% for item in items %}
      <p>{{item['name']}} x {{item['qty']}} = ${{item['total']}}</p>
    {% endfor %}
    <p>Subtotal: ${{subtotal}}</p>
    <a href="/checkout">Proceed to Checkout</a>
    ''', items=items, subtotal=subtotal)

@app.route("/cart/add/<int:pid>", methods=["POST"])
def add_to_cart(pid):
    qty = int(request.form.get("qty", 1))
    cart = session.get("cart", {})
    cart[str(pid)] = cart.get(str(pid), 0) + qty
    session["cart"] = cart
    flash("Added to cart")
    return redirect(url_for("home"))

@app.route("/checkout", methods=["GET","POST"])
def checkout():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute("SELECT * FROM delivery_prices")
    towns = c.fetchall()
    if request.method == "POST":
        name = request.form['name']
        address = request.form['address']
        phone = request.form['phone']
        town = request.form['town']
        c.execute("SELECT price FROM delivery_prices WHERE town=?", (town,))
        dp = c.fetchone()
        delivery_price = dp['price'] if dp else 0
        cart = session.get("cart", {})
        subtotal = 0
        for pid, qty in cart.items():
            c.execute("SELECT price,name FROM products WHERE id=?", (pid,))
            p = c.fetchone()
            if p:
                subtotal += p['price']*qty
        total = subtotal + delivery_price
        tracking = str(uuid4()).split('-')[0].upper()
        now = datetime.utcnow().isoformat()
        c.execute("INSERT INTO orders (tracking_code,customer_name,address,phone,town,delivery_price,subtotal,total,status,created_at) VALUES (?,?,?,?,?,?,?,?,?,?)",
                  (tracking,name,address,phone,town,delivery_price,subtotal,total,'received',now))
        oid = c.lastrowid
        for pid, qty in cart.items():
            c.execute("SELECT name,price FROM products WHERE id=?", (pid,))
            p = c.fetchone()
            if p:
                c.execute("INSERT INTO order_items (order_id,product_id,product_name,qty,unit_price) VALUES (?,?,?,?,?)",
                          (oid,pid,p['name'],qty,p['price']))
        conn.commit()
        session['cart'] = {}
        flash(f"Order placed! Tracking code: {tracking}")
        return redirect(url_for("home"))
    conn.close()
    return render_template_string('''
    <h2>Checkout</h2>
    <form method="post">
      <p>Name: <input name="name"></p>
      <p>Address: <input name="address"></p>
      <p>Phone: <input name="phone"></p>
      <p>Town: <select name="town">
        {% for t in towns %}
          <option value="{{t['town']}}">{{t['town']}} (${{t['price']}})</option>
        {% endfor %}
      </select></p>
      <button type="submit">Place Order</button>
    </form>
    ''', towns=towns)

if __name__ == "__main__":
    print("Starting BuyBantu app (debug disabled to avoid _multiprocessing issue)…")
    app.run(debug=False, use_reloader=False)

Steps to reproduce

Oops, something went wrong. Please report this bug with the details below.
Report on GitHub: https://github.com/lzybkr/PSReadLine/issues/new

Expected behavior

to run code in terminal

Actual behavior

Oops, something went wrong. Please report this bug with the details below.
Report on GitHub: https://github.com/lzybkr/PSReadLine/issues/new

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions