Unit 14
app.py
from flask import Flask, render_template, request, redirect
import sqlite3
app = Flask(__name__)
def get_db_connection():
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row
return conn
def init_db():
conn = get_db_connection()
conn.execute('''
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL
)
''')
conn.commit()
conn.close()
init_db()
@app.route("/")
def index():
conn = get_db_connection()
tasks = conn.execute("SELECT * FROM tasks").fetchall()
conn.close()
return render_template("index.html", tasks=tasks)
@app.route("/add", methods=["POST"])
def add():
title = request.form["title"]
conn = get_db_connection()
conn.execute("INSERT INTO tasks (title) VALUES (?)", (title,))
conn.commit()
conn.close()
return redirect("/")
@app.route("/delete/<int:id>")
def delete(id):
conn = get_db_connection()
conn.execute("DELETE FROM tasks WHERE id = ?", (id,))
conn.commit()
conn.close()
return redirect("/")
index.html
<!DOCTYPE html>
<html>
<head>
<title>To-Do List</title>
</head>
<body>
<h1>To-Do List</h1>
<form action="/add" method="post">
<input name="title" placeholder="Enter task" required>
<button type="submit">Add</button>
</form>
<ul>
{% for task in tasks %}
<li>
{{ task['title'] }}
<a href="/delete/{{ task['id'] }}">[Delete]</a>
</li>
{% endfor %}
</ul>
</body>
</html>
Project 4 Starter Code
init_db.py
import sqlite3
from datetime import datetime
# Define SQL schema
schema = """
CREATE TABLE menu (
menu_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT NOT NULL,
price REAL NOT NULL,
description TEXT
);
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
street_address TEXT,
city TEXT,
state TEXT,
zip_code TEXT,
phone_number TEXT
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
order_number TEXT UNIQUE NOT NULL,
date_time TEXT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE order_items (
order_item_id INTEGER PRIMARY KEY AUTOINCREMENT,
order_number TEXT NOT NULL,
menu_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY (order_number) REFERENCES orders(order_number),
FOREIGN KEY (menu_id) REFERENCES menu(menu_id)
);
"""
# Test data
test_menu = [
"Calamari", "appetizers", 19.99, "Crispy squid served with marinara sauce"
]
test_customer = (
"Alex", "1000 Morris Avenue", "Union", "NJ", "07083", "908-737-5326"
)
# Connect and execute
conn = sqlite3.connect("project4.db")
cursor = conn.cursor()
# Run schema
cursor.executescript(schema)
print("Database schema created.")
# Insert one menu item
cursor.execute(
"""INSERT INTO menu (name, category, price, description)
VALUES (?, ?, ?, ?)""", test_menu
)
# Insert one test customer
cursor.execute(
"""INSERT INTO customers (name, street_address, city, state, zip_code, phone_number)
VALUES (?, ?, ?, ?, ?, ?)""", test_customer
)
conn.commit()
conn.close()
print("Inserted sample menu and one test customer into project6.db.")
app.py
from flask import Flask, render_template, request, redirect, session
import sqlite3
from datetime import datetime
app = Flask(__name__)
app.secret_key = "mysecretkey" # Needed for session handling
def get_db():
conn = sqlite3.connect("project6.db")
conn.row_factory = sqlite3.Row
return conn
@app.route("/")
def index():
return render_template("index.html")
@app.route("/admin", methods=["GET", "POST"])
def admin():
conn = get_db()
cur = conn.cursor()
if request.method == "POST":
cur.execute("INSERT INTO menu (name, category, price, description) VALUES (?, ?, ?, ?)",
(request.form["name"], request.form["category"], float(request.form["price"]), request.form["description"]))
conn.commit()
cur.execute("SELECT * FROM menu")
menu = cur.fetchall()
return render_template("admin.html", menu=menu)
@app.route("/start_order", methods=["GET", "POST"])
def start_order():
if request.method == "POST":
conn = get_db()
cur = conn.cursor()
if request.form["type"] == "new":
cur.execute("INSERT INTO customers (name, street_address, city, state, zip_code, phone_number) VALUES (?, ?, ?, ?, ?, ?)",
(request.form["name"], request.form["street_address"], request.form["city"], request.form["state"], request.form["zip_code"], request.form["phone_number"]))
customer_id = cur.lastrowid
else:
cur.execute("SELECT customer_id FROM customers WHERE name = ?", (request.form["name"],))
row = cur.fetchone()
if row:
customer_id = row["customer_id"]
else:
return "Customer not found"
order_number = "ABC" + datetime.now().strftime('%Y%m%d%H%M%S')
date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cur.execute("INSERT INTO orders (customer_id, order_number, date_time) VALUES (?, ?, ?)",
(customer_id, order_number, date_time))
conn.commit()
session["order_number"] = order_number
return redirect("/order")
return render_template("start_order.html")
@app.route("/order", methods=["GET", "POST"])
def order():
conn = get_db()
cur = conn.cursor()
if request.method == "POST":
order_number = session.get("order_number")
for key, value in request.form.items():
if key.startswith("quantity_"):
menu_id = int(key.split("_")[1])
quantity = int(value)
if quantity > 0:
cur.execute("INSERT INTO order_items (order_number, menu_id, quantity) VALUES (?, ?, ?)",
(order_number, menu_id, quantity))
conn.commit()
return redirect("/order_summary")
cur.execute("SELECT * FROM menu")
menu = cur.fetchall()
return render_template("order.html", menu=menu)
@app.route("/order_summary")
def order_summary():
conn = get_db()
cur = conn.cursor()
order_number = session.get("order_number")
cur.execute("""
SELECT m.name, m.price, oi.quantity, (m.price * oi.quantity) AS total_price
FROM order_items oi
JOIN menu m ON m.menu_id = oi.menu_id
WHERE oi.order_number = ?
""", (order_number,))
items = cur.fetchall()
subtotal = sum(item["total_price"] for item in items)
tax = subtotal * 0.06625
tip = subtotal * 0.15
delivery_fee = 5
total = subtotal + tax + tip + delivery_fee
return render_template("order_summary.html", summary=items, subtotal=subtotal, tax=tax, tip=tip, delivery_fee=delivery_fee, total=total)
if __name__ == "__main__":
app.run(debug=True)
index.html
<!DOCTYPE html>
<html>
<head><title>Welcome to Flask Restaurant</title></head>
<body>
<h1>Welcome to Flask Restaurant!</h1>
<nav>
<a href="/admin">Admin Panel</a> |
<a href="/start_order">Start New Order</a>
</nav>
</body>
</html>
admin.html
<!DOCTYPE html>
<html>
<head><title>Admin Panel</title></head>
<body>
<h1>Admin Panel</h1>
<h2>Insert New Menu Item</h2>
<form method="post" action="/admin/add_item">
Name: <input type="text" name="name"><br>
Category: <input type="text" name="category"><br>
Price: <input type="number" step="0.01" name="price"><br>
Description: <input type="text" name="description"><br>
<input type="submit" value="Add Item">
</form>
<h2>Current Menu</h2>
<ul>
{% for item in menu %}
<li>{{ item['name'] }} - ${{ item['price'] }} ({{ item['category'] }})</li>
{% endfor %}
</ul>
<a href="/">Back to Home</a>
</body>
</html>
start_order.html
<!DOCTYPE html>
<html>
<head><title>Start Order</title></head>
<body>
<h1>Start Your Order</h1>
<h2>New Customer</h2>
<form method="post" action="/start_order">
<input type="hidden" name="type" value="new">
Name: <input type="text" name="name"><br>
Address: <input type="text" name="street_address"><br>
City: <input type="text" name="city"><br>
State: <input type="text" name="state"><br>
Zip Code: <input type="text" name="zip_code"><br>
Phone Number: <input type="text" name="phone_number"><br>
<input type="submit" value="Continue">
</form>
<h2>Returning Customer</h2>
<form method="post" action="/start_order">
<input type="hidden" name="type" value="existing">
Enter Name: <input type="text" name="name"><br>
<input type="submit" value="Continue">
</form>
</body>
</html>
order.html
<!DOCTYPE html>
<html>
<head><title>Order Menu</title></head>
<body>
<h1>Order Menu</h1>
<form method="post" action="/order">
{% for item in menu %}
<p>
<strong>{{ item['name'] }}</strong> (${{ item['price'] }})<br>
{{ item['description'] }}<br>
Quantity: <input type="number" name="quantity_{{ item['menu_id'] }}" value="0" min="0"><br>
</p>
{% endfor %}
<input type="submit" value="Submit Order">
</form>
</body>
</html>
order_summary.html
<!DOCTYPE html>
<html>
<head><title>Order Summary</title></head>
<body>
<h1>Order Summary</h1>
<ul>
{% for item in summary %}
<li>{{ item['name'] }} (x{{ item['quantity'] }}) - ${{ "%.2f"|format(item['total_price']) }}</li>
{% endfor %}
</ul>
<p>Subtotal: ${{ "%.2f"|format(subtotal) }}</p>
<p>Tax (6.625%): ${{ "%.2f"|format(tax) }}</p>
<p>Tip: ${{ "%.2f"|format(tip) }}</p>
<p>Delivery Fee: ${{ "%.2f"|format(delivery_fee) }}</p>
<h2>Total: ${{ "%.2f"|format(total) }}</h2>
<a href="/">Return to Home</a>
</body>
</html>
Last updated