From 67d8eb7e56ed3e9feffca3d66b0f31bcfe215259 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 17 Feb 2026 14:18:59 +0000 Subject: [PATCH] Autosave: 20260217-141859 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5552 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1557 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1497 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 4809 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1061 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 11342 bytes core/admin.py | 17 +- core/migrations/0001_initial.py | 61 +++ ...ntact_number_bloodbank_is_24_7_and_more.py | 38 ++ ..._citizenship_no_donor_district_and_more.py | 28 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3873 bytes ...bloodbank_is_24_7_and_more.cpython-311.pyc | Bin 0 -> 1472 bytes ...no_donor_district_and_more.cpython-311.pyc | Bin 0 -> 1207 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 63 ++- core/templates/base.html | 283 +++++++++- core/templates/core/blood_bank_list.html | 91 ++++ core/templates/core/blood_request_list.html | 61 +++ core/templates/core/donor_list.html | 103 ++++ core/templates/core/index.html | 493 +++++++++++++----- core/templates/core/login.html | 60 +++ core/templates/core/vaccination_info.html | 57 ++ core/urls.py | 9 +- core/views.py | 177 ++++++- populate_data.py | 96 ++++ 30 files changed, 1473 insertions(+), 164 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_bloodbank_contact_number_bloodbank_is_24_7_and_more.py create mode 100644 core/migrations/0003_donor_citizenship_no_donor_district_and_more.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_bloodbank_contact_number_bloodbank_is_24_7_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_donor_citizenship_no_donor_district_and_more.cpython-311.pyc create mode 100644 core/templates/core/blood_bank_list.html create mode 100644 core/templates/core/blood_request_list.html create mode 100644 core/templates/core/donor_list.html create mode 100644 core/templates/core/login.html create mode 100644 core/templates/core/vaccination_info.html create mode 100644 populate_data.py diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..abb9e5eb6c9d03b4531aff9490f521422dad24c9 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}ycJPnpO)1pp}%1X2J1 delta 19 ZcmbQwIG>SwIWI340}xbw%b&y+NCMIWI340}ycJPua-5R1^Ry+NCMIWI340}xbw%iqYoR1^R_83p11 diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..01d0673895f6acb24dcd8b334a2306d8f4b91664 100644 GIT binary patch delta 20 acmbQrGnI#XIWI340}ycJPua-L#RdQ@=L7Hn delta 20 acmbQrGnI#XIWI340}xbw%iqY&#RdQ}b_B!# diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09df194d2dbcad4868349c9177db4b15571..dc8fc903995c9ecbc00d874a3389cafbefa00b3e 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}ycJPua*lhY0{Lw*-^` delta 20 acmZ3^x}24JIWI340}xbw%iqX7hY0{RMg?d9 diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b111269bd81aac528770a53e2f849291524d56..8e9fc3df29cf3bee78ed0cd65539b489948d5f90 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}ycJPnpO)2>>X`1WW(` delta 19 ZcmbQsIG2%oIWI340}xbw%b&>mG1t0(b diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..c16c35128158a25c93aba68b21795da2060aaaf5 100644 GIT binary patch literal 1497 zcmbVMJx|*}7{2pINSuVv@*%!dhPHSpX*zVODiu}jP{`1V#fxQpM=;pFaJJjBW#9)e zRHDBi72?l;lp(qasS`t`AefkXuR|h8s8sdN_uRd{_nv#d?4QM=fn@v5zIzP?pPOnK9SLs6W7%m5jN6W;BTL8JYPDu-e2z zcSzuc7vQz23jG}m85f0BpE2@@?j7+X>?&tTO=NxMIQSc($`QmuKv*}Y);d#l; zixQ3%4teJV3693!jF-MLz8lpXmzG?{X(^4^N^PI# zz#srkj%Yzbz1Pnt-q+V!!t`LI;1m>M6IGamzhqkICO&%`Bo z2LQSeXxvT5v-%qJj!U3bG4o=W>^NbSt+*_VxwpyT!xkA?PSlUME(H$12M%Aq$Z}eh z^(2eOSO)mBt&w$UIQPBzDuE@9&u;8I1(bWh(v%4o_`IKvA~yZ|g^VCjb+dUIwO sSjxas2A0L1evc)0hG(02wyj{i+(v_NxY3+^atRyP0KhUgsGsKK51*h(44TX@K?*b( zZ?Pt(n;80F)6nZ2$lO diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4873bc56e3763e4ed09960c6e3f34140e1..1c28907cc10eda4b03f2e2176ccbf7014af5f787 100644 GIT binary patch delta 20 acmeBS>0#ks&dbZi00bQQQ#NulG64W8TLZxW delta 20 acmeBS>0#ks&dbZi00dRv@;7obG64WD>I9Vl diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..10556ae831db2cb0f5a23c3a72b9661fea2d4021 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}ycJPua-*fe8RS*9DLO delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..33dad9448a10f944ff5bd11dbe80e5e277aec27c 100644 GIT binary patch literal 4809 zcmcJTOKj6x8prLtA5PM|dg)Lu1zI3eN(Pz>3}P6d4~A(dqtXJ6W@NcJrcH6|a_qpR znnf0O!Qw8uK)Og*S3cODv0NkL0O(OJ0`oFgF?E z{edAqkzMt59)9g*n78ofTqVD)@`EaHfGS|Cf}jc=pbC=kT_zXV!lrYq6{spilvGHC zv`ST6S7fo=?$*8q+L=$6JU9)JDY1kpd6r>1|6ogA4 z$GLip?ddUQE8^{GFm`Wo*SHh5rf)~HnQ(b1=~DFVQKVcWN!mT7TrWx5R%Ld2g1Ng# zlXbP^A?ZDy?*A3-d}C`49oW|Z$^5{SenYbGy7gQBNkvv@E|l|p@mwFJL3q?oj?qv% zd1I7@JIOJM>xhCoqZD?QlN_U*lk{E(ajcsjqqqiJ1k4-Oid2Q~c}bL)wUsS=Gv9b< z5^h$oyrNXfqH2X_1Z|}%$fVY-BH}}#CTUy$!FF&ITln73=X_3Uq_SMmR4Y!za-}Lr z{F)?SLq54CNtS;}668l)==hw69)TPE7R(!#egn7Zt@D`i+GE(MwSo)sBUyPWm%Cd9 zWH?;h^`EYQ`HA^EvkG_T`WZGHBvxcWe$r0oyfA*DDq7JcNl^&DOqJT26|JazM*+U{siO2y#ZHI5oXxK& zRWV;%s>xa{FMcnUYnnpyPZjz|T?2pQ%L*0q4o=RlJ+p#5uWFR%*JJk5pKWIkLu2ai zz|@&ms{ch!Pb|alrDh(@JIVJ2bKok{-Y+?|EL+@QDlpobe7rHLOGObH6mJJNs-|_z@&d|1wd&vmVz($KePTdCt4C(YFHhVX7sPfZ)CX)`rlpJ^qIK7V2+ zjyA^MMfJp_k(e|Sll4FC6zhq+k;t2gJQf~DEj00-{ovE*ALxliBe7^E7NM^1#74mE zJJERjKKUV|FD&YPC8Muo_Lb_lS}>kzlN)S!bZ*q(Mon(CKGoumVBwKhg@&ec1%oS? zTmg#HCpRvb>61{HE*R;8nJ(0et<(sPeWW4kse+Lzn5hDcJUg;+&&-ZAQ}2e~6Foa) zWM|CmOntUBkbBv04&)lzyMjJ&%^0|54qVfH{hjjW-S;_tplA#f&4D7851x5BZ4RDk z4!u}rN>KEY&}P^bo}93IP&@8`8`;y7E8vQW z)ox(jjP4s&clwJEZZqZz&Q4%WcjivwdqQu9^g$5Ik|Z!S1)CdDIVV1@iK>?K<~&wt zV(!-bt%>VJNKx3>WkG_{z{1?kso8nB(`8ZCuw?em+-*<=W)%t%geIU*ii4*qG&lr` z;dBe*9xZ~&wL=ER6+4p9qnH{3V+F34wF+RmA2RcBbmIg-F~H<0FA&lbQILFgL>Y#} z*CNUcI3368IW#uIFtFM~ zq~GBq!5TWd{LBiiDC$~86C_}*B5Oh!hF+^KiIn~kpYWmB3(m4)6jriAMdF|~(8g;F zi98R7;WkXmRD=S;3z`j6I)$z5@bo5T(O}e985d7|{lL?Xsn2dln9MLT=|n@-)8j^Z z+)R%nle#?3n!lgXQ$-_HG*iXhNZrlO__xm=n(=QN$D8tp6+M36h~GEk_v<(JCvBH) zdbVI>3ud+eT!Uduo0;LpgU!F{naf7zvYEMDzuk%*d4A7~9ciSR5A@hoBX-q{U9C^I zk|P`aW^$xi(36*p%$I0s#_Kew7a+yZ)dcfNcGyXkT5Wcd2&QF!+# z0xpG*_=$fr;35!yW_Wi<2a2GpCuE&>6}O;$0ma-3q}agWLn>w4#UiIhl2jV7qzIC4l>M6F-I^Io24~<9Q>VH{*GLNaxh_ zSWllb(&x!(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..bd06905308ed68914a6ba1c8f1c9b8d0a955c288 100644 GIT binary patch literal 1061 zcmcgqy>HV%6h9}=-wFKys#YMn5)}1Nr7kT3K_Vf6!~&Cr6uG%0HMM=^Y`2i9W5*0g zFm~cY@W-4b50zJ@Zjrim;?8a)K$$t)&-Z@6cklh~-FhrrTxyWkT&7J;a&0cNKrOO3msz4VS)R*Wrw+OCFEg?{ zm)v}bIxFXD8y&5L13%q6mkmN4tAsrk(b5UoD2NA#0X-^RIcHf~J8e!!L6TBlyAEM7 z&N>wuz2VXhe7P80gDGg{Dzf?>sK;jKcZu!s*Fp$ z`j5@JI4%_~RgCSK09;zL>Da7fB$(SWl?tgONMGHIv7yRK$5l@24*{5~`|+aFDqZr{ zk4J1H<6*+p0hhYkds1oRh6K2&jHQe!Qf00(Ryj&nu9R(*jfs=*=t4%I%Pv;E#My2Z zrx~X2=`c$f$489sCkOtJ;vwUbmL)e1K3rN4B1W>1KIE%%u{w?9v9!~srfFyBw)p#< z0@8YosSNzj)av7r-85vTTQkZj? za+#x;C&tMHrZYydq_77wXmY#+Y0+f7#Zr)1lJSxe%E`#jO})iX1TqgKmzS8E>Zi$i zi#sJNF)uw|ue2zqxQH1jd5g6yGqt?9h;?!kQvf#~Py}Q`u@}SSyG)Wo4;aKRprXln U%whr`n3?#Q8n{8QhzF<~0IcINr~m)} diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..bbc52d0d1b272d4afb40f5fdfe624357af388b37 100644 GIT binary patch literal 11342 zcmeG?ZEO@*lHK#!o)5P@W^BU@W{mNgS-=JYCV+t$+h81G6ClaOfJbBZU2{?^cPn*Uee$R!OGqnz@NZUJPEmec z)$8%h^mv?boBMIn?Q^^4ebjqhU9YNMRdxT9+wEYW{PWFw(O)$%%pb6^T1@%M^Dm)t zpAi^=jWNUeFFVXa+Y~d!&BNxnW!S=Ezd2@&+lFm%`>;LE4Rf^5603?kh8=O|u#>i} zF<0C@?51^FtUAsQ^H8@7T&yNuJ6s$0413~r!*z6=jcpj-AXI(840{C!zB1tsY@mMk`oQ+&hMMO!fqOIfM#I-RC5|}R>{F>qac@8E6 zzu75^gv;d1)j~aON;8wNZ=XZY7lqy_>pIxxG+P1NX24$EYbI?KOq0&?wV@BFGt59r zX)*K`s7aSmXQb6I=Z97@8Rr^Xlh!i2icex&|4DGxBv3zP7fc3P3j1N`1#G>f?Z&%T z#uChF`&y2F4wQXSpbjaR;?kBhhc%E@%iuV@#~&77d4^cT1t4hCEb*{(MYEHz5Dh0p z%`Ae*n#Yo&W(`Z>#9qxJUMEtpO0&em(jI`x1j4WcBT(O~v1c`l0BwZHgvN$7c1)~- zwF9f=yImbulJQ7KYBZIQQXP?7k+GDNBpo-CAS{gdZvZmP6RtYb{nW|d>6*37O22d}&TXo5Tc&qqZP!!Ib%&eTFw5R; zRJctlw`sOp;WmF}`IP(hhDZJdK?xpKgNKzsmm28$jr7&6-&_9OCBN~u(m$;B4=cwm zsK+iSfeZgJGOCVTmdCHjiKH@~R7NJ$kqMcI%7~~0M1>PG-C3^c7rl1|{#Lqod#?6w z`d<38^Pj#we|=%k!<5pxUv1s5xH?r=r^0n+x}P{*)7L-TpE>;;9)}q#2s1Qn@K2R9 z4ZZi7G;U;s{GyC0d1+dsvo*|`$z)wMwJp!!9jNiL_^s|BH) zD+po%0V;yoD3nvC7noxyn`4&T#Wlgem>*foD7K_6?`@Iz5-cWdG2*a{R9hSuY{q+> zV-nS+95O!X6f4yg=cehAkY=Oo=fI^e3Y-E(sT$NQXNJz52Xku?KnFA~1%^5ijz=_Z zA}op^wnETE+F&uV9e`#*>7L}N5L1)ienpDMG|OeM=|P8Pi$|m@Nr9kFkXD?)Ma9sK za4afluCZ7ooQMb^dL#3AL?U)X!+jvQEd(hGT0uW`+fIIpohA21+C)UB+D4k8ra34T zAyg=`2Rh*3WyD1Q876D5{@`b`^-K0GvVF@6-#pj0VE@u3^G6i^h{_+Cwq%|B$45Ro z^5L;N$8wCVYJ0Z9r#5U~ZrHihuycM`X?R&}czL?Na_>srmiflTez~qssq0hg`lfrc ze4Wg1S*h{PjL%9+%{H}Wn_RPPrD4mQO=)OT8`|WWwr`*E%?jV5@-5Sr6=&^Co9x>; ze`7(KPbkhKs`H3!IYL^1c!RniTk!w+Q2_T1CrA0o078S9`6968LK8F%k|2!2o}v;` zwg*|#0d)~IG@vupsUPDyS6_mD+)B|0Aj7O!9McEh8~R`nF4eX7$ZTYPH? zFX*{veLcTeN^q%`8%cj*9e)XIK|#lX;6f?W5R-(qHebNLl-U$uWQh(7Wyj_ZYM()~ z1+!qOsD0K!sv~qqCOuTANMt-JN)bZUiYh>mBRhahf*y^Iz7uM2RN=uI-GDNr0Qxle(k#nEzSY|6Qg?3Xw_#o0#V{Ue|5MecwHUcO)qoObq>Ig>_? z2_B*Dfn~~-b_p9cu1;j8+-bMqxkkA`2G)7r%6sB{RByb)+zU`WRV|^nlrQP(v>T&O zp#h^J<7z->V;A71ZNf%j(_fm3G^ZWV<1_R)1^)+(f%*-r_bBHIth-sl<0@aS*00u# zJ18_guut(4`W^WKPU@C4zs5lgOzt>Kvkd{rCj`!huSwxEshAiE^oGSNqscH40+Cx2 z5fY6g#v<*Sa};v}p>dK-O=#eJ#*&bLfb@c9#;DC4ON>8c$;)s{aCqxh2ScIgSTZ4n zqY3fZvE#ha`ND$+ed*^l0E~ywIp!fd_z)5m0vy?4xIfg{TP1$fcU)I293K_JMf{Hv500tzn=8MPzjCX1hm&9ZxC@&@G{Io?Uzjp{Nvi+*2^9J zc{+b2f#g+K`F}*unIb*&uRj`@A6k6{RQL@7CTEffw-#8RT>UTwvr325dAM-79cA;VzO zFqq5_t}c|HTAg1vKNm7~ruN;MX>?S?=gd2h-#NNsAn9Yt_{7o4#&UsP9eEojh!X%Z zOpdYm9VNiV)Yj#!jGMnRG&`y`wJWan1<#jT6xS<{_o_YT6xX?|tNPB+AI+@WpKS^N z239+=dtOrabYt~6o9#WJ_P&AjH`$!ousl^Ag7gM0noCMb;aEt(jG?IUVJa7)d|)YR zPJNg@wdTDM9vh1$sBC~K8H2nfq##KMR?@5|QnA==P{_@zNMKDux^R`+4FQnJD1gCd zsLs!Ddn-#>6O81g%z;uSFh%1F`|d=mLZ5=11I&jeauI$scD!^a$O!bUzXd3`&(QMIcEmg=h*_&lW@>XMBr>HNi&Be6sI6X$J}kI+>b1If|1ZBNvXvG~4B9 z3_>8txq(b+*2}RZ*lrFCcvMOW5v>YRZ{xH|Q)Z+GSFnglB595{!?9GPkB}rG)!5BJ z{sMM#^fp14MzfA3AuR`azf@c^N1^6AetKxAH+1ss&>LsY5p@1Eb0T?D&qUPFXi9TJ zqM6(d(Wlm`^~UPaq326Nc(~BaNeE6DlEh_r%E}Nvf}ZfOrYIWzB*ryXAgCkcIsy?V z*z*#r)vQVym@1uKJ04GwTat)p5QKAvLSs7`LQ=2~P{bOrMvy`DY`nMQe#a*rbGsHi zif5nd*_U}W>-FEea6j}(Xl@ufz57(}zRX~jufOxo$M1gh?rcioTUEX_(_f+MsoQhs z(z3g0$=#&51FAcaIgzz{atv#IIa}LsfAc4s=MT?pR%#EZwFjncS-Tg9df5Ef!ciPM zuGSu(wmq%iG~0PMb}yD0dSd5ujN5vGo$1$qb0$aC0K2kbHm_{i{jk;DCB?;P-v<*>mdIOUmgH z_4J6+98#M@Gu`(FW(J-#x9OFv%eU+bEJ66%dJr#HKye*XU58|PeY?VMghv6YN@2;I zez~=u&N-#JPRXlR&WuyO{r20Ojj3u}=KM>XUvBQji}Nd7pUU;gT;Ee~v+4~ldv`B+ zcQ10Xcemp0R=wTJ-hn0Wz}JW5w*IL!OW}QaLmT0 z2kzy@9ZQWnl*V0Zm z+^{ug2UGe-G}r%$0BVg+s5Lrs4rXghuC~f;%P{~leYtvu-!L<%R<~qMLV|6k_WgG< z@2vO&4~{JRI+lDLUysYa4#oGT>U(q9cX7#gQSptaz7d&gTnX-!+mAkOP}=*y?ooCP zDZw*p@XWMTu5MMhp8%8Uw$5#x+cURS^|WR;ZJ+ndH_v<2O*^vFPz|`X`5*?GsVQ3PJU&#>w;O^I92!=x? zJ{dU%V+QU1-dK*tOyoE&+6!P!h~zIG=xgJ+X`FTvK?{O@0ERoGS4v}y091^2W&P;Q ziLXu|w7ndS2;?=G_$Ltd5lkyaaGMvZAG5!;$sH#%I;B67NOJ#AqY5LfJXH|KU78FF1$b^|96?tG?mO=o@yawOy5b!@j(4*vF!8clT=8(Q!8(VH*G+N;Vrafkh~6e#Se<;M?K=CpQ@W73Z zPyP+qudsva1wJ$Ag{}{twJVap2ZVd@FZKa|*PFZ#-p(%bZA*Nc!Ut78xXkZe;`c7V zTjOq(@6Pl;;XDwlm`#-VwmkC>E&}s=RA-ND>7mx6GV`y%J$?-Hfvu1-plmH9j3`@8 z71(MX)T}gQpWIl&PV6b+rG-YuCA_3&D9^?@Ah!Y=d7X`gmB>E;9@-c2007{j%d5IJ zFT0wTT+NEBMRm1g`krw7jJKR?os0JGdH;tw6e_ZvV6lD-*VYksTzgFsSopjI?pOR4 z>_wD9FoQ#b$s9{DnIl;9ng3RU3b2B$h+~{Vv-S20*?Lys(A!B^1$gVH*Nv~Qg(|^O z@fEXkkc`1hA^?B`4Rc!LV+6E@>aI60LrrrOvtN^&sK~6QA~5L{O6|fA^Aq z_t!UN|8B+qmg;|N*?(!te@XF&RDTHUAqJ=bAVB39&OJS%+WoWFm+S%A9$0B=p4%_O zH&88Ii>b#W>ap`m%X#@PE+|_sC`}jDri;_o>6pU#WX|`bX-mHGRR22Tz+&6u{qn(6 zigQ494#<`P-8E>^Oz_nhHvx$s{PIPs5w3<4gM3Z$Xni!YJ#fPP*9zNtQjNgNU# zZO2a|^%wUj;Pe|9ZDR$Tc3fH1-}|Et)vAq1#DSfzd}m6E#zZ}XWs4_;2sALYrdvuL zYaRsD``ClEmk{7L0DA5S)tA~rs?2mxbWf@U2buxE+YDGZ6^k4tzlJ902qV4@5Y94| z%`#OP`j=(+4E@V8yW~n&mN_i1e`T2gxzd$oT4dvuWtwHt9*MnW29u2BN3 N9qg-sQyEeb`)_F7W+?yw literal 1364 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 Z{~G2k&1`_vV#Tg?4g6G&{l9o)-ru0maO?m8 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0003_donor_citizenship_no_donor_district_and_more.cpython-311.pyc b/core/migrations/__pycache__/0003_donor_citizenship_no_donor_district_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ff597ff6b15a800d408bdd3e4f46d39d44c565 GIT binary patch literal 1207 zcmah{zi-n(6h8lmW4jF$tI(mS&_WSenyQTi5)~34H5Je?gVArELiq;JcWis+0|K8KfCW zjOBqQAdu=XPLunyv$J!!;xR@lcCdyW7DToa;UM-al>fEhhIp=s?_oP2*cXu*!UD#V zOO6}4?`aU$+y)NV%l$bhBd;WxiU)kq274WQG^j?kL=9rkgC#R<2M%nX!kn;~RhN1s z(TN*I+;yVFcxFd6A9BU}MDWQ;me5r@_9C7GoD4xZZzy*mjx6RSeibHH@@AsrlosQ} z#84)QJqrFX#;;@B6R89uv_S(x1IMKy7Z)he9}%)BO5m!1#*>=OQ=AMxX3V2@&_gC` z(Eg?RiVk5bIwpl0^JyWj#6c7n=sI=ci1ET(#@E7z?a+ddx$x&Q7C`WMoN9+pOV^(q zXmFzROyeEbAXRFF6aE0Raq@IEWGqWvMIO~Qo_9@TT>ogc_3_TwMCZz6$C}!_)3&B| zM!!$(7F*WRp0(7rmbzKhFb@!zBVo=&jh{q4*qv`#r9G?Ewo3nwndn&4BGdE^ZCS-V ztJt=RXCuZ&EN$bdc=*l1fmZTrVvxEWRM`xvr0qzX&^z)Cu`S&@3Er{3(Cg_#ehZ+u o^5H8mT}6^4kU`3~(B1QISGy)@U3A`Tn(dL>2V&vqg4HzdZ(rLvfdBvi literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8090679ee4c9ffd863c8f7abb0bb73a5db..c33b24dfd75d7bfd9faa8a451d68859e0a07cb32 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}ycJPnpO)7XT_?1Z@BS delta 19 ZcmZ3%xPp;;IWI340}xbw%b& - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}RaktaPulse Dashboard{% endblock %} + + + + + + + + + + + + - - {% block content %}{% endblock %} - +
+ + + + +
+ +
+
+ + +
+ +
+
+ + {{ current_time|date:"D, M d, Y" }} +
+ {% if user.is_authenticated %} +
+ {{ user.username }} + Logout +
+ {% else %} +
+ Login + Register +
+ {% endif %} +
+
+ +
+ {% block content %}{% endblock %} +
+
+
+ + + + + + + {% block scripts %}{% endblock %} + diff --git a/core/templates/core/blood_bank_list.html b/core/templates/core/blood_bank_list.html new file mode 100644 index 0000000..dff5f0f --- /dev/null +++ b/core/templates/core/blood_bank_list.html @@ -0,0 +1,91 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Blood Banks - RaktaPulse{% endblock %} + +{% block content %} +
+
+
+

Blood Banks

+

Official blood repositories and their current inventory levels.

+
+
+ +
+ {% for bank in banks %} +
+
+
+

{{ bank.name }}

+ {% if bank.is_24_7 %} + 24/7 Available + {% endif %} +
+

{{ bank.location }}

+

{{ bank.contact_number }}

+ +
Inventory Levels (Units)
+
+
+
+
A+
+
{{ bank.stock_a_plus }}
+
+
+
+
+
A-
+
{{ bank.stock_a_minus }}
+
+
+
+
+
B+
+
{{ bank.stock_b_plus }}
+
+
+
+
+
B-
+
{{ bank.stock_b_minus }}
+
+
+
+
+
O+
+
{{ bank.stock_o_plus }}
+
+
+
+
+
O-
+
{{ bank.stock_o_minus }}
+
+
+
+
+
AB+
+
{{ bank.stock_ab_plus }}
+
+
+
+
+
AB-
+
{{ bank.stock_ab_minus }}
+
+
+
+ + +
+
+ {% empty %} +
+ +

No blood banks registered in the system.

+
+ {% endfor %} +
+
+{% endblock %} diff --git a/core/templates/core/blood_request_list.html b/core/templates/core/blood_request_list.html new file mode 100644 index 0000000..f4ff8fd --- /dev/null +++ b/core/templates/core/blood_request_list.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Blood Requests - RaktaPulse{% endblock %} + +{% block content %} + + +
+
+
+
+

Blood Requests

+

Current active requirements for blood in various hospitals.

+
+ +
+
+ +
+
+ {% for req in requests %} +
+
+
+ {{ req.urgency }} +
+ {{ req.blood_group }} +
+
+
{{ req.patient_name }}
+

{{ req.hospital }}

+
+
+ {{ req.created_at|timesince }} ago + Help Now +
+
+
+
+ {% empty %} +
+ +

No active blood requests at the moment.

+
+ {% endfor %} +
+
+
+{% endblock %} diff --git a/core/templates/core/donor_list.html b/core/templates/core/donor_list.html new file mode 100644 index 0000000..c91d16f --- /dev/null +++ b/core/templates/core/donor_list.html @@ -0,0 +1,103 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Donors - RaktaPulse{% endblock %} + +{% block content %} +
+
+
+

Blood Donors

+

Find and connect with blood donors in your community.

+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ Reset +
+ + +
+ +
+ {% for donor in donors %} +
+
+
+ {{ donor.blood_group }} +
+
+
+ {{ donor.name }} + {% if donor.is_verified %} + + {% endif %} + {% if donor.distance and donor.distance < 1000 %} + + {{ donor.distance|floatformat:1 }} km away + + {% endif %} +
+

{{ donor.location }}, {{ donor.district }}

+
+
+
+
+ + {% if donor.is_available %}Available{% else %}Unavailable{% endif %} + +

Phone: {{ donor.phone }}

+
+ +
+
+ {% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..054a0b8 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,382 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} +{% block title %}RaktaPulse Dashboard - Lifeline of the Community{% endblock %} {% block head %} - - - {% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ +
+
+

RaktaPulse Community Dashboard

+

Overview of blood donation activity and requirements in your area.

+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+
+
+
+ +
+
{{ stats.total_donors }}
+
Registered Donors
+
+
+
+
+
+ +
+
{{ stats.active_requests }}
+
Active Requests
+
+
+
+
+
+ +
+
{{ stats.total_stock }} Units
+
Bank Inventory
+
+
+
+
+
+ +
+
{{ stats.vaccinated_percentage }}%
+
Vaccinated Donors
+
+
+
+ +
+ +
+
+
+

Available Donors

+
+ + + +
+
+ + + +
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ {% for donor in donors %} +
+
+
{{ donor.blood_group }}
+
+
+ {{ donor.name }} + {% if donor.is_verified %} + + {% endif %} + {% if donor.distance and donor.distance < 1000 %} + + {{ donor.distance|floatformat:1 }} km + + {% endif %} +
+

{{ donor.location }}, {{ donor.district }}

+
+
+
+
+ + {% if donor.is_available %}Available{% else %}Unavailable{% endif %} + +

Last Donated: {{ donor.last_donation_date|default:"Never" }}

+
+ +
+
+ {% empty %} +
+ +

No donors match your search criteria.

+
+ {% endfor %} +
+
+ + +
+
+
+

Vaccination & Eligibility

+

We prioritize donors who are fully vaccinated to ensure maximum safety for recipients.

+
+
+ Community Immunity Level + {{ stats.vaccinated_percentage }}% +
+
+
+
+
+ +
+
+ +
+
+
+
+ + +
+ +
+
+ Urgent Requests + HOT +
+
+ {% for req in blood_requests %} +
+
+ {{ req.urgency }} + {{ req.blood_group }} +
+
{{ req.patient_name }}
+

{{ req.hospital }}

+
+ {{ req.created_at|timesince }} ago + Help Now → +
+
+ {% empty %} +

No active requests found.

+ {% endfor %} +
+
+ + +
+
Blood Bank Inventory
+
+ {% for bank in blood_banks %} +
+
+ {{ bank.name }} + 24/7 Available +
+
+ A+ : {{ bank.stock_a_plus }} + B+ : {{ bank.stock_b_plus }} + O+ : {{ bank.stock_o_plus }} + AB+ : {{ bank.stock_ab_plus }} +
+
+ {% empty %} +

No blood banks registered.

+ {% endfor %} +
+ Manage Banks +
+ + +
+
Lifesaver Tip
+

Donating once can save up to three lives. Make sure to stay hydrated and rest before your appointment!

+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..b95e6de --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,60 @@ +{% extends 'base.html' %} + +{% block title %}Login - RaktaPulse{% endblock %} + +{% block content %} +
+
+
+
+ +

Welcome to RaktaPulse

+

Please login to your account

+
+ +
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.errors %} +
{{ field.errors.0 }}
+ {% endif %} +
+ {% endfor %} + + +
+ +
+

Don't have an account? Register here

+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/vaccination_info.html b/core/templates/core/vaccination_info.html new file mode 100644 index 0000000..7b29b1f --- /dev/null +++ b/core/templates/core/vaccination_info.html @@ -0,0 +1,57 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Vaccination Status - RaktaPulse{% endblock %} + +{% block content %} +
+
+
+

Vaccination Overview

+

Monitoring community immunity and donor eligibility.

+
+
+ +
+
+
+

Why Vaccination Matters?

+

Ensuring our donors are vaccinated is crucial for the safety of both the donors and the recipients. Fully vaccinated individuals contribute to a safer blood supply chain.

+ +
+
Community Progress
+
+ Fully Vaccinated Donors + {{ stats.percentage }}% +
+
+
{{ stats.percentage }}%
+
+

{{ stats.vaccinated_count }} out of {{ stats.total_donors }} registered donors are fully vaccinated.

+
+ +
Eligibility Criteria
+
    +
  • Must be fully vaccinated for priority donation.
  • +
  • At least 14 days must have passed since the last dose.
  • +
  • Must be in good health on the day of donation.
  • +
+
+
+ +
+
+
Update Your Status
+

Are you a donor? Keep your vaccination records up to date to maintain your verified status.

+ +
+ +
+
Contact Support
+

Have questions about vaccination and donation? Our medical team is here to help.

+ Email Support +
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..93fa2ad 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,14 @@ from django.urls import path -from .views import home +from .views import home, login_view, logout_view, register_view, donor_list, blood_request_list, blood_bank_list, vaccination_info urlpatterns = [ path("", home, name="home"), + path("login/", login_view, name="login"), + path("logout/", logout_view, name="logout"), + path("register/", register_view, name="register"), + path("donors/", donor_list, name="donor_list"), + path("requests/", blood_request_list, name="blood_request_list"), + path("banks/", blood_bank_list, name="blood_bank_list"), + path("vaccination/", vaccination_info, name="vaccination_info"), ] diff --git a/core/views.py b/core/views.py index c9aed12..fe13eae 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,172 @@ import os import platform - -from django import get_version as django_version -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.contrib.auth import login, logout, authenticate +from django.contrib.auth.forms import UserCreationForm, AuthenticationForm +from django.contrib import messages from django.utils import timezone +from .models import Donor, BloodRequest, BloodBank +import math +def haversine(lat1, lon1, lat2, lon2): + # Radius of the Earth in km + R = 6371.0 + + dlat = math.radians(lat2 - lat1) + dlon = math.radians(lon2 - lon1) + + a = math.sin(dlat / 2)**2 + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon / 2)**2 + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + + return R * c + +def login_view(request): + if request.method == "POST": + form = AuthenticationForm(request, data=request.POST) + if form.is_valid(): + username = form.cleaned_data.get('username') + password = form.cleaned_data.get('password') + user = authenticate(username=username, password=password) + if user is not None: + login(request, user) + return redirect("home") + else: + form = AuthenticationForm() + return render(request, "core/login.html", {"form": form}) + +def logout_view(request): + logout(request) + return redirect("home") + +def register_view(request): + if request.method == "POST": + form = UserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect("home") + else: + form = UserCreationForm() + return render(request, "core/register.html", {"form": form}) def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + """Render the RaktaPulse Dashboard experience.""" + query_blood = request.GET.get('blood_group', '') + query_location = request.GET.get('location', '') + user_lat = request.GET.get('lat') + user_lng = request.GET.get('lng') + + donors = Donor.objects.all() + if query_blood: + donors = donors.filter(blood_group=query_blood) + if query_location: + donors = donors.filter(location__icontains=query_location) + + donor_list_data = list(donors) + + if user_lat and user_lng: + try: + u_lat = float(user_lat) + u_lng = float(user_lng) + for d in donor_list_data: + if d.latitude and d.longitude: + d.distance = haversine(u_lat, u_lng, float(d.latitude), float(d.longitude)) + else: + d.distance = 999999 # Very far + donor_list_data.sort(key=lambda x: x.distance) + except ValueError: + donor_list_data.sort(key=lambda x: (-x.is_available, x.name)) + else: + donor_list_data.sort(key=lambda x: (-x.is_available, x.name)) + + blood_requests = BloodRequest.objects.filter(status='Active').order_by('-urgency', '-created_at') + blood_banks = BloodBank.objects.all() + + # Stats for Dashboard + stats = { + "total_donors": Donor.objects.count(), + "active_requests": BloodRequest.objects.filter(status='Active').count(), + "total_stock": sum([ + bb.stock_a_plus + bb.stock_a_minus + bb.stock_b_plus + bb.stock_b_minus + + bb.stock_o_plus + bb.stock_o_minus + bb.stock_ab_plus + bb.stock_ab_minus + for bb in blood_banks + ]), + "vaccinated_percentage": 0 + } + + total_d = stats["total_donors"] + if total_d > 0: + vaccinated_count = Donor.objects.filter(vaccination_status__icontains='Fully').count() + stats["vaccinated_percentage"] = int((vaccinated_count / total_d) * 100) context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "donors": donor_list_data[:8], + "blood_requests": blood_requests[:6], + "blood_banks": blood_banks, + "blood_groups": [g[0] for g in Donor.BLOOD_GROUPS], + "stats": stats, + "project_name": "RaktaPulse", + "current_time": timezone.now(), } return render(request, "core/index.html", context) + +def donor_list(request): + blood_group = request.GET.get('blood_group', '') + district = request.GET.get('district', '') + user_lat = request.GET.get('lat') + user_lng = request.GET.get('lng') + + donors = Donor.objects.all() + if blood_group: + donors = donors.filter(blood_group=blood_group) + if district: + donors = donors.filter(district__icontains=district) + + donor_list_data = list(donors) + + if user_lat and user_lng: + try: + u_lat = float(user_lat) + u_lng = float(user_lng) + for d in donor_list_data: + if d.latitude and d.longitude: + d.distance = haversine(u_lat, u_lng, float(d.latitude), float(d.longitude)) + else: + d.distance = 999999 + donor_list_data.sort(key=lambda x: x.distance) + except ValueError: + donor_list_data.sort(key=lambda x: (-x.is_verified, x.name)) + else: + donor_list_data.sort(key=lambda x: (-x.is_verified, x.name)) + + context = { + 'donors': donor_list_data, + 'blood_groups': [g[0] for g in Donor.BLOOD_GROUPS], + } + return render(request, 'core/donor_list.html', context) + +def blood_request_list(request): + requests = BloodRequest.objects.all().order_by('-created_at') + context = { + 'requests': requests, + } + return render(request, 'core/blood_request_list.html', context) + +def blood_bank_list(request): + banks = BloodBank.objects.all() + context = { + 'banks': banks, + } + return render(request, 'core/blood_bank_list.html', context) + +def vaccination_info(request): + stats = { + "total_donors": Donor.objects.count(), + "vaccinated_count": Donor.objects.filter(vaccination_status__icontains='Fully').count(), + } + if stats["total_donors"] > 0: + stats["percentage"] = int((stats["vaccinated_count"] / stats["total_donors"]) * 100) + else: + stats["percentage"] = 0 + + return render(request, 'core/vaccination_info.html', {'stats': stats}) diff --git a/populate_data.py b/populate_data.py new file mode 100644 index 0000000..2a18687 --- /dev/null +++ b/populate_data.py @@ -0,0 +1,96 @@ +import os +import django +import datetime +import random + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +from core.models import Donor, BloodRequest, BloodBank +from django.utils import timezone + +def run(): + # Clear existing data + Donor.objects.all().delete() + BloodRequest.objects.all().delete() + BloodBank.objects.all().delete() + + # Create Donors (Nepali Context) + donors_data = [ + ('Arjun Thapa', 'O+', 'Kathmandu', 'New Baneshwor', '9841000000', 'Fully Vaccinated', True), + ('Sita Shrestha', 'A-', 'Lalitpur', 'Patan Durbar Square', '9841111111', 'Fully Vaccinated', True), + ('Rajesh Hamal', 'B+', 'Bhaktapur', 'Suryabinayak', '9841222222', 'Partially Vaccinated', True), + ('Bipana Thapa', 'AB+', 'Kaski', 'Lakeside, Pokhara', '9841333333', 'Fully Vaccinated', False), + ('Nischal Basnet', 'O-', 'Rupandehi', 'Butwal', '9841444444', 'Not Vaccinated', False), + ('Swastima Khadka', 'A+', 'Chitwan', 'Bharatpur', '9841555555', 'Fully Vaccinated', True), + ] + for name, bg, dist, loc, ph, vac, ver in donors_data: + Donor.objects.create( + name=name, + blood_group=bg, + district=dist, + location=loc, + phone=ph, + is_available=True, + is_verified=ver, + citizenship_no=f"123-{random.randint(1000, 9999)}" if ver else None, + vaccination_status=vac, + last_vaccination_date=timezone.now().date() - datetime.timedelta(days=random.randint(30, 180)) + ) + + # Create Blood Requests (Nepali Context) + BloodRequest.objects.create( + patient_name='Ram Bahadur', + blood_group='O+', + location='Teaching Hospital, Maharajgunj', + urgency='CRITICAL', + hospital='Teaching Hospital', + contact_number='9800000001' + ) + BloodRequest.objects.create( + patient_name='Maya Devi', + blood_group='B+', + location='Bir Hospital, Kathmandu', + urgency='URGENT', + hospital='Bir Hospital', + contact_number='9800000002' + ) + BloodRequest.objects.create( + patient_name='Hari Prasad', + blood_group='AB-', + location='Patan Hospital', + urgency='NORMAL', + hospital='Patan Hospital', + contact_number='9800000003' + ) + + # Create Blood Bank (Nepali Context) + BloodBank.objects.create( + name='Nepal Red Cross Society', + location='Soalteemode, Kathmandu', + contact_number='01-4270650', + is_24_7=True, + stock_o_plus=150, + stock_o_minus=45, + stock_a_plus=120, + stock_a_minus=30, + stock_b_plus=90, + stock_b_minus=20, + stock_ab_plus=40, + stock_ab_minus=15 + ) + + BloodBank.objects.create( + name='Bhaktapur Blood Bank', + location='Dudhpati, Bhaktapur', + contact_number='01-6612266', + is_24_7=True, + stock_o_plus=60, + stock_a_plus=45, + stock_b_plus=30 + ) + + print("Sample data populated successfully.") + +if __name__ == "__main__": + run()