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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions