Spaces:
Running
Running
File size: 6,021 Bytes
943ca21 c872642 8b47930 c872642 8b47930 c872642 8b47930 d1068de 8b47930 d1068de 8b47930 c872642 8b47930 b17b983 252e1fa 8b47930 b17b983 8b47930 c872642 8b47930 c872642 c2aabeb 8b47930 c872642 8b47930 c872642 8b47930 c2aabeb 8b47930 8fd1871 8b47930 c2aabeb 8b47930 c872642 8fd1871 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
import gradio as gr
import os
import pandas as pd
from PIL import Image
# ----- Config -----
BASE_DIR = "data"
ASSETS_DIR = "assets"
DEFAULT_MAP = os.path.join(ASSETS_DIR, "default_map.jpg")
PRODUCT_IMAGE_MAP = {
"shampoo": os.path.join(ASSETS_DIR, "shampoo_map.jpg"),
"curd": os.path.join(ASSETS_DIR, "curd_map.jpg"),
"ghee": os.path.join(ASSETS_DIR, "ghee_map.jpg")
}
# ----- Utilities -----
def get_subfolders(path):
try:
return sorted([f for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))])
except Exception as e:
print(f"β Error reading subfolders from {path}: {e}")
return []
def get_csv_files(path):
try:
return sorted([f[:-4] for f in os.listdir(path) if f.endswith(".csv")])
except Exception as e:
print(f"β Error reading CSVs from {path}: {e}")
return []
def get_quantities_from_csv(path):
try:
df = pd.read_csv(path)
if df.empty or "Quantity" not in df.columns:
return gr.update(choices=[], visible=False), {}
return gr.update(choices=df["Quantity"].dropna().tolist(), visible=True), df.to_dict()
except Exception as e:
print(f"β Error loading CSV: {e}")
return gr.update(choices=[], visible=False), {}
def display_quantity_info(quantity, data_dict):
try:
df = pd.DataFrame(data_dict)
row = df[df["Quantity"] == quantity].iloc[0]
if str(row["In Stock"]).strip().lower() == "yes":
msg = (
f"β
{quantity} is available!\n"
f"β’ Floor: {row['Floor']}\n"
f"β’ Aisle: {row['Aisle']}\n"
f"β’ Price: βΉ{row['Price']}"
)
if "Offer" in row and pd.notna(row["Offer"]) and row["Offer"].strip():
msg += f"\nβ’ π Offer: {row['Offer']}"
return msg
else:
return f"β Sorry, {quantity} is currently not in stock."
except Exception as e:
return f"β οΈ Error: {e}"
def get_product_image(product_name):
lower_name = product_name.strip().lower()
return Image.open(PRODUCT_IMAGE_MAP.get(lower_name, DEFAULT_MAP))
def reset_all():
return (
None, None, None, None, None, None, None,
gr.update(choices=[], visible=False), "", {}, Image.open(DEFAULT_MAP)
)
# ----- UI -----
with gr.Blocks(title="RetailGenie") as demo:
gr.Markdown("# π§ββοΈ RetailGenie β In-Store Smart Assistant")
with gr.Tabs():
with gr.TabItem("π§ Navigator"):
with gr.Row():
country = gr.Dropdown(label="π Country", choices=get_subfolders(BASE_DIR), interactive=True)
state = gr.Dropdown(label="ποΈ State", choices=[], interactive=True)
city = gr.Dropdown(label="ποΈ City", choices=[], interactive=True)
store = gr.Dropdown(label="πͺ Store", choices=[], interactive=True)
category = gr.Dropdown(label="ποΈ Category", choices=[], interactive=True)
product = gr.Dropdown(label="π¦ Product", choices=[], interactive=True)
brand = gr.Dropdown(label="π·οΈ Brand", choices=[], interactive=True)
quantity = gr.Dropdown(label="π’ Quantity", visible=False, interactive=True)
result = gr.Textbox(label="π Product Info", lines=5)
data_state = gr.State()
store_map = gr.Image(value=Image.open(DEFAULT_MAP), type="pil", label="πΊοΈ Store Map")
reset_btn = gr.Button("π Reset All")
# Dropdown chaining
country.change(lambda c: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c)) if c else [], value=None), inputs=country, outputs=state)
state.change(lambda c, s: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s)) if c and s else [], value=None), inputs=[country, state], outputs=city)
city.change(lambda c, s, ci: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci)) if c and s and ci else [], value=None), inputs=[country, state, city], outputs=store)
store.change(lambda c, s, ci, st: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci, st)) if all([c, s, ci, st]) else [], value=None), inputs=[country, state, city, store], outputs=category)
category.change(lambda c, s, ci, st, cat: gr.update(choices=get_subfolders(os.path.join(BASE_DIR, c, s, ci, st, cat)) if all([c, s, ci, st, cat]) else [], value=None), inputs=[country, state, city, store, category], outputs=product)
product.change(lambda c, s, ci, st, cat, prod: gr.update(choices=get_csv_files(os.path.join(BASE_DIR, c, s, ci, st, cat, prod)) if all([c, s, ci, st, cat, prod]) else [], value=None), inputs=[country, state, city, store, category, product], outputs=brand)
brand.change(lambda c, s, ci, st, cat, prod, b: get_quantities_from_csv(os.path.join(BASE_DIR, c, s, ci, st, cat, prod, f"{b}.csv")) if all([c, s, ci, st, cat, prod, b]) else (gr.update(choices=[], visible=False), {}), inputs=[country, state, city, store, category, product, brand], outputs=[quantity, data_state])
quantity.change(display_quantity_info, inputs=[quantity, data_state], outputs=result)
product.change(fn=get_product_image, inputs=product, outputs=store_map)
reset_btn.click(reset_all, inputs=[], outputs=[country, state, city, store, category, product, brand, quantity, result, data_state, store_map])
with gr.TabItem("π Smart Suggestions"):
gr.Markdown("### π€ Ask RetailGenie for Recommendations")
suggestion_input = gr.Textbox(label="Ask something like:", placeholder="Gift items under 500", lines=1)
suggest_btn = gr.Button("π‘ Get Suggestions")
suggestions_output = gr.Textbox(label="π Suggestions", lines=10)
suggest_btn.click(suggest_items, inputs=suggestion_input, outputs=suggestions_output)
demo.launch()
|