backend / app2.py
eshan6704's picture
Rename app.py to app2.py
c87d091 verified
raw
history blame
6.65 kB
import gradio as gr
from stock import *
from indices_html import *
from index_live_html import *
from preopen_html import *
from eq_html import *
import pandas as pd
from bhavcopy_html import *
from nsepython import *
from yahooinfo import fetch_info
# ======================================================
# Scrollable HTML wrapper
# ======================================================
SCROLL_WRAP = """
<div style="
max-height: 80vh;
overflow-y: auto;
overflow-x: auto;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
">
{{HTML}}
</div>
"""
import datetime
def last_year_date(d):
# d = "09-12-2025"
dt = datetime.datetime.strptime(d, "%d-%m-%Y")
new_dt = dt.replace(year=dt.year - 1)
return new_dt.strftime("%d-%m-%Y")
def wrap(html):
if html is None:
return "<h3>No Data</h3>"
return SCROLL_WRAP.replace("{{HTML}}", html)
# ======================================================
# Request Type Options
# ======================================================
STOCK_REQ = [
"info", "intraday", "daily","nse_eq", "qresult", "result", "balance",
"cashflow", "dividend", "split", "other","stock_hist"
]
INDEX_REQ = [
"indices", "nse_open", "nse_preopen", "nse_fno","nse_fiidii","nse_events"
"nse_future", "nse_bhav", "nse_highlow","index_history","nse_largedeals","nse_most_active","largedeals_historical","nse_bulkdeals",
"nse_blockdeals","index_pe_pb_div","index_total_returns"
]
# ======================================================
# Update Dropdown based on mode
# ======================================================
def update_on_mode(mode):
if mode == "stock":
return gr.update(choices=STOCK_REQ, value="info")
elif mode == "index":
return gr.update(choices=INDEX_REQ, value="indices")
return gr.update(choices=[], value="")
# ======================================================
# Data Fetcher (no defaults, use exactly frontend input)
# ======================================================
def fetch_data(mode, req_type, name, date_str):
req_type = req_type.lower()
name = name.strip()
date_str = date_str.strip()
date_start= last_year_date(date_str)
if mode == "index":
if req_type == "indices":
return build_indices_html()
elif req_type == "nse_open":
return build_index_live_html()
elif req_type == "nse_preopen":
return build_preopen_html()
elif req_type == "nse_fno":
return wrap(nse_fno(name))
elif req_type == "nse_events":
return nse_events().to_html()
elif req_type == "nse_fiidii":
return nse_fiidii().to_html()
elif req_type == "nse_future":
return wrap(nse_future(name))
elif req_type == "nse_highlow":
return wrap(nse_highlow())
elif req_type == "nse_bhav":
return build_bhavcopy_html(date_str) # no default
elif req_type == "nse_largedeals":
return nse_largedeals().to_html()
elif req_type == "nse_bulkdeals":
return nse_bulkdeals().to_html()
elif req_type == "nse_blockdeals":
return nse_blockdeals().to_html()
elif req_type == "nse_most_active":
return nse_most_active().to_html()
elif req_type == "index_history":
return index_history("NIFTY 50",date_start,date_str).to_html() # no default
elif req_type == "largedeals_historical":
return nse_largedeals_historical(date_start,date_str).to_html() # no default
elif req_type == "index_pe_pb_div":
return index_pe_pb_div("NIFY 50",date_start,date_str).to_html() # no default
elif req_type == "index_total_returns":
return index_total_returns("NIFY 50",date_start,date_str).to_html() # no default
else:
return wrap(f"<h3>No handler for {req_type}</h3>")
elif mode == "stock":
if req_type == "daily":
return wrap(fetch_daily(name))
elif req_type == "nse_eq":
return build_eq_html(name)
elif req_type == "intraday":
return wrap(fetch_intraday(name))
elif req_type == "info":
return wrap(fetch_info(name))
elif req_type == "qresult":
return wrap(fetch_qresult(name))
elif req_type == "result":
return wrap(fetch_result(name))
elif req_type == "balance":
return wrap(fetch_balance(name))
elif req_type == "cashflow":
return wrap(fetch_cashflow(name))
elif req_type == "dividend":
return wrap(fetch_dividend(name))
elif req_type == "split":
return wrap(fetch_split(name))
elif req_type == "other":
return wrap(fetch_other(name))
elif req_type == "stock_hist":
return nse_stock_hist(date_start,date_str,name).to_html()
else:
return wrap(f"<h3>No handler for {req_type}</h3>")
return wrap(f"<h3>No valid mode: {mode}</h3>")
# ======================================================
# UI
# ======================================================
with gr.Blocks(title="Stock / Index App") as iface:
gr.Markdown("### **Stock / Index Data Fetcher**")
with gr.Row():
mode_input = gr.Radio(
["stock", "index"],
label="Mode",
value="stock",
scale=1
)
name_input = gr.Textbox(
label="Symbol / Index Name",
value="ITC",
placeholder="Enter stock symbol or index",
scale=2
)
req_type_input = gr.Dropdown(
label="Request Type",
choices=STOCK_REQ + INDEX_REQ,
value="info",
allow_custom_value=True,
scale=2
)
date_input = gr.Textbox(
label="Date",
value="",
placeholder="DD-MM-YYYY",
scale=1
)
fetch_btn = gr.Button("Fetch", scale=1)
output = gr.HTML(label="Output")
# Update dropdown choices when mode changes
mode_input.change(
update_on_mode,
inputs=mode_input,
outputs=req_type_input
)
# Fetch button
fetch_btn.click(
fetch_data,
inputs=[mode_input, req_type_input, name_input, date_input],
outputs=output
)
# ======================================================
# Launch
# ======================================================
if __name__ == "__main__":
iface.launch(server_name="0.0.0.0", server_port=7860)