eshan6704 commited on
Commit
650b122
·
verified ·
1 Parent(s): 6d1a678

Update app/app.py

Browse files
Files changed (1) hide show
  1. app/app.py +189 -5
app/app.py CHANGED
@@ -1,5 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
2
- from .router import *
3
  # -------------------------------------------------------
4
  # FastAPI app
5
  # -------------------------------------------------------
@@ -19,6 +38,171 @@ app.add_middleware(GZipMiddleware, minimum_size=1000)
19
 
20
 
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  # -------------------------------------------------------
23
  # Health
24
  # -------------------------------------------------------
@@ -37,16 +221,16 @@ def fetch_data(req: FetchRequest):
37
 
38
  # ✅ Used by frontend on page load
39
  if mode == "list":
40
- return HTMLResponse(content=router.build_req_type_list_html())
41
 
42
  if mode == "stock":
43
- html = router.handle_stock(req)
44
 
45
  elif mode == "index":
46
- html = router.handle_index(req)
47
 
48
  elif mode == "screener":
49
- html = router.handle_screener(req)
50
 
51
  else:
52
  raise HTTPException(status_code=400, detail="Invalid mode")
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from fastapi.responses import HTMLResponse
3
+ from fastapi.middleware.cors import CORSMiddleware
4
+ from fastapi.middleware.gzip import GZipMiddleware
5
+ from pydantic import BaseModel
6
+ # -------------------------------------------------------
7
+ # Local modules
8
+ # -------------------------------------------------------
9
+ from . import common
10
+ from . import stock
11
+ from . import indices_html as indices
12
+ from . import index_live_html as live
13
+ from . import preopen_html as pre
14
+ from . import eq_html as eq
15
+ from . import bhavcopy_html as bhav
16
+ from . import build_nse_fno as fno
17
+ from . import nsepythonmodified as ns
18
+ from . import yahooinfo
19
+ from . import screener # screener owns its map
20
 
21
+ #from .router import *
22
  # -------------------------------------------------------
23
  # FastAPI app
24
  # -------------------------------------------------------
 
38
 
39
 
40
 
41
+
42
+ # -------------------------------------------------------
43
+ # REQ TYPE MAP (stock & index only)
44
+ # -------------------------------------------------------
45
+ REQ_TYPE_MAP = {
46
+ "stock": [
47
+ "info", "intraday", "daily", "nse_eq", "qresult",
48
+ "result", "balance", "cashflow", "dividend",
49
+ "split", "other", "stock_hist"
50
+ ],
51
+ "index": [
52
+ "indices", "open", "preopen", "fno",
53
+ "fiidii", "events",
54
+ "index_highlow", "stock_highlow", "bhav",
55
+ "largedeals", "bulkdeals", "blockdeals",
56
+ "most_active", "index_history",
57
+ "Hlargedeals", "pe_pb",
58
+ "total_returns"
59
+ ],
60
+ }
61
+
62
+ # ===============================
63
+ # Screener name → URL mapping
64
+ # ===============================
65
+ SCREENER_MAP = {
66
+ "from_high": "https://www.screener.in/screens/3355081/from-high/",
67
+ "sales_wise": "https://www.screener.in/screens/880780/sales_wise/",
68
+ "fii_buying": "https://www.screener.in/screens/343087/fii-buying/",
69
+ "debt_reduction": "https://www.screener.in/screens/126864/debt-reduction/",
70
+ "magic_formula": "https://www.screener.in/screens/59/magic-formula/",
71
+
72
+ }
73
+ # -------------------------------------------------------
74
+ # HTML builder for req_type discovery
75
+ # -------------------------------------------------------
76
+ def build_req_type_list_html():
77
+ html = ["<div id='req_type_list'>"]
78
+
79
+ # STOCK & INDEX
80
+ for mode, items in REQ_TYPE_MAP.items():
81
+ html.append(f"<h3>{mode.upper()}</h3><ul>")
82
+ for it in items:
83
+ html.append(
84
+ f"<li class='{mode}-req' data-mode='{mode}'>{it}</li>"
85
+ )
86
+ html.append("</ul>")
87
+
88
+ # SCREENER (keys extracted from screener.py)
89
+ html.append("<h3>SCREENER</h3><ul>")
90
+ for key in SCREENER_MAP.keys():
91
+ html.append(
92
+ f"<li class='screener-req' data-mode='screener'>{key}</li>"
93
+ )
94
+ html.append("</ul></div>")
95
+
96
+ return "".join(html)
97
+
98
+
99
+ # -------------------------------------------------------
100
+ # Request model
101
+ # -------------------------------------------------------
102
+ class FetchRequest(BaseModel):
103
+ mode: str
104
+ req_type: str
105
+ name: str = ""
106
+ date_start: str = ""
107
+ date_end: str = ""
108
+
109
+
110
+
111
+ # -------------------------------------------------------
112
+ # STOCK handler
113
+ # -------------------------------------------------------
114
+ def handle_stock(req: FetchRequest):
115
+ t = req.req_type.lower()
116
+
117
+ if t == "info":
118
+ return yahooinfo.fetch_info(req.name)
119
+ if t == "intraday":
120
+ return stock.fetch_intraday(req.name)
121
+ if t == "daily":
122
+ return stock.fetch_daily(req.name, req.date_end)
123
+ if t == "nse_eq":
124
+ return eq.build_eq_html(req.name)
125
+ if t == "qresult":
126
+ return stock.fetch_qresult(req.name)
127
+ if t == "result":
128
+ return stock.fetch_result(req.name)
129
+ if t == "balance":
130
+ return stock.fetch_balance(req.name)
131
+ if t == "cashflow":
132
+ return stock.fetch_cashflow(req.name)
133
+ if t == "dividend":
134
+ return stock.fetch_dividend(req.name)
135
+ if t == "split":
136
+ return stock.fetch_split(req.name)
137
+ if t == "other":
138
+ return stock.fetch_other(req.name)
139
+ if t == "stock_hist":
140
+ return ns.nse_stock_hist(
141
+ req.date_start, req.date_end, req.name
142
+ ).to_html()
143
+
144
+ return common.wrap(f"<h3>Unhandled stock req_type: {t}</h3>")
145
+
146
+
147
+ # -------------------------------------------------------
148
+ # INDEX handler
149
+ # -------------------------------------------------------
150
+ def handle_index(req: FetchRequest):
151
+ t = req.req_type.lower()
152
+
153
+ if t == "indices":
154
+ return indices.build_indices_html()
155
+ if t == "open":
156
+ return live.build_index_live_html()
157
+ if t == "preopen":
158
+ return pre.build_preopen_html()
159
+ if t == "fno":
160
+ return fno.nse_fno_html(req.date_end, req.name)
161
+ if t == "fiidii":
162
+ return ns.nse_fiidii()
163
+ if t == "events":
164
+ return ns.nse_events()
165
+
166
+ if t == "index_highlow":
167
+ return ns.nse_highlow(req.date_end)
168
+ if t == "stock_highlow":
169
+ return ns.stock_highlow(req.date_end)
170
+ if t == "bhav":
171
+ return bhav.build_bhavcopy_html(req.date_end)
172
+ if t == "largedeals":
173
+ return ns.nse_largedeals()
174
+ if t == "bulkdeals":
175
+ return ns.nse_bulkdeals()
176
+ if t == "blockdeals":
177
+ return ns.nse_blockdeals()
178
+ if t == "most_active":
179
+ return ns.nse_most_active()
180
+ if t == "index_history":
181
+ return ns.index_history("NIFTY", req.date_start, req.date_end)
182
+ if t == "Hlargedeals":
183
+ return ns.nse_largedeals_historical(
184
+ req.date_start, req.date_end
185
+ )
186
+ if t == "pe_pb":
187
+ return ns.index_pe_pb_div(
188
+ "NIFTY", req.date_start, req.date_end
189
+ )
190
+ if t == "total_returns":
191
+ return ns.index_total_returns(
192
+ "NIFTY", req.date_start, req.date_end
193
+ )
194
+
195
+ return common.wrap(f"<h3>Unhandled index req_type: {t}</h3>")
196
+
197
+
198
+ # -------------------------------------------------------
199
+ # SCREENER handler
200
+ # -------------------------------------------------------
201
+ def handle_screener(req: FetchRequest):
202
+ return screener.fetch_screener(req.req_type.lower())
203
+
204
+
205
+
206
  # -------------------------------------------------------
207
  # Health
208
  # -------------------------------------------------------
 
221
 
222
  # ✅ Used by frontend on page load
223
  if mode == "list":
224
+ return HTMLResponse(content=build_req_type_list_html())
225
 
226
  if mode == "stock":
227
+ html = handle_stock(req)
228
 
229
  elif mode == "index":
230
+ html = handle_index(req)
231
 
232
  elif mode == "screener":
233
+ html = handle_screener(req)
234
 
235
  else:
236
  raise HTTPException(status_code=400, detail="Invalid mode")