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