From d86257fa5a2324d083b7940bb4a4ae5768c4a10b Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 17 Feb 2026 15:39:01 +0000 Subject: [PATCH] RaktaPluse --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5614 bytes config/settings.py | 3 + core/__pycache__/admin.cpython-311.pyc | Bin 1497 -> 1937 bytes core/__pycache__/models.cpython-311.pyc | Bin 4809 -> 6419 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1061 -> 1468 bytes core/__pycache__/views.cpython-311.pyc | Bin 11342 -> 16607 bytes core/admin.py | 8 +- core/migrations/0004_vaccinerecord.py | 30 ++++ ..._bloodbank_latitude_bloodbank_longitude.py | 23 +++ ...request_latitude_bloodrequest_longitude.py | 23 +++ .../0004_vaccinerecord.cpython-311.pyc | Bin 0 -> 2029 bytes ...titude_bloodbank_longitude.cpython-311.pyc | Bin 0 -> 1016 bytes ...ude_bloodrequest_longitude.cpython-311.pyc | Bin 0 -> 1051 bytes core/models.py | 18 +++ core/templates/base.html | 66 ++++++++- core/templates/core/add_vaccination.html | 74 ++++++++++ core/templates/core/blood_bank_list.html | 60 +++++++- core/templates/core/blood_request_list.html | 2 +- core/templates/core/donor_list.html | 11 +- core/templates/core/index.html | 6 +- core/templates/core/live_map.html | 134 ++++++++++++++++++ core/templates/core/login.html | 85 ++++++++--- core/templates/core/register.html | 89 ++++++++++++ core/templates/core/request_blood.html | 99 +++++++++++++ .../templates/core/vaccination_dashboard.html | 103 ++++++++++++++ core/urls.py | 6 +- core/views.py | 117 +++++++++++++-- populate_coords.py | 25 ++++ 28 files changed, 934 insertions(+), 48 deletions(-) create mode 100644 core/migrations/0004_vaccinerecord.py create mode 100644 core/migrations/0005_bloodbank_latitude_bloodbank_longitude.py create mode 100644 core/migrations/0006_bloodrequest_latitude_bloodrequest_longitude.py create mode 100644 core/migrations/__pycache__/0004_vaccinerecord.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0005_bloodbank_latitude_bloodbank_longitude.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0006_bloodrequest_latitude_bloodrequest_longitude.cpython-311.pyc create mode 100644 core/templates/core/add_vaccination.html create mode 100644 core/templates/core/live_map.html create mode 100644 core/templates/core/register.html create mode 100644 core/templates/core/request_blood.html create mode 100644 core/templates/core/vaccination_dashboard.html create mode 100644 populate_coords.py diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index c051bcfb4e15b9c7de2c36f046553ea5aa5bfeca..9aced4fd93ebc3229ad8cd904c46a30dc64bde16 100644 GIT binary patch delta 161 zcmdm>{Z5;AIWI340}$9$PsuEq$ScWsXQTQR7G9Sq{S?;aEx1LqAq#-ozM# diff --git a/config/settings.py b/config/settings.py index 291d043..0b62db9 100644 --- a/config/settings.py +++ b/config/settings.py @@ -180,3 +180,6 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +LOGIN_URL = '/login/' +LOGIN_REDIRECT_URL = '/' diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index c16c35128158a25c93aba68b21795da2060aaaf5..7b9a1bb8c57ab401e03d74507b7c8a2680cde261 100644 GIT binary patch literal 1937 zcmbW1Id2q66vwOj7?0;L*f3u3uFWmn0Un$XtyaRUc7p{6>_X5v;96dasVZ>-7qO=bu+^ z!uK{I|6*bAl)h#T6(!^?5k%04#MGyh2us+J72CcYJH8XUz8jbP5+xRq^y$O^AWPfO za~D$ovB>X4IIoFt!Kyr{-G*^@A@!ea`0Wk~#Gf1?+GB_%AWoc`SQ#NYV~AxSPM(@r z9U;17h!r4KPfe_e+MmR$f5JF;RJ&ZnVe$#%=sDW`HBC~bYb#Njiih%9A+uahn$ikS zHgx?l4}vg}4`q-l5e#DqnZZgN&OzZVk;JEh_?Do)EiB&=w(klDMt1egG00sUA8KpQ z`)HQ%SZb%pq|#N9W|AdE+=4PgV0psy4DV4`dSpC7UM5OYKdCC&GvWnQR`U zGkiau`>S(*f97`QkNxv2od@`;iv#=bjCI8TkV$UV*UVl|6lzT-!KN-{InRqsR{|wr0|~}+*eJ%s>p1rtAmH*f`04U`nzh56 zN2_Cfy^8iIXCa;N^%44d2YtPL)K|10@9PY-j2;v?Ahw5xlmAe zSu4DG6<(~mtmGP;5BL9LBHr#=Y?(CW;6VLd0C63yE=%m`EIzL1$x5@1my%)gCywu;`)_sh>gg z1Nc1{v6Cx_Cd^Fsf2av2Htnx{`m|49y2&>)(Tm3oftOGG=s$_wLW3|lFk=t9Ua$?n7QJV3i6~$?bgWey*lh>i7Af;6#9Nr;97zbF Zfl%mA*MU&!|5p{E@{W@9RUOE1wJ(L0eUktH diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 33dad9448a10f944ff5bd11dbe80e5e277aec27c..a179ffa2ac4f6823fa4ebd5b416fdaadab17ffa7 100644 GIT binary patch literal 6419 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 delta 1746 zcmah}O>7%Q6yCLWZLhtyv+++{xoHgjHNk-tfeK2gk|s^1h6JTaB!ZB&^-SwE>)mv` zrVt?+iC(y%Sd$aCURp)?P^qV$ICJArA+aZ}zMxd}fFdM#ZyYDciNcfin>X*hc{B6g zx5F?0d_M6c9*;^OdSlzl$J&XUyw$!qng~eq5(z$(h(hI>(*9*6sS1+{rcmD$5~eVi zBKxLrm}s}9Vzm87{@I>N0lgmH^+dbaTe>VC8qb(;4}os z5A+gCfZinlJF*|Gn_re~>fH0HT@_6MX29TwD^=I3(1x$wGB0`6y6KSSfsfF;X4Ce% z|6n3KMmGeoQsjR{M&I`pr)k^1ddD`M&%0@G6a#D&26hHuM`j~1+~{7$Nl1&18JmbzC-4E;l?@F6X%xy%PBo!llJxo?lSTP5JuF!qU=gd473m_2b(t2rgf{ zUNzYbi`s-;ggLu}#t5+>hgI?Xi0xKP&vG69U37h{h|WaC@~lnjG^*A{*>Qbs*7T^z z!2gb}kh5})PsU%gu!KTLv=e+ROVW?<^<+IB zkf>6_;tQe4+E8Eb#0Fvw5&NHPMDN5O2OuAOJy{09~XITL38THw8N56B4L0J|iD@EDY&8Fu< z?H-g(Lii8K>6@Es;jYUH&~niLeFKV49k1+|b;{m=WeqGyp;u8X@n(9)c3rYe?>A|~ z>orY8S-(RWyM`+i3=YDD{5Yfh#ZZd>rkp;D=VWsT zhisU~DFU*(A@PjC`R~U49xKp}tOz`nIU8OzFs%@x5S6H%5MPzYf@&wsAIM{^NGCkd zw-~fGSQAeQE+a=H^#6@Ox}BT@-Y1N}I|(^vo8-|X{AnuFI_YT0-IF&SCK}K(MWR5< zn6C)}%)o2G4%vyE6vSI$ucKN(K<-zNKm2)myd-|}V<}}EWbE_l8aFbj$sV851AG$i zM~^=uB@%|MAxv?SX&>AD&(Mv4glwGUx$G7GwSI~}%KoYgj-YR`7~$WJocloi$R*V7 z@e-LK77p-fFEUkkNz2$2bMQ{{<+~W$*w1 diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index bd06905308ed68914a6ba1c8f1c9b8d0a955c288..1c540d8c0bb4a5dbce1456deed293d802746536f 100644 GIT binary patch delta 686 zcmZ3=v4>lIIWI340}!n0oRYbQnStRkhyw!xP{!w`iR$J&x!h6Qxja!kxx7)l6XPz` zGclwxrii9;r--d#TL#p+8i*kPEF+%ElOlmtMlzK*MGC8obShtp47yA@PZWQOY%qhS z+)I%0nvAzt3KB~)*k3Y&c-)iy7>f)=%Mz25GxHKlGV}A|Qxc0alJXOaQf~1lrliCp zN!{Ye$t+8a&rK|tyq~eDzDf*9P9LsKzlaxTa+LtGB+wxJB0i8XC&&n0pb`2-{2)GG zQEFjnYH^8fQciw;ivBHLC_f&|_tO-(#hsFsn3tZfS6Y-)Tm%ZFTdZZ7spZ9!W0^Dr z!FGX71{+r-I=P7{fJ+9b3go@w-IMPy$<>!KeE{+YjFiA-{p4Kc6=^qEI2v3oa4KF< zwzyy)c7Y}QB1`xcmT;)B^o;lm#x56FTraY?USV+si*`s)$XF0{fyLk=i@_BZ1E@;L f8MZ6xFR<8OWU;@(V*f#sm!GMD8w87_fFS_@S(3Lt delta 265 zcmdnPy_7?JIWI340}$|*P037WVqka-;=lk8l<}EwqPqFStV?p~98ugUqQMNBVlP2b znvAzt3KB~)UNV9>9Fq?*7EMlLYGn4)^ON5voDtfPzoen>^S)+vs}G1(+41* i&LkTHD`$gChfqhzk42?UtE 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 delta 2250 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 X<|H*savrvv!NnU#%5m}+Z}sjEyn_hu literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0006_bloodrequest_latitude_bloodrequest_longitude.cpython-311.pyc b/core/migrations/__pycache__/0006_bloodrequest_latitude_bloodrequest_longitude.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..144b2a2102b8ef787aff3df1e1ca1e8b76bd450d GIT binary patch literal 1051 zcmbVKF>ljQ5Pr{g9NTFSv5**A5CcU-NOcyNDg;sm5`r!ukW3}Z$vuM8XFIWDQML{Y zFwvn>|3N9DKZ235NExcPGIev6PMx^t!~t3c#IxV|?%v(K`@Zw1dfg(p=!fm#qe93J zX_TunRmRJx><}P8ISHvtL&a4nQOH9A$~yuoqdm1u+C}Zl%yL!Go|0zeNFFy8VTD0A z@rOYir9uy5U_9-Vnetnk8sj}wb_gRb1>!0|yVO+`!n9u56kZL|qxY)Q90D3tKnHEV zx~pLmxF>7h__L{Vb((^XspEQD7R=93Z^g48;3!o;mst99FJ^EigKAFX>FVGlE4 zzq{h7TlmCW5tpz*#?qlM%GhT|Izl)yQ8YDCX>%+jE&%HUq0hZO_d6^_PW=rJ0<4q@ zEy_4=s_2v4dXXP8^hsHH6)+CMI5uJP@&!!{(OvZRlPQiH{hs?>^Sv1TXw!u2tFixB| zak8HF5rZQMbAJ6A4pMh#!qb$JGwjX0C77lD+eA`T2&tsoC^lzLt`qYf%~j=+zWF$} zh`I3I8X5D4mlqEk^N050){T+9xVQ4P@ojMM;^l$8_T63^*=u=KGp%ES;zWuwi3|Up zSg+ao<|FweSIRb5aik{n{HPl*LAzkK;Bx|GL53BvS5Z4PmM7!6n_NSa;!dBV$W=-y gf}_m?a`XI~>kX>sptz5oCK literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index b7d3d8f..1c10aac 100644 --- a/core/models.py +++ b/core/models.py @@ -1,5 +1,19 @@ from django.db import models from django.utils import timezone +from django.contrib.auth.models import User + +class VaccineRecord(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='vaccine_records') + vaccine_name = models.CharField(max_length=100) + dose_number = models.PositiveIntegerField(default=1) + date_taken = models.DateField() + location = models.CharField(max_length=255) + center_name = models.CharField(max_length=255, null=True, blank=True) + notes = models.TextField(blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.vaccine_name} - Dose {self.dose_number} for {self.user.username}" class Donor(models.Model): BLOOD_GROUPS = [ @@ -38,6 +52,8 @@ class BloodRequest(models.Model): location = models.CharField(max_length=255) urgency = models.CharField(max_length=10, choices=URGENCY_LEVELS, default='NORMAL') hospital = models.CharField(max_length=255) + latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) + longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) contact_number = models.CharField(max_length=20) required_date = models.DateField(default=timezone.now) status = models.CharField(max_length=20, default='Active') @@ -49,6 +65,8 @@ class BloodRequest(models.Model): class BloodBank(models.Model): name = models.CharField(max_length=100) location = models.CharField(max_length=255) + latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) + longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) contact_number = models.CharField(max_length=20, null=True, blank=True) is_24_7 = models.BooleanField(default=True) stock_a_plus = models.IntegerField(default=0) diff --git a/core/templates/base.html b/core/templates/base.html index 73ae1ea..1437535 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -199,14 +199,18 @@
  • Donors
  • Blood Requests
  • Blood Banks
  • +
  • Live Alerts
  • Vaccination
  • + {% if user.is_authenticated %} +
  • My Records
  • + {% endif %}
  • Settings
  • @@ -226,6 +230,10 @@
    +
    + + Detect Location +
    {{ current_time|date:"D, M d, Y" }} @@ -245,6 +253,16 @@
    + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} {% block content %}{% endblock %}
    @@ -265,7 +283,51 @@ } }); - // Active class is handled server-side via Django templates. + function detectLocation() { + const text = document.getElementById('location-text'); + const originalText = text.innerText; + text.innerText = "Locating..."; + + if ("geolocation" in navigator) { + navigator.geolocation.getCurrentPosition(function(position) { + const lat = position.coords.latitude; + const lng = position.coords.longitude; + text.innerText = lat.toFixed(4) + ", " + lng.toFixed(4); + + // Save to cookies for 1 day + document.cookie = `user_lat=${lat}; path=/; max-age=86400`; + document.cookie = `user_lng=${lng}; path=/; max-age=86400`; + + // If we are on a list page without lat/lng, reload with them + const urlParams = new URLSearchParams(window.location.search); + if (!urlParams.has('lat')) { + urlParams.set('lat', lat); + urlParams.set('lng', lng); + window.location.search = urlParams.toString(); + } + }, function(error) { + text.innerText = "Error"; + console.error(error); + }); + } else { + text.innerText = "Not supported"; + } + } + + // Check if location is already in cookies + function checkLocationCookie() { + const cookies = document.cookie.split(';'); + let lat = null, lng = null; + for (let cookie of cookies) { + const [name, value] = cookie.trim().split('='); + if (name === 'user_lat') lat = value; + if (name === 'user_lng') lng = value; + } + if (lat && lng) { + document.getElementById('location-text').innerText = parseFloat(lat).toFixed(4) + ", " + parseFloat(lng).toFixed(4); + } + } + checkLocationCookie(); {% block scripts %}{% endblock %} diff --git a/core/templates/core/add_vaccination.html b/core/templates/core/add_vaccination.html new file mode 100644 index 0000000..502a9cb --- /dev/null +++ b/core/templates/core/add_vaccination.html @@ -0,0 +1,74 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Add Vaccination Record - {{ project_name }}{% endblock %} + +{% block content %} +
    +
    +
    +
    +
    +
    + +
    +

    Add Vaccine Record

    +

    Keep your immunization data accurate and up to date.

    +
    + +
    + {% csrf_token %} + +
    + + +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + Cancel +
    +
    +
    +
    +
    +
    +{% endblock %} diff --git a/core/templates/core/blood_bank_list.html b/core/templates/core/blood_bank_list.html index dff5f0f..d133653 100644 --- a/core/templates/core/blood_bank_list.html +++ b/core/templates/core/blood_bank_list.html @@ -6,24 +6,47 @@ {% block content %}
    -
    +

    Blood Banks

    Official blood repositories and their current inventory levels.

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

    {{ bank.name }}

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

    {{ bank.location }}

    -

    {{ bank.contact_number }}

    + + {% if bank.distance and bank.distance < 1000 %} +
    + + {{ bank.distance|floatformat:1 }} km away from you + +
    + {% endif %} + +

    {{ bank.location }}

    +

    + + {{ bank.contact_number }} + +

    Inventory Levels (Units)
    @@ -77,7 +100,7 @@
    - + Contact Bank
    {% empty %} @@ -89,3 +112,30 @@
    {% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/core/templates/core/blood_request_list.html b/core/templates/core/blood_request_list.html index f4ff8fd..71f97e8 100644 --- a/core/templates/core/blood_request_list.html +++ b/core/templates/core/blood_request_list.html @@ -24,7 +24,7 @@

    Blood Requests

    Current active requirements for blood in various hospitals.

    - + Post a Request diff --git a/core/templates/core/donor_list.html b/core/templates/core/donor_list.html index c91d16f..b391186 100644 --- a/core/templates/core/donor_list.html +++ b/core/templates/core/donor_list.html @@ -70,10 +70,13 @@

    Phone: {{ donor.phone }}

    - - - - {% endblock %} + Contact Now + + {% endfor %} + + + +{% endblock %} {% block scripts %} +{% endblock %} diff --git a/core/templates/core/login.html b/core/templates/core/login.html index b95e6de..0fefcb6 100644 --- a/core/templates/core/login.html +++ b/core/templates/core/login.html @@ -3,58 +3,97 @@ {% block title %}Login - RaktaPulse{% endblock %} {% block content %} -
    +
    -
    -
    -