-
Notifications
You must be signed in to change notification settings - Fork 317
Closed
Description
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/newScreenshot
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
Labels
No labels