eaglelandsonce's picture
Update app.py
eda0cbb verified
Raw
History Blame Contribute Delete
4.96 kB
import gradio as gr
# ---- Inventory (ID, Name, PricePerUnit) ----
INVENTORY = [
(1, "Apples", 250),
(2, "Cherry", 650),
(3, "Chickoo", 50),
(4, "Grapes", 90),
(5, "Mangoes", 150),
]
INV_MAP = {pid: (name, price) for pid, name, price in INVENTORY}
def add_item(cart, item_id):
"""
Add one unit of item_id to the cart.
cart: dict {product_id: quantity}
"""
# Validate item_id
if item_id is None:
return cart, "Please enter a Product ID to add.", ""
try:
item_id = int(item_id)
except (TypeError, ValueError):
return cart, "Product ID must be an integer.", ""
if item_id not in INV_MAP:
return cart, f"Invalid Product ID: {item_id}", ""
new_cart = dict(cart) if cart else {}
new_cart[item_id] = new_cart.get(item_id, 0) + 1
name, _ = INV_MAP[item_id]
return new_cart, f">>>>> '{name}' added to cart. <<<<<\n", ""
def remove_item(cart, item_id):
"""
Remove one unit of item_id from the cart (if present).
"""
if not cart:
return cart, "", "Cart is empty."
if item_id is None:
return cart, "", "Please enter a Product ID to remove."
try:
item_id = int(item_id)
except (TypeError, ValueError):
return cart, "", "Product ID must be an integer."
if item_id not in cart or cart[item_id] <= 0:
return cart, "", f"Item ID {item_id} is not in the cart."
new_cart = dict(cart)
new_cart[item_id] -= 1
if new_cart[item_id] <= 0:
del new_cart[item_id]
name, _ = INV_MAP[item_id]
return new_cart, "", f">>>>> One '{name}' removed. <<<<<\n"
def render_cart(cart):
"""
Pretty-print the cart and compute total.
cart: dict {product_id: quantity}
"""
if not cart:
return ">>>>>>>> Your cart is empty! Why not buy fruits from us? <<<<<<<<\n", "Total cost: $0.00"
lines = []
lines.append("+" * 62)
lines.append(f"{'Your Cart':^62}")
lines.append("+" * 62)
lines.append(f"{'ProdID':<8} {'Name':<20} {'Qty':<6} {'Price/Unit':<12} {'Line Total':<12}")
lines.append("-" * 62)
grand = 0
# Stable order by product id
for pid in sorted(cart.keys()):
qty = cart[pid]
name, price = INV_MAP[pid]
line_total = price * qty
grand += line_total
lines.append(f"{pid:<8} {name:<20} {qty:<6} ${price/100:>10.2f} ${line_total/100:>10.2f}")
lines.append("-" * 62)
lines.append(f"{'Grand Total':<48} ${grand/100:>10.2f}")
return "\n".join(lines), f"Total cost: ${grand/100:.2f}"
def add_handler(cart_state, item_id):
cart, add_msg, _ = add_item(cart_state, item_id)
cart_txt, total_txt = render_cart(cart)
return cart, cart_txt, add_msg, "" , total_txt
def remove_handler(cart_state, item_id):
cart, _, remove_msg = remove_item(cart_state, item_id)
cart_txt, total_txt = render_cart(cart)
return cart, cart_txt, "" , remove_msg, total_txt
def clear_cart():
cart = {}
cart_txt, total_txt = render_cart(cart)
return cart, cart_txt, "", "", total_txt
def launch_gradio():
with gr.Blocks() as demo:
gr.Markdown("### Fruit Shopping Cart System")
# Persist cart per user session
cart_state = gr.State({})
with gr.Row():
add_id = gr.Number(label="Product ID to Add", precision=0)
rem_id = gr.Number(label="Product ID to Remove", precision=0)
with gr.Row():
add_btn = gr.Button("Add to Cart")
rem_btn = gr.Button("Remove from Cart")
clr_btn = gr.Button("Clear Cart")
cart_display = gr.Textbox(label="Your Cart", interactive=False, lines=12)
add_msg_box = gr.Textbox(label="Add Item Message", interactive=False)
rem_msg_box = gr.Textbox(label="Remove Item Message", interactive=False)
total_box = gr.Textbox(label="Total Cost", interactive=False)
# Show inventory reference
inv_md = "#### Inventory\n"
inv_md += "| ID | Name | Price (USD) |\n|---:|---------|-------------:|\n"
for pid, name, price in INVENTORY:
inv_md += f"| {pid} | {name} | ${price/100:.2f} |\n"
gr.Markdown(inv_md)
# Wire up events
add_btn.click(
add_handler,
inputs=[cart_state, add_id],
outputs=[cart_state, cart_display, add_msg_box, rem_msg_box, total_box],
)
rem_btn.click(
remove_handler,
inputs=[cart_state, rem_id],
outputs=[cart_state, cart_display, add_msg_box, rem_msg_box, total_box],
)
clr_btn.click(
clear_cart,
inputs=[],
outputs=[cart_state, cart_display, add_msg_box, rem_msg_box, total_box],
)
# Initial render
demo.load(lambda: render_cart({}), inputs=None, outputs=[cart_display, total_box])
demo.launch()
if __name__ == "__main__":
launch_gradio()