From 4c8972fb36bb40f8db0abc475e7bd113f1ba88dc Mon Sep 17 00:00:00 2001 From: Tamanna Date: Wed, 23 Jul 2025 22:44:14 +0530 Subject: [PATCH 1/2] Enhanced city selection: text input + sorted dropdown + no-match warning --- __pycache__/config.cpython-313.pyc | Bin 0 -> 2720 bytes app.py | 49 ++++++++++++++---- utils/__pycache__/air_quality.cpython-313.pyc | Bin 0 -> 1321 bytes utils/__pycache__/chatbot.cpython-313.pyc | Bin 0 -> 1359 bytes utils/__pycache__/crime.cpython-313.pyc | Bin 0 -> 1375 bytes utils/__pycache__/tourist.cpython-313.pyc | Bin 0 -> 2454 bytes utils/__pycache__/weather.cpython-313.pyc | Bin 0 -> 2241 bytes 7 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 __pycache__/config.cpython-313.pyc create mode 100644 utils/__pycache__/air_quality.cpython-313.pyc create mode 100644 utils/__pycache__/chatbot.cpython-313.pyc create mode 100644 utils/__pycache__/crime.cpython-313.pyc create mode 100644 utils/__pycache__/tourist.cpython-313.pyc create mode 100644 utils/__pycache__/weather.cpython-313.pyc diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78a42d65f24e32572ceab36d6622670cdcdac242 GIT binary patch literal 2720 zcmZvddr(yO702%ayTI}Wc?c>Gkv9l}Eb`F1ypg9ISWG0GJIWPuz<~<f%s^~BXhX_SSLKH+RItG?NtfJ!}9ugG26cQmx(aT^ttWb0^q(G{o(_kf} zD|!`VK&GOzARBTNoeO!8ujm3;4TXv>f;CXQpz$;%uog-cj}FRUoubR30xA_<1?yph zqIu9mwW4dF7U~pT4-L?$=qA_*&5CY;R%lanJ9NM%MRx)~m!iAD06mJ{43EL%irxaf z@Pwj&09#?3q6zdtzoLyG!1e`QrveHh(_n%D*$#qPwid9;)&_Rj?f^-)4sgoW1w*nO zhMlqE0!l{{_H zJ+I%^3VgPo$KOnx_|InbXj)yCK4PNZ?jHE9Gp3lQSH60+GOw(Y_XJlHDP6rF)JqF}Y+qM28peXS=a zho^6&2co*r)oe2l5+|XD&V6?0=#NTy`qhud)cuzow%PP>H{k7z7*?~1Yox?C@ zhFBbW(IOb-tsdY`SJgV6PFJ+K52vG3vyqtWE{Wdw^k&G9@09b@Klo5`|2^~swz&ES zt+rw6J@8)FJG1B-_;kmiu}Ta=(@d;vl6mK@(|Hc`T}S&b|euN0s9weC%fn=N+x0Slp8wAqQ7ephaP|G8=mF5&1*u=qI6QFjoh zmC#E+)Oh12*70-?8`9W~Q#y&YA4?;9Hsh2}-q`=tby)Do=ebpycx4NZ0nGRR`H5x` zLkp=EU46tVIEINtM>bEboo+7SY1ggOFaOSo6T=NAhe!rRVrP3==u5ZnC4cZbR;Bg@ z^B3Pu;{sZPX@HE7VPYh-wDNN2vAu;ny>S0OGdr`<8`w&WE(vRP0V6s8(Mq1)e&*Hb zvj_1Q+8Ub)d&J3(U%$%bcOoc*r!nN(jod1hnAQ;o^E7rmOmO@pi>Lps`F8HhEHLC+iOdTe!hYwr`g6*pow0x;oXmMyR+~~R>aN)qRC<=3w@Y~^WxbF zo0+GTSc%z04@c}O{lyBNr`?4)XJT5=6I3gR66VoLlU9F{uGxg^9e?ZCc*H*R1?Z_n zsJbMov@*Yfr+DZ$_KyNjv5*yQo3J~s8P9I(dbab4f zc&@ye6aQF#*Pz_eBREU0!#7CY0e&ZB5~Fqd7wGp$G^-&$mA*O(3G!nOkvB< zwe=t3USoJ48b8JlQMf0_KqSnj!{iBSB$CO9&Fu+la19fYIFVru%=nd}o)G+`ND{HT ztOF)bU;}=coVG!aww6c(f?zh`2#wyfiwv9bqFU@CF?)iVoVYL+*W=$Jh`5wwT6ooV zxQwoTw%iDQB8kN&wq>hugQl*>w$`+_ch?59_N{h|tG7IaaGF(B0e~$O?ciQW(QmMR} zq6oj)fROQ?$sTuDzSkdLZw7>p(@E+MFYv1I)vMvukrVM#@$RT1Zy*CfJ|LI@EvF72 zAD$d`N38aSFc9hk!WanW)FI;ylMU|BJZ}U8kv?lgF%ZqE!xp!VVPJ{R8nFz-`HYBX zAi)PLWgyW9Br&ke2P|h`1*Z;OJZmxoDLx}o8A$sc%&%l1ol{3o=%#e;m}2iL1~NEx z>;#>n?zmEKCIeZVI%*f)DUClrt8RF|dY3YQT(z<#~%4DB;xFaowcO9g^!^%Rs45f^-a&`G9o{lymBciNL8qcVwZr zf`Lk(II0*}?-R!c26&YZ(W@A$M)YWz8X46hTCC@Mos8;L+|m?ztJ#F)|8JAhUm_ncS@R2-|pXh*XL#{XfD?vbF#K literal 0 HcmV?d00001 diff --git a/app.py b/app.py index 82ed4e24..3aaad87e 100644 --- a/app.py +++ b/app.py @@ -14,11 +14,31 @@ st.set_page_config(page_title="City Pulse", layout="wide") st.title("City Pulse 🌆") -city = st.selectbox("Select a City", list(CITY_COORDS.keys())) +search = st.text_input("Search for a city", placeholder="Type to search or leave empty to see full list below") +st.markdown("### Or select from dropdown below") +# Full city list (sorted) +all_cities = sorted(CITY_COORDS.keys()) + +# If user typed something, filter the list +if search: + filtered_cities = [city for city in all_cities if search.lower() in city.lower()] + + if filtered_cities: + city = st.selectbox("Select cities", filtered_cities) + else: + st.warning("No matching cities found.") + city = None + +else: + city = st.selectbox("Select a city", all_cities) + +# Use selected_city if available if city: lat = CITY_COORDS[city]["lat"] lon = CITY_COORDS[city]["lon"] + st.success(f"Showing results for {city}") + # --- Initialize chat history in session state --- if "messages" not in st.session_state: @@ -118,26 +138,33 @@ # --- Chatbot Tab --- -with tabs[5]: - st.header("🤖 Search CityBot") + with tabs[5]: + st.header("🤖 Search CityBot") - if "search_history" not in st.session_state: - st.session_state.search_history = [] + if "search_history" not in st.session_state: + st.session_state.search_history = [] + + user_input = st.chat_input("Ask a question (e.g., top cafes, weekend events)") - user_input = st.chat_input("Ask a question (e.g., top cafes, weekend events)") + if user_input: + st.session_state.search_history.append({"role": "user", "text": user_input}) - if user_input: - st.session_state.search_history.append({"role": "user", "text": user_input}) + with st.spinner("Searching Google..."): + answer = search_google(user_input) - with st.spinner("Searching Google..."): - answer = search_google(user_input) + st.session_state.search_history.append({"role": "bot", "text": answer}) - st.session_state.search_history.append({"role": "bot", "text": answer}) + # Display chat messages + if "search_history" not in st.session_state: + st.session_state.search_history = [] + for msg in st.session_state.search_history: if msg["role"] == "user": st.chat_message("user").markdown(msg["text"]) else: st.chat_message("assistant").markdown(msg["text"]) +else: + st.info("Please select a valid city to see the information.") diff --git a/utils/__pycache__/air_quality.cpython-313.pyc b/utils/__pycache__/air_quality.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c40b066f5a7406b9a9135b2536517f61e1a62899 GIT binary patch literal 1321 zcmah{&u)odSzg|^KIQ$x15E{~iK9}JREBeY&YP97Ej8u+JV)jv zQmkewz%8w9pWR53=u)i)qo7J6guh2H*+8@hqbi}@S{ISp`Rch^C!naEJQvsCs!Z8r zdKmPAgy}Gff{v>&BZ3t6Vx}WX3EiGu36lE`CW&*8^l^uZyI^Vv6K)9JzW8?54oqO} zLbYCl0c}Mj4Esqyu&dG>FGKUfn4+K-263`|VvRWbptISBpBn^S zS#Ewbw=j6u9oT0E=9#fo+CBf^!(BAA-b+_TuSNR?up3HxZETlD_8Y5zJe*y8t@=1y z*uDKYdqPrtGO(8h=F-?+*fWOqso#{LeL7tg9E(Hi_+EWzy`QddlDYX&`Q+ZtuzdD~ zuI7z>pz6kiHwRpu7Wu|9BxVMm1HxPK!sQHp2h`y|=}B?IT<(!hKSY;lg@@v`#|}69 is-h@Qfc*r_jLYx*8vGm#ociPP;sDG~w2ETL3jYGzU`Q(f literal 0 HcmV?d00001 diff --git a/utils/__pycache__/chatbot.cpython-313.pyc b/utils/__pycache__/chatbot.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8839658e0d7e2e0548266288aafd03fc3811ba9f GIT binary patch literal 1359 zcmZuwOH3O_7@mFF_yriu!ywqEG+DG+i`{C1tw^&B9DtymURAlVi9uGAX^2zPz2s zOS#Bm$g1BX)(2n+BrNM|*=Y6DG7x=%^pzmJHzdKgSe$e^!HCQZtx|Dn!``x=YmuG( z5CAC-06BM_+gog^NmN?o;`CLrlcL0z>^Q>7eef($8PT@kZbh8yIMW3_U=bYxi0%T{ zdjU{c(H>{THY?TxL0rSi-$WVdK)p9Ur z7&@8_h4%LLCbF8A&C8Ompox@L2&GJ9XayuoFqI1xCj$&-cH|PKQ+F`68=x?+OHeAH zm*0`nm{SayaO-)?w8K$mg24pl48_RHWqNZAvw20`DYJoK(1C48Rdii8%KlYNfO1|g zN~%E!GV=x!GMcHTC(7QH*WCyU>oH*&LJiIe<^JV6DOooZO%>86RMf1{=x$aBv|&4x zcTE`?2s2sPz@C-0wUwL8TO@w##`0~kuwjnmgC#35(lr$k_q1e4*w*Y6v)0U**Gxk<4NS?%My3}Uf~T*|CgVtkD4Elf zYpT2im7<(nlF^Q#>B*F0l*V;4kL09jD0!4jCSX#+rvNE z!~dKy#QZn9LdLweFtj)bo(e;Yz4oV3JK@K6kA=OQg@ca8D06(#y*R@hhbfECa0CM^ zY$w6c`U}u&fk5Cfs1pQmm;koV6|}UOm!t4avbDY-8X!PQQ&gP?R0kQudv)JaYa86> M>uf(2ffva6znYs-?f?J) literal 0 HcmV?d00001 diff --git a/utils/__pycache__/crime.cpython-313.pyc b/utils/__pycache__/crime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf4bdfa0cad7df34187aee30fcc97745314e30af GIT binary patch literal 1375 zcmah}%WoS+7@ygf*Ka$vutSg^aTKsnVnh|xMrozIcv%FL)heJ^vKD7zFF5P%%sSvi z6+XIfh>BFj6-dpo{0Uq*&?7=hWe}@L4wX3dmdFx9aAC%^Lsg3U9lmeA@AsSUwWI9^ zgFe9Ir=Q!k??nK9=gvr&Kal=4W^MxwXs`(IV+%1X!F6fKc*0BqO_+m^16b6=7Xg;4 zFfTpgp*0#C(Dq#QfLJ4UZYXaNfaFGQurcm)GT|K;~*{0n80M zu#^I@Jh~DCZ|eY9s_t3$|M!NjJ~NMZw6p)geb2%D&%vb;t_5Z<&KdCD1^|A*ruR&N zEZ7W;`t<-K$!73s!Oid}reE~<8Z1B}q}fZbyo=tcq1}et;HsDg+b|zm+soD*$0qZI zf`vXKhHcI^aJ8`edI9Ys+;VEBRo(Mdu(^XWi)$+xDj3GxlJDspH98zw>J?FKFr$8eg2 zN}mvxkM(9FYm0hUKd+!+3F6?qk4hEOX${g-nPtK)9318)cEciwN?V3w;1CZ=d`HwX z?3_YG`1F|zp>HhDmvn+KDb?)K`xaWk<}NC&Ao8ixuuHtsjNPmgRBAeAos5iq{_zUNLC8V_9 zJPU>8+-Yp$aN+BPBk@7(Qb%>w$Zu-)ftvkA&AH*k!Ht_YzWSmgxv|9IX@H1UFgR2XhQ$%q0L zPfuuee4y_@tZ%>EIdNoW@>rK#(9S@49A?iLQF$bfj3SKp_V&dH1VL5Qc@=5(E!ld+ zwYX_kl!r|p`Mw8cpV$;eVHHl{XW5z``SdV7j3OjBol#tA;01lG&c=bxb$~RJ5*)AX zInBlyMN}lkP5v4Zf=vBL4W1qYb%oBS`Dd}*S-0n=0U#cYPwxl7K?s5)2LULNh|Lpe zF6H^B=WMg1OA9H#BX7?Rl2g^$pkq6Anx^RJmBtwB$TFCG8GuG01Hy*X0Ti$9R+_gM znr(6RE4~=3H_V2eb*jygw&y+I)CY<`!Rn3a#?-EDy(2l%=}qaTRK(G4&q^Q;2I}=9 zog3rR?p*p=4Ullwtf8sB0m&7~z}XN-LwJO^fX zIMIthB^l|W(xiC)QYF#BqW#vx#2KC2O>U%R_nFHm#v}yr`O1Y@z0= znwk~M8pWC}PFC?+RB;<#uq~*fY(D;mW$5LIZJ4qXxN6%-&Dxrw*Pvk9Ja0 z+UhAC-y(}Vj!zOI=elhAiV}z|E~CweK3dp6l2&G>Co^d!naT{0C#Pnx=X6OcM@Rtc$yytUY+nkIqAoMj_KUkJ>RZP=Z>kcB2qAMsQv zIrXJQvN2Byi+VAi)hL>|SdUR8mYMF#! zSgW;)g{=&|#3ui3;K7lhIofyDT;80U*5N49&cV4+Xq_Q7o1;N=o27yU=SsF#u;%JT zjG2o#NW#q^NXlO%X_6w4^H4uIf!53Vg0%J$_@%kE+8C%dde@smRbTt}9q|p04SP2@ zzO~_zDEVAVM>ci<|K64Um3fB7hu%H3!rcq@ElX8$^2N&+-+FVIUk~lPcIxV>_qCgW zwNTeh<>u+NQ15cG+7!4ld3mxL-gU!$-MzAJEgY>z zbeJC<1Yhnw>`ThvtHFlkF77VtPlma>VS&nW!z?#iCTT6m}eLK`j+8e=QKzsdJ8E|ee}{sb>AL-hav literal 0 HcmV?d00001 diff --git a/utils/__pycache__/weather.cpython-313.pyc b/utils/__pycache__/weather.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be1b4d68f22dafa97035186913e2863f3e68d474 GIT binary patch literal 2241 zcmb7_&uniV4K1X($Sq9}NjfAp~VH0b$kJt|#%5_3kpW z8x#wvR@DR0L&%}3d&{w?|3D8ta73yq*-9ncrIjLa;ue~!=e}8c15N3#Iecf|%zJO= z&CX|bD;jM^(7yknl>bsh=s7d|#y1|eK81%bkc?#RA|mykBOKUG7n?rh2``}x-;YKb z?qH$Wke}pL-;ZQ|gsa;`_*GC4w(l@Z|*OMs!ojWpk#DjU~5p z=F0fxx$$#XC&y>A=dMg;FOJ`EyRS{j>2sIHW@lu1>hcADT=i>WnV??8?5z;23hLw1 zTr1R+ZUW_RG7qn{qG8eCZ#Mb%Y`}kd)%T?R^OEWif(=``gB3fEiR4htSdeBcY|Pb1rWI?b_+H+&EjpS^DwZ~6!eqm}0Fx$J zNahqqtX z-M}phSp{3Obqq0K72cmUlmd2nC>sQ3d57pM3AIdvLI~R+%8rZVHTT5WXeLcDp_#mu znKAHrqAlUfc}y2=)5@@nM=eLEIOEuwPBV?-hOA|`6V{V$e6_4!^j^r!4jFv}QbHRo zXCHSy79OXc3_m$onNfetEml;$(p)Hw{Tz$0+%sn7 zTfDM+v=Td637y=CbgrcCr#?SZI=>O`D^IN6U7M)J2W#EE<>RaR+No;yv07J8xqJ1} zT5q-MNDX|ZRzF$0U5zKcK3a{Rcp5)ljh|kRpRKiZJ-o3RTjQ#2{cFdoZHHe*#1?TA ziGsKVi$!YVvS81MT__%`9X_mx!TLI;GCwRB+`od#`4@}bH_U*5)+I)#ElmZf=O7Nlz$brfA1BPL}u4;8Qa`1p_0Z z9R66wWJyyoO~NU*lW9uoGg|4ROj!d$VQ$`!nxu>Y8ctt(mttD2PvkbW3*L(0-ZmH}Re zdOwT-o8q-GhBN74VVz96nCt>^MYxEtkxK+goQ?G|>0|O1lea-!(R6IfvAs7?w&*&& z64}FMJrW!1-6ru6%&=7S8;}y(6j3D0)goQ@1}nQpzdQczp~?sHCeMY_+$N8N&~G8s z*7JXXtVP>buHV1@Fu&Hc9^GG>s6}I?iRbO{dqOSLx)Qw~t?lY9zrXrXt!Gbp{;MeK zZdH2{weG(1 Date: Wed, 23 Jul 2025 22:55:59 +0530 Subject: [PATCH 2/2] Cleaned up: removed __pycache__ and added .gitignore --- __pycache__/config.cpython-313.pyc | Bin 2720 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/config.cpython-313.pyc diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc deleted file mode 100644 index 78a42d65f24e32572ceab36d6622670cdcdac242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2720 zcmZvddr(yO702%ayTI}Wc?c>Gkv9l}Eb`F1ypg9ISWG0GJIWPuz<~<f%s^~BXhX_SSLKH+RItG?NtfJ!}9ugG26cQmx(aT^ttWb0^q(G{o(_kf} zD|!`VK&GOzARBTNoeO!8ujm3;4TXv>f;CXQpz$;%uog-cj}FRUoubR30xA_<1?yph zqIu9mwW4dF7U~pT4-L?$=qA_*&5CY;R%lanJ9NM%MRx)~m!iAD06mJ{43EL%irxaf z@Pwj&09#?3q6zdtzoLyG!1e`QrveHh(_n%D*$#qPwid9;)&_Rj?f^-)4sgoW1w*nO zhMlqE0!l{{_H zJ+I%^3VgPo$KOnx_|InbXj)yCK4PNZ?jHE9Gp3lQSH60+GOw(Y_XJlHDP6rF)JqF}Y+qM28peXS=a zho^6&2co*r)oe2l5+|XD&V6?0=#NTy`qhud)cuzow%PP>H{k7z7*?~1Yox?C@ zhFBbW(IOb-tsdY`SJgV6PFJ+K52vG3vyqtWE{Wdw^k&G9@09b@Klo5`|2^~swz&ES zt+rw6J@8)FJG1B-_;kmiu}Ta=(@d;vl6mK@(|Hc`T}S&b|euN0s9weC%fn=N+x0Slp8wAqQ7ephaP|G8=mF5&1*u=qI6QFjoh zmC#E+)Oh12*70-?8`9W~Q#y&YA4?;9Hsh2}-q`=tby)Do=ebpycx4NZ0nGRR`H5x` zLkp=EU46tVIEINtM>bEboo+7SY1ggOFaOSo6T=NAhe!rRVrP3==u5ZnC4cZbR;Bg@ z^B3Pu;{sZPX@HE7VPYh-wDNN2vAu;ny>S0OGdr`<8`w&WE(vRP0V6s8(Mq1)e&*Hb zvj_1Q+8Ub)d&J3(U%$%bcOoc*r!nN(jod1hnAQ;o^E7rmOmO@pi>Lps`F8HhEHLC+iOdTe!hYwr`g6*pow0x;oXmMyR+~~R>aN)qRC<=3w@Y~^WxbF zo0+GTSc%z04@c}O{lyBNr`?4)XJT5=6I3gR66VoLlU9F{uGxg^9e?ZCc*H*R1?Z_n zsJbMov@*Yfr+DZ$_KyNjv5*yQo3J~s8P9I(dbab4f zc&@ye6aQF#*Pz_eBREU0!#7CY0e&ZB5~Fqd7wGp$G^-&$mA*O(3G!nOkvB< zwe=t3USoJ48b8JlQMf0_KqSnj!{iBSB$CO9&Fu+la19fYIFVru%=nd}o)G+`ND{HT ztOF)bU;}=coVG!aww6c(f?zh`2#wyfiwv9bqFU@CF?)iVoVYL+*W=$Jh`5wwT6ooV zxQwoTw%iDQB8kN&wq>hugQl*>w$`+_ch?59_N{h|tG7IaaGF(B0e~$O?ciQW(QmMR} zq6oj)fROQ?$sTuDzSkdLZw7>p(@E+MFYv1I)vMvukrVM#@$RT1Zy*CfJ|LI@EvF72 zAD$d`N38aSFc9hk!WanW)FI;ylMU|BJZ}U8kv?lgF%ZqE!xp!VVPJ{R8nFz-`HYBX zAi)PLWgyW9Br&ke2P|h`1*Z;OJZmxoDLx}o8A$sc%&%l1ol{3o=%#e;m}2iL1~NEx z>;#>n?zmEKCIeZVI%*f)DUClrt8RF|dY3YQT(z<#~%4DB;xFaowcO9g^!^%Rs45f^-a&`G9o{lymBciNL8qcVwZr zf`Lk(II0*}?-R!c26&YZ(W@A$M)YWz8X46hTCC@Mos8;L+|m?ztJ#F)|8JAhUm_ncS@R2-|pXh*XL#{XfD?vbF#K