Spaces:
Sleeping
Sleeping
File size: 7,059 Bytes
943ca21 c872642 bb46751 c872642 8b47930 c872642 8b47930 d1068de 8b47930 d1068de 8b47930 c872642 bb46751 c872642 b17b983 252e1fa 75633af fc02939 b17b983 8b47930 c872642 bb46751 c872642 8b47930 bb46751 8b47930 bb46751 8b47930 bb46751 8b47930 c872642 c2aabeb c872642 fc02939 75633af 0fe83aa 75633af 0fe83aa c872642 bb46751 c872642 bb46751 |
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
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}"
# Smart Suggestions Function
def suggest_items(query):
query = query.lower()
if "gift" in query and "500" in query:
return (
"π Gift Suggestions under βΉ500:\n"
"1. Bath & Body Gift Set - βΉ499\n"
"2. Mini Perfume Pack - βΉ349\n"
"3. Skin Care Hamper - βΉ399\n"
"4. Chocolates Gift Box - βΉ299"
)
if "shampoo" in query and "dry" in query:
return (
"π§΄ Shampoos for Dry Hair:\n"
"1. Dove 500 ml - βΉ325\n"
"2. Clinic Plus 500 ml - βΉ680"
)
return "π€· Sorry, no smart suggestions found. Try asking: 'Gift items under 500' or 'Shampoo for dry hair'"
def reset_all():
return (
None, None, None, None, None, None, None,
gr.update(choices=[], visible=False), # quantity dropdown reset
"", # result textbox reset
{} # data_state (gr.State) reset with raw dict
)
# ----- 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()
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, interactive=True),
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
)
reset_btn.click(
reset_all,
inputs=[],
outputs=[
country, state, city, store,
category, product, brand, quantity,
result, data_state
]
)
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() |