From 0f9878cadc02c6590db69738c07bad32720efef1 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 17 Feb 2026 16:22:35 +0000 Subject: [PATCH] Autosave: 20260217-162235 --- core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 2195 bytes core/__pycache__/models.cpython-311.pyc | Bin 6419 -> 8173 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1468 -> 1580 bytes core/__pycache__/views.cpython-311.pyc | Bin 16607 -> 18118 bytes core/forms.py | 27 +++++++ .../0007_bloodbank_total_capacity.py | 18 +++++ core/migrations/0008_userprofile.py | 28 +++++++ ...7_bloodbank_total_capacity.cpython-311.pyc | Bin 0 -> 849 bytes .../0008_userprofile.cpython-311.pyc | Bin 0 -> 1941 bytes core/models.py | 39 +++++++-- core/templates/base.html | 28 ++++--- core/templates/core/blood_bank_list.html | 26 +++++- core/templates/core/index.html | 4 +- core/templates/core/profile.html | 74 ++++++++++++++++++ core/urls.py | 3 +- core/views.py | 34 +++++++- reduce_capacity.py | 17 ++++ 17 files changed, 272 insertions(+), 26 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0007_bloodbank_total_capacity.py create mode 100644 core/migrations/0008_userprofile.py create mode 100644 core/migrations/__pycache__/0007_bloodbank_total_capacity.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0008_userprofile.cpython-311.pyc create mode 100644 core/templates/core/profile.html create mode 100644 reduce_capacity.py diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..684052f515f12d21d208e2a8ee132623bac3580d GIT binary patch literal 2195 zcmbVN%}*Og6rWx1u0Jp-)Nx{LN|Y)nSSfZ@DK`|URct;4AuUCfT$R=09boC&>&~u4 z+EWgd%Ap6OB87ubtwf37;6o1l2|cbQAFMr9>WP~XoH+HpSzKa1jMVY?=QlHN=6%fk zp8xFcj}U0@e%m&_l?eF<2c0IL3nxE;@P_C_7fezT3W9*LXo{skApmkfmrSW77vz#s zPy`~9NutX?6J4Rgda!fYZh(+|`1-97;#xt_3iZ$m>){2GjvV2pwBX4r7Ax5xNQ*XQ zM*_}@ULOu#GHb;!sTciXc7Fc3I{DT7;>(4iZ_G!Cj<=IM{JbHQ6a<|VM3Kagj;A`KLzRmkP< z0-jHmiyY~q9x#LhX%`~f$LM(DI-$;}hfc>HczfeHx9I3XO)7+S8Ddk;V%@Q2=BT4V z$e}8PT-Hj|lW9paOfRxxFxyf2RM^xyqFe;oK8xa|jTf!5!z}YHT%zVU%zlxMcp;VV zQB^OZswGRWniS-ys{T;bOgv3h8QzR1!y+|3WyPSTZZmvEUifSJ%9$=#s*V@Qp&Py& z+%WW2>ez3|31;kUJiBIY9p20}qr;8pNHaR}I@gv$GPrORj&bhvng!nw+UOzzULv-WF@Osq+(@p# zIk^VUS$!M7-gO<@n_s$A6A$E`3{!LwSonW+FnZo}eh!Ts1iNbo=UAT}0*-~x?p+D7 zL$koLVR<3bDr$~ll|8w#W|gVew`^LLuC6kxT494==LqjUEwTal@g!z#*z7|P`52~S zI2|mmSw@ip>7tikj)J=P5fTXeA%&1y8lxH;!rjUOHEGddSUOk=;nJJp@9YsQpfUSb zfcM_iKngiC;qnfgi9OtUy8W!4`Rk!OHj6zr*NDwEV{@&W*z{;?aa-M+tS`Awp1bi} zBc5xl4)?zN&P^>fQcKO$QZM32m&3n~A|GRj2$)BEqAQ%Xc$E#DA-7Nh zkHeCu=<8Z})$;S4^amMU8;#|RR&~}gywur#-BZp7{E{&JUU&{GA^y|&Oy<6JU&mQ! z0=7Xdea1e6E%-NL{{her2!hZe3Aekq$P>4_x5&7AU2jW$0+fTRfcJBZ^QRY!$uR0( Q1uU4yIDdN0A}=5R0uze(zyJUM literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index a179ffa2ac4f6823fa4ebd5b416fdaadab17ffa7..61b392a54f3eec05704d57ce51919587426c8286 100644 GIT binary patch literal 8173 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 aZDjsD&cZ0_6x+V1Ji6{f&+Qg;oc#@4i(r!g delta 2410 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 delta 3379 zcma)84NP0t6@K?&4A>YjKeoY!K)?nE2Zxd#53z3)L% zLW+|n+mb5FlG|qKL?^QR6c#!~aXWQe+a+5!Y1+ClEtA;WrnS;*NBDxg@jXovmTZCM0(h1Wc5ae6{f`#3af%3+59V6 zzm{)HsXexFVl^y}ws-F0|FQRt8P)+s?^P+w0xMPxU}VO%$Z)hjPL0eSMUM<=3S;Tm zYRA?LZ73E~G|kAwhD3BgVHVVv2~#F@b|N?6F)!ih^$)$??IVa;ZFn)64n5+MgZph?clEt=@H?-9`pge zKBo%&_t=V4Lpdd64Clfy(nx+xWlESSJ#kG}SY59^&@aXn%w!=n%0v+6t3fg>8ZMof zG0sd(iQNa%-7|39322U?2@J3|?Jz)6n&pnXBn&4UDwhA5es$%VwA61421ymorv>Ad zgW03mw6GW~&F7$F)Isz6usex8%nv!;e6GNiRy6J6?-p(EbdSJjF2U?C;|hoe{5{Pe zjaq3jEjcPL#u~MO#(S5>PJKrtT|_s%_ZISq%S%f60hgbY@pG<%q7|dLmmouzF-zhB zZk6+&xjIQRFLhH=$q&2z1)qVY+qhmyY4Yjmk)*`@{QK@U(stTYQuq+)m*j{&4DbA; z+v97;2B+}4;(V>_O71o1JFc1VL&AMF&{Eb0Z49m0$HwSbj4|0U{p4i(8y#=%o~hl6 zF;X9Rc94RgY{+$M47s~olff97#yd)aq>CRYdB*O?=%^1`_*HMH*eDu~#$xeAR99$Z zP+>78p+|cZM)`-{`s^Ms+<6Npddtca)f=m(h;U|~1J#twqVQ*so`sI!mBsiMy`|NC zAl~)?B&8Wollh&fIO{xHKVGz{=C|QkTlM%LQ{bX=UY{Gs|I}lK_%!b1v?y7|O>hzqL(@^-ce=*ce*mRXgdBu}2+tynAtVtFA>d}ho@T7As|Y6%blx8JkTd*TO`*3E6o!qe36(|qF)!!P0)E4B5@QYa1R}9PgJffEYrWIfV15ID;Wk3*0mJ`~2>HRi%;nW5MkF z0vNo=->cn8{HbuLL$)t6%0>mk>ey7XDFVb^Suo?1U5kDwvve(SlM6;WdQU z5lmD5_=aY3fxoaJ>id7y&7Dnw{J)~x(xTqSw>Pcclw)2caA0O#=c0tGW>{lPfm23Y zpI8{x7KC~PQT@mHcbdEryy1MR(W0GLZd|+tip|#<+)Bj7DZUGv2NT({PO&xn0BkXwo9(LN=?G|<2a3l}@MO;L?K!!K+K z?OLP-daz~Ocnh`5xv_BeA`59$>+M#fjIy`E`tK62YUzRVfPkBZC|XfhBEw?gL|pS=!lP0=JY)?J;CfihMog^>cd-G=I`@ZDM!h(Zf{QmeU{)`d&p^|2_ zPQYvhzz(8_;sm8Qz^N8!7-{G+qS|{zb%uv}vuGF4-f0%-)Od-!)-N^fY0^pKfe4G3 zXSp;}PFa#i%}VudpCq#Yzz$+4z!U`<#RDAZ8e+zTIU6yv;-4C-3 zd7tUG`o(|%bV3LI?lSUm|>oH5{nrBOk)OA9nLkRSh z2?N|AWU~wt)vGefMl7Q&i(-}w<*~FLQM#)35Qa)SPqKmyn5awA;Ujip_BS+BjvT-6 z-|&?AWxvdd(r52jR2E$LZ@JjWfj9G&5&qwgo*`{I46^}Wrv2K5TKk;H71dVvUIlb)t<0@_D6T=OevAAygi6O4 g13By+pu6Yq%IsjXLg&M_Gr4&CP)!{DXSP1~5A4z3+yDRo literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0008_userprofile.cpython-311.pyc b/core/migrations/__pycache__/0008_userprofile.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0e3a717c5c137e337e0d68d363c1bfd9b918ad GIT binary patch literal 1941 zcmZuyJ#5=X6y}daQ9q8QM2Tdjiku*5EC;fTF7?o+RV*p7k;F;u6sQ)K(w!wb6sa63 zC(cl0=+H4h3)EYS4sP0b@R*^4$BZ;Upu$ZBI(btNPnr6T6xAg5QGERF-FNTaz4z|) z`@}?ygZ9ghKWTr5IPPE830imr-rNQ7Glw|D>s*6}ub>NEu_5wIC+eYYxDoD34TTgVm(~?*Q`!ynbs7jflsU0}T?82%6}I z7YU|CA$Y<_+Kudh#TR3%>jIKJW_&z1grd8#9RXPI`VCldkCg~CU@dV1Yr1BA}K8`s^; zhnCxs-R%4RxB12yGzHnt(dg|UvykRc%OsfQ=jZ1?RhqhKqNZv*P;Apyb)}{D)Rty% z(fEA}le@%R*K|w;4XxFwuv9IEXhQAVrqUunyPD0FimV? z(ljls7-|<&v8kEb5tIR}9&YNe9MqcnSkbZ3wmVeT&6ZbohX{5{V@-|N9RhMbUR7((0I63tQw2C~2q<`=ybdAEcs4qo$$2p}{unpJ1H@ z$lt$Un=I~LETnY}>&UuOOjB9$h82az6a~&(U&nwGit@0p>Wr)?gw;PyTaVOUPi?|D z!aZytY_zrrJJfWta)0fna(}h(h#Mb!*v0~sg6NKND(1vQXO)8)!mA$>fZ9yZ8mDR;cwMJuR507q; zKe#ur9QSsy+%dbj+;8>`yI;nSaSIkFT*G0p&bQwuD3pqLZy2WUFqr>LhD} z)Ojag+Wy+jm-edrt4@CDAiw11mz?DCAeDCtDAe6T-AUdUq_R$K zcKc&DH@lbKzvSd<2f3P?t2xO!_~T5^|0=oD^LzG? Live Alerts
  • Vaccination
  • {% if user.is_authenticated %} +
  • My Profile
  • My Records
  • {% endif %}
  • Settings
  • @@ -218,35 +219,40 @@
    -
    +
    - -
    -
    - +
    +
    + Detect Location
    - - {{ current_time|date:"D, M d, Y" }} + + {{ current_time|date:"M d" }}
    {% if user.is_authenticated %}
    - {{ user.username }} - Logout + +
    + +
    + {{ user.username }} +
    + Logout
    {% else %} {% endif %}
    diff --git a/core/templates/core/blood_bank_list.html b/core/templates/core/blood_bank_list.html index d133653..646ce28 100644 --- a/core/templates/core/blood_bank_list.html +++ b/core/templates/core/blood_bank_list.html @@ -48,54 +48,78 @@

    -
    Inventory Levels (Units)
    +
    Inventory Levels (Max {{ bank.total_capacity }} units/type)
    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 }}
    +
    +
    +
    diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 1e0e15d..e0da796 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -133,8 +133,8 @@
    -
    {{ stats.total_stock }} Units
    -
    Bank Inventory
    +
    {{ stats.total_stock }} / {{ stats.total_capacity }}
    +
    Inventory vs Capacity
    diff --git a/core/templates/core/profile.html b/core/templates/core/profile.html new file mode 100644 index 0000000..4ecf840 --- /dev/null +++ b/core/templates/core/profile.html @@ -0,0 +1,74 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}User Profile - RaktaPulse{% endblock %} + +{% block content %} +
    +
    +
    +
    +
    +
    + +
    +
    +

    {{ user.username }}

    +

    Member since {{ user.date_joined|date:"M d, Y" }}

    +
    +
    + +
    + {% csrf_token %} +
    Account Information
    +
    +
    + + {{ u_form.username }} +
    +
    + + {{ u_form.email }} +
    +
    + + {{ u_form.first_name }} +
    +
    + + {{ u_form.last_name }} +
    +
    + +
    Profile Details
    +
    +
    + + {{ p_form.bio }} +
    Write a short bio about yourself.
    +
    +
    + + {{ p_form.blood_group }} +
    +
    + + {{ p_form.phone }} +
    +
    + + {{ p_form.location }} +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +{% endblock %} diff --git a/core/urls.py b/core/urls.py index f117f9c..5a87ab4 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,12 +1,13 @@ from django.urls import path -from .views import home, login_view, logout_view, register_view, donor_list, blood_request_list, blood_bank_list, vaccination_info, vaccination_dashboard, add_vaccination, live_map +from .views import home, login_view, logout_view, register_view, donor_list, blood_request_list, blood_bank_list, vaccination_info, vaccination_dashboard, add_vaccination, live_map, request_blood, profile urlpatterns = [ path("", home, name="home"), path("login/", login_view, name="login"), path("logout/", logout_view, name="logout"), path("register/", register_view, name="register"), + path("profile/", profile, name="profile"), 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"), diff --git a/core/views.py b/core/views.py index 0711e80..ea196c1 100644 --- a/core/views.py +++ b/core/views.py @@ -6,9 +6,34 @@ from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.contrib.auth.decorators import login_required from django.contrib import messages from django.utils import timezone -from .models import Donor, BloodRequest, BloodBank, VaccineRecord +from .models import Donor, BloodRequest, BloodBank, VaccineRecord, UserProfile, BLOOD_GROUPS +from .forms import UserUpdateForm, ProfileUpdateForm import math +@login_required +def profile(request): + # Ensure user has a profile + profile, created = UserProfile.objects.get_or_create(user=request.user) + + if request.method == 'POST': + u_form = UserUpdateForm(request.POST, instance=request.user) + p_form = ProfileUpdateForm(request.POST, instance=profile) + if u_form.is_valid() and p_form.is_valid(): + u_form.save() + p_form.save() + messages.success(request, f'Your account has been updated!') + return redirect('profile') + else: + u_form = UserUpdateForm(instance=request.user) + p_form = ProfileUpdateForm(instance=profile) + + context = { + 'u_form': u_form, + 'p_form': p_form + } + + return render(request, 'core/profile.html', context) + def haversine(lat1, lon1, lat2, lon2): # Radius of the Earth in km R = 6371.0 @@ -92,6 +117,7 @@ def home(request): bb.stock_o_plus + bb.stock_o_minus + bb.stock_ab_plus + bb.stock_ab_minus for bb in blood_banks ]), + "total_capacity": sum([bb.total_capacity * 8 for bb in blood_banks]), # 8 blood types "vaccinated_percentage": 0 } @@ -104,7 +130,7 @@ def home(request): "donors": donor_list_data[:8], "blood_requests": blood_requests[:6], "blood_banks": blood_banks, - "blood_groups": [g[0] for g in Donor.BLOOD_GROUPS], + "blood_groups": [g[0] for g in BLOOD_GROUPS], "stats": stats, "project_name": "RaktaPulse", "current_time": timezone.now(), @@ -142,7 +168,7 @@ def donor_list(request): context = { 'donors': donor_list_data, - 'blood_groups': [g[0] for g in Donor.BLOOD_GROUPS], + 'blood_groups': [g[0] for g in BLOOD_GROUPS], } return render(request, 'core/donor_list.html', context) @@ -231,7 +257,7 @@ def request_blood(request): messages.error(request, "Please fill in all required fields.") context = { - 'blood_groups': [g[0] for g in Donor.BLOOD_GROUPS], + 'blood_groups': [g[0] for g in BLOOD_GROUPS], 'urgency_levels': BloodRequest.URGENCY_LEVELS, } return render(request, 'core/request_blood.html', context) diff --git a/reduce_capacity.py b/reduce_capacity.py new file mode 100644 index 0000000..1dbdde6 --- /dev/null +++ b/reduce_capacity.py @@ -0,0 +1,17 @@ +import os +import django + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +from core.models import BloodBank + +def run(): + banks = BloodBank.objects.all() + for bank in banks: + bank.total_capacity = 200 # Reduced from 1000 + bank.save() + print("Capacity reduced for all blood banks.") + +if __name__ == "__main__": + run()