From 610e165e179fc3efd80c9b4259dcd5716f84259c Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Thu, 4 Sep 2025 19:19:52 +0300 Subject: [PATCH] update --- .DS_Store | Bin 14340 -> 14340 bytes .../__pycache__/views.cpython-312.pyc | Bin 75394 -> 77727 bytes appointments/views.py | 93 +- blood_bank/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 183 bytes blood_bank/__pycache__/admin.cpython-312.pyc | Bin 0 -> 12845 bytes blood_bank/__pycache__/apps.cpython-312.pyc | Bin 0 -> 542 bytes blood_bank/__pycache__/forms.cpython-312.pyc | Bin 0 -> 22528 bytes blood_bank/__pycache__/models.cpython-312.pyc | Bin 0 -> 30892 bytes blood_bank/__pycache__/urls.cpython-312.pyc | Bin 0 -> 4895 bytes blood_bank/__pycache__/views.cpython-312.pyc | Bin 0 -> 54475 bytes blood_bank/admin.py | 387 + blood_bank/apps.py | 8 + blood_bank/forms.py | 429 + blood_bank/management/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes blood_bank/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../blood_bank_data.cpython-312.pyc | Bin 0 -> 19613 bytes .../management/commands/blood_bank_data.py | 339 + blood_bank/migrations/0001_initial.py | 925 + ...02_donor_national_id_alter_donor_gender.py | 26 + blood_bank/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 24919 bytes ...onal_id_alter_donor_gender.cpython-312.pyc | Bin 0 -> 1060 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes blood_bank/models.py | 525 + blood_bank/tests.py | 3 + blood_bank/urls.py | 78 + blood_bank/views.py | 1228 + .../custom_filters.cpython-312.pyc | Bin 10613 -> 14661 bytes core/templatetags/custom_filters.py | 114 + db.sqlite3 | Bin 38715392 -> 39882752 bytes .../__pycache__/settings.cpython-312.pyc | Bin 7350 -> 7362 bytes .../__pycache__/urls.cpython-312.pyc | Bin 2363 -> 2437 bytes hospital_management/settings.py | 1 + hospital_management/urls.py | 1 + inpatients/__pycache__/models.cpython-312.pyc | Bin 43085 -> 43378 bytes ...e_bed_is_active_out_of_service_and_more.py | 28 + ...ve_out_of_service_and_more.cpython-312.pyc | Bin 0 -> 1142 bytes inpatients/models.py | 12 +- logs/hospital_management.log | 55995 ++++++++++++++++ .../__pycache__/forms.cpython-312.pyc | Bin 22791 -> 29406 bytes .../__pycache__/models.cpython-312.pyc | Bin 37268 -> 37851 bytes .../__pycache__/urls.cpython-312.pyc | Bin 5704 -> 6037 bytes .../__pycache__/views.cpython-312.pyc | Bin 61771 -> 73559 bytes operating_theatre/forms.py | 209 +- .../__pycache__/or_data.cpython-312.pyc | Bin 29965 -> 39363 bytes .../management/commands/or_data.py | 1321 +- ...002_alter_surgicalnote_surgeon_and_more.py | 36 + ...gicalnote_surgeon_and_more.cpython-312.pyc | Bin 0 -> 1593 bytes operating_theatre/models.py | 27 +- operating_theatre/urls.py | 11 +- operating_theatre/views.py | 920 +- or_data.py | 2122 +- patients/.DS_Store | Bin 0 -> 6148 bytes patients/__pycache__/admin.cpython-312.pyc | Bin 11943 -> 17048 bytes patients/__pycache__/forms.cpython-312.pyc | Bin 15743 -> 15743 bytes patients/__pycache__/models.cpython-312.pyc | Bin 31613 -> 45438 bytes patients/__pycache__/urls.cpython-312.pyc | Bin 4814 -> 7685 bytes patients/__pycache__/views.cpython-312.pyc | Bin 58098 -> 127317 bytes patients/admin.py | 138 +- patients/data_generators/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 197 bytes .../saudi_claims_generator.cpython-312.pyc | Bin 0 -> 24531 bytes .../data_generators/saudi_claims_generator.py | 592 + patients/forms.py | 2 +- patients/management/.DS_Store | Bin 0 -> 6148 bytes patients/management/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 192 bytes patients/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 201 bytes .../generate_saudi_claims.cpython-312.pyc | Bin 0 -> 18475 bytes .../commands/generate_saudi_claims.py | 398 + .../commands/populate_saudi_insurance.py | 228 + .../0003_insuranceinfo_is_primary.py | 18 + .../migrations/0004_insuranceinfo_status.py | 27 + .../0005_alter_insuranceinfo_status.py | 27 + ...aimstatushistory_claimdocument_and_more.py | 532 + .../0007_alter_consenttemplate_category.py | 33 + ...3_insuranceinfo_is_primary.cpython-312.pyc | Bin 0 -> 850 bytes .../0004_insuranceinfo_status.cpython-312.pyc | Bin 0 -> 926 bytes ...alter_insuranceinfo_status.cpython-312.pyc | Bin 0 -> 932 bytes ...ory_claimdocument_and_more.cpython-312.pyc | Bin 0 -> 11620 bytes ...r_consenttemplate_category.cpython-312.pyc | Bin 0 -> 1195 bytes patients/models.py | 774 +- patients/urls.py | 29 +- patients/views.py | 2244 +- templates/.DS_Store | Bin 18436 -> 20484 bytes templates/blood_bank/.DS_Store | Bin 0 -> 8196 bytes .../crossmatch/crossmatch_form.html | 839 + templates/blood_bank/dashboard.html | 364 + .../donors/donor_confirm_delete.html | 279 + templates/blood_bank/donors/donor_detail.html | 330 + .../blood_bank/donors/donor_eligibility.html | 449 + templates/blood_bank/donors/donor_form.html | 433 + templates/blood_bank/donors/donor_list.html | 298 + .../inventory/inventory_dashboard.html | 604 + .../blood_bank/issues/blood_issue_form.html | 743 + .../quality_control_confirm_delete.html | 542 + .../quality_control_detail.html | 612 + .../quality_control/quality_control_form.html | 658 + .../quality_control/quality_control_list.html | 633 + .../reactions/adverse_reaction_form.html | 882 + .../reports/blood_bank_reports.html | 633 + templates/blood_bank/requests/.DS_Store | Bin 0 -> 6148 bytes .../blood_request_confirm_delete.html | 464 + .../requests/blood_request_detail.html | 639 + .../requests/blood_request_form.html | 653 + .../requests/blood_request_list.html | 495 + .../blood_bank/tests/blood_test_form.html | 644 + .../transfusions/transfusion_detail.html | 980 + .../transfusions/transfusion_form.html | 811 + .../transfusions/transfusion_list.html | 608 + templates/blood_bank/units/.DS_Store | Bin 0 -> 6148 bytes .../units/blood_unit_confirm_delete.html | 591 + .../units/blood_unit_detail copy.html | 613 + .../blood_bank/units/blood_unit_detail.html | 613 + .../blood_bank/units/blood_unit_form.html | 571 + .../blood_bank/units/blood_unit_list.html | 509 + templates/operating_theatre/.DS_Store | Bin 6148 -> 6148 bytes .../blocks/block_detail.html | 221 +- .../operating_theatre/blocks/block_form.html | 2 +- .../operating_theatre/blocks/block_list.html | 30 +- .../cases/surgical_case_detail.html | 84 +- .../cases/surgical_case_form.html | 1089 +- .../cases/surgical_case_list.html | 330 + templates/operating_theatre/dashboard.html | 900 +- .../notes/operative_note_detail.html | 16 +- .../notes/surgical_note_detail.html | 120 +- .../notes/surgical_note_form.html | 164 +- .../notes/surgical_note_list.html | 144 +- .../{cases => partials}/case_list.html | 0 .../partials/note_status.html | 10 + .../partials/surgical_note_preview_modal.html | 292 + .../rooms/operating_room_detail.html | 384 +- .../rooms/operating_room_form.html | 1204 +- .../operating_theatre/surgical_case_list.html | 305 - templates/patients/.DS_Store | Bin 0 -> 8196 bytes .../claims/insurance_claim_detail.html | 684 + .../patients/claims/insurance_claim_form.html | 729 + .../claims/insurance_claims_list.html | 615 + templates/patients/consent_management.html | 30 +- .../consents/consent_form_detail.html | 120 +- .../patients/consents/consent_form_form.html | 90 +- .../patients/consents/consent_form_list.html | 386 +- .../consent_template_confirm_delete.html | 488 + .../consents/consent_template_detail.html | 586 + .../consents/consent_template_form.html | 679 + .../consents/consent_template_list.html | 708 + .../patients/insurance/insurance_detail.html | 16 +- .../patients/insurance/insurance_form.html | 38 +- .../patients/insurance/insurance_list.html | 226 +- templates/patients/partials/.DS_Store | Bin 0 -> 6148 bytes .../partials/eligibility_results.html | 354 + .../partials/insurance_claims_history.html | 483 + .../provider_verification_results.html | 547 + templates/patients/patient_detail.html | 2 +- .../patients/profiles/patient_detail.html | 26 +- 159 files changed, 92985 insertions(+), 5487 deletions(-) create mode 100644 blood_bank/__init__.py create mode 100644 blood_bank/__pycache__/__init__.cpython-312.pyc create mode 100644 blood_bank/__pycache__/admin.cpython-312.pyc create mode 100644 blood_bank/__pycache__/apps.cpython-312.pyc create mode 100644 blood_bank/__pycache__/forms.cpython-312.pyc create mode 100644 blood_bank/__pycache__/models.cpython-312.pyc create mode 100644 blood_bank/__pycache__/urls.cpython-312.pyc create mode 100644 blood_bank/__pycache__/views.cpython-312.pyc create mode 100644 blood_bank/admin.py create mode 100644 blood_bank/apps.py create mode 100644 blood_bank/forms.py create mode 100644 blood_bank/management/__init__.py create mode 100644 blood_bank/management/__pycache__/__init__.cpython-312.pyc create mode 100644 blood_bank/management/commands/__init__.py create mode 100644 blood_bank/management/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 blood_bank/management/commands/__pycache__/blood_bank_data.cpython-312.pyc create mode 100644 blood_bank/management/commands/blood_bank_data.py create mode 100644 blood_bank/migrations/0001_initial.py create mode 100644 blood_bank/migrations/0002_donor_national_id_alter_donor_gender.py create mode 100644 blood_bank/migrations/__init__.py create mode 100644 blood_bank/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 blood_bank/migrations/__pycache__/0002_donor_national_id_alter_donor_gender.cpython-312.pyc create mode 100644 blood_bank/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 blood_bank/models.py create mode 100644 blood_bank/tests.py create mode 100644 blood_bank/urls.py create mode 100644 blood_bank/views.py create mode 100644 inpatients/migrations/0004_bed_is_active_bed_is_active_out_of_service_and_more.py create mode 100644 inpatients/migrations/__pycache__/0004_bed_is_active_bed_is_active_out_of_service_and_more.cpython-312.pyc create mode 100644 operating_theatre/migrations/0002_alter_surgicalnote_surgeon_and_more.py create mode 100644 operating_theatre/migrations/__pycache__/0002_alter_surgicalnote_surgeon_and_more.cpython-312.pyc create mode 100644 patients/.DS_Store create mode 100644 patients/data_generators/__init__.py create mode 100644 patients/data_generators/__pycache__/__init__.cpython-312.pyc create mode 100644 patients/data_generators/__pycache__/saudi_claims_generator.cpython-312.pyc create mode 100644 patients/data_generators/saudi_claims_generator.py create mode 100644 patients/management/.DS_Store create mode 100644 patients/management/__init__.py create mode 100644 patients/management/__pycache__/__init__.cpython-312.pyc create mode 100644 patients/management/commands/__init__.py create mode 100644 patients/management/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 patients/management/commands/__pycache__/generate_saudi_claims.cpython-312.pyc create mode 100644 patients/management/commands/generate_saudi_claims.py create mode 100644 patients/management/commands/populate_saudi_insurance.py create mode 100644 patients/migrations/0003_insuranceinfo_is_primary.py create mode 100644 patients/migrations/0004_insuranceinfo_status.py create mode 100644 patients/migrations/0005_alter_insuranceinfo_status.py create mode 100644 patients/migrations/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.py create mode 100644 patients/migrations/0007_alter_consenttemplate_category.py create mode 100644 patients/migrations/__pycache__/0003_insuranceinfo_is_primary.cpython-312.pyc create mode 100644 patients/migrations/__pycache__/0004_insuranceinfo_status.cpython-312.pyc create mode 100644 patients/migrations/__pycache__/0005_alter_insuranceinfo_status.cpython-312.pyc create mode 100644 patients/migrations/__pycache__/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.cpython-312.pyc create mode 100644 patients/migrations/__pycache__/0007_alter_consenttemplate_category.cpython-312.pyc create mode 100644 templates/blood_bank/.DS_Store create mode 100644 templates/blood_bank/crossmatch/crossmatch_form.html create mode 100644 templates/blood_bank/dashboard.html create mode 100644 templates/blood_bank/donors/donor_confirm_delete.html create mode 100644 templates/blood_bank/donors/donor_detail.html create mode 100644 templates/blood_bank/donors/donor_eligibility.html create mode 100644 templates/blood_bank/donors/donor_form.html create mode 100644 templates/blood_bank/donors/donor_list.html create mode 100644 templates/blood_bank/inventory/inventory_dashboard.html create mode 100644 templates/blood_bank/issues/blood_issue_form.html create mode 100644 templates/blood_bank/quality_control/quality_control_confirm_delete.html create mode 100644 templates/blood_bank/quality_control/quality_control_detail.html create mode 100644 templates/blood_bank/quality_control/quality_control_form.html create mode 100644 templates/blood_bank/quality_control/quality_control_list.html create mode 100644 templates/blood_bank/reactions/adverse_reaction_form.html create mode 100644 templates/blood_bank/reports/blood_bank_reports.html create mode 100644 templates/blood_bank/requests/.DS_Store create mode 100644 templates/blood_bank/requests/blood_request_confirm_delete.html create mode 100644 templates/blood_bank/requests/blood_request_detail.html create mode 100644 templates/blood_bank/requests/blood_request_form.html create mode 100644 templates/blood_bank/requests/blood_request_list.html create mode 100644 templates/blood_bank/tests/blood_test_form.html create mode 100644 templates/blood_bank/transfusions/transfusion_detail.html create mode 100644 templates/blood_bank/transfusions/transfusion_form.html create mode 100644 templates/blood_bank/transfusions/transfusion_list.html create mode 100644 templates/blood_bank/units/.DS_Store create mode 100644 templates/blood_bank/units/blood_unit_confirm_delete.html create mode 100644 templates/blood_bank/units/blood_unit_detail copy.html create mode 100644 templates/blood_bank/units/blood_unit_detail.html create mode 100644 templates/blood_bank/units/blood_unit_form.html create mode 100644 templates/blood_bank/units/blood_unit_list.html create mode 100644 templates/operating_theatre/cases/surgical_case_list.html rename templates/operating_theatre/{cases => partials}/case_list.html (100%) create mode 100644 templates/operating_theatre/partials/note_status.html create mode 100644 templates/operating_theatre/partials/surgical_note_preview_modal.html delete mode 100644 templates/operating_theatre/surgical_case_list.html create mode 100644 templates/patients/.DS_Store create mode 100644 templates/patients/claims/insurance_claim_detail.html create mode 100644 templates/patients/claims/insurance_claim_form.html create mode 100644 templates/patients/claims/insurance_claims_list.html create mode 100644 templates/patients/consents/consent_template_confirm_delete.html create mode 100644 templates/patients/consents/consent_template_detail.html create mode 100644 templates/patients/consents/consent_template_form.html create mode 100644 templates/patients/consents/consent_template_list.html create mode 100644 templates/patients/partials/.DS_Store create mode 100644 templates/patients/partials/eligibility_results.html create mode 100644 templates/patients/partials/insurance_claims_history.html create mode 100644 templates/patients/partials/provider_verification_results.html diff --git a/.DS_Store b/.DS_Store index 0f75e54439bdf5fed8c456d8f62e14d3d7c739b3..6932e4b1950c54c6a5979ac789b7290df678a282 100644 GIT binary patch delta 1027 zcmbu8TSyd97{|Z=xVkfq=23TbvyBwf)pfJ=QeF@>O)S^EYZ|1jI>zF*F0PlXNGhMQ zLK(0~y3q}?eAzULqI@XmLP1E_L+Ddbn9xg6L3MN?A}FB-WKT1&MxCR%-Bsn- zt2DCEZimuS=I(T~yF9f@hlf{58e1M=jE*(0OUukDC@LwR3T7dpVLDk>=R<9f)vPdU zx?Jty`em=notRgGrQ!zDg7QHk;!*rHz&^S%d1A0cUXolX>2l_~#=?i^@ z2L8}OLlt25&5v89F?d-HFls0El|*kc66bl2Yb+qLpXw?IELdmfpfTk zi@1a_+{HcI$0Q!(37+C5X7CPkc#nB}5+q@nAPYLdB*Y5|f>}rvvV}sSSg2CX`dY5Q zxOq#ltz_#T6s%rCftnod;G9On*VfBxL{5i!5nG z6h`DtIiH!u*dIacYyA)7j_U!=0>>DvRF3_-mTt{@^fF05=JpKC2Euc+iz zE)mt{QTG-#`#nvKzH+t2CvVMW+LhuGqSdDst6sO?)28OS{i?6hQ`gj3;@Pj7<=cNA zXje@!jB~BuQ~<8&%#K1{>XU=Qtr&+R#r&uh$()xqcpB@4&lsvW(zvzE>#kM3qTZ;? z46R|_W2t7f*xQZq8yvH%6)luLzFLoIZGPSFMGpS+Q%5%KUx^2_cTFYXi8d` z2a{x<1P3y)4tdy$BFVi3W!MQ9+>-up_Kj%99{6w&ha~?F9L5Qp#A%#CKsvZ2Ep(w9 zN!M@#J-CTGxQlzZj|UjUV?4oAJd;*N@D3CBgwMfIYq}vYG=?QXzDVc+&6SuK%t>s3 W7AdX=(_+W;fuWJ0!D0EUSN;ocLDd-m diff --git a/appointments/__pycache__/views.cpython-312.pyc b/appointments/__pycache__/views.cpython-312.pyc index 7fd22431c9712cce584bb6322de3895d1bc3d8e9..29ac94d535e31858a564f9cf4eeb655c13d6687d 100644 GIT binary patch delta 19335 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 CkTIqJ literal 0 HcmV?d00001 diff --git a/blood_bank/__pycache__/admin.cpython-312.pyc b/blood_bank/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db951513bc5010ad59f70ef3a80b63d071daf764 GIT binary patch literal 12845 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 SczA8=F&TcKBv}eu_J0889i^23 literal 0 HcmV?d00001 diff --git a/blood_bank/__pycache__/apps.cpython-312.pyc b/blood_bank/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0ecdb682ab9181b606d9d3b8102b184a363168a GIT binary patch literal 542 zcmYLGJx{|h5VeyOl|rfbh5-o{q=3{c3=9aV1%Z%&0f{Ax<<@SR;>00NsM-mn{s1;6 zegNVZFf+0+R*{&P*pLbf6Lu2B4R`PP?w;+tmvXrTq#fNqwV!2tSLDwMIT)==a0dt= zkO2?c5CRPx0-_B7(J6e?vpQSr8D`-_5fdikwIJBze#>>5SvvDDC!-|^?f?ZgB*4}P zv~{A{2GQ+;Qb{Ux#yP2D{~{CVuaFM*9bP4ks>casqFQ&IS{(5Mmok!+8mb;OWJ7;G z?Oj#Pt0&mU4)v%Xotk4w5g{LY6rrSqkd%p;!jlMH#+c=q8A4k)W)Z?t9JNw)L*;b0m( z8f*X9{l1r#MOBhW(Bt+@Y=-#sD&LncUuM4deZTK`@2{*@69vbfr++?r`6NaC4gQc1 zeY&tZl}AwzD4L=*Au6o#X*5{Q3+08iJ}oJ0L%Oiurzd4y$Pmu=<&&~LWDFPh3P{-y zGKI}PGnDgbW5^P=`mAA_&la}(?BPORVc6kwgo}Jd;bLELxWrcycKV#*QeSDf%vTn6 z`CJ+*k2*oo1s_nfiP4PhkvqBm|0i0h?5iN0X5h5EhO?4zT7lE{8qO-hX$Q{2*KqD2 zoDSeDdJSha;VcHulGkw75Kbp>mcEA5O*qSd)Abt8TEbZloE5L(+(|eqfwSs0oOOhA z2XIycCyXcMk@-gTgtG=X-LK(nn5gya{1O}TXhi*RlnrxG&|Tmd7XCNJf?;Md8eyPZ zfMuEq#RBldb|w%DGLhIBHaZ*(VYTTPGag`LVL17v2Ai{prlX-~ls>^my@A-!sAwS^1I%~gq=x)D#c^>)G@oY! z5pFon1)~wseuTcsupBeM1cqXG!f`5c6YdaYCwiho&{;TTI~xy#g0YFNXe7o)LqplG zPnZ6&+75*W6hrwmH08^qH9jqQmwE6mwV%LD#lxqgbstbZJ*@|7m@s(q#RBqt$Km}= zHX?Pyt8~-&%x;z$334%(^uZm7(C+v+9f&bp&i(VHmZ{ahCDK5?Kcn^OMnE$Bk;bPF zf>g+(7{iz?&71Wft)+Fe{txn=8a~07564FuI-hVCO24xyZKQQUO%89tHh4|j;58H8 zqU^g%W$1%N(Ff}`cx~J0gPrh}sP;km9tsI>sS2--cF;wNH(b1pUX*Nu*GYJ{_SQz&|wM9|92of>7Ux96EhacJ8WRnp(*OEM z6y`F!1Kz2q!@j+=pcHMzJAjaRk|*lO_4*-r2JQ(6*+4ADa%?4BzyMLkq9A<-}#WI{B@Vh=## z!NZ=4jK@KApJ#5zq@v**>9}a>#&<8BGh%gsWdfqPFCHFbSm|{Btsp(Z#JDHaDzrzv zJlBR=hieN5*js@}Aao0aHT;OgIsZ5t9fQ}=HX7x|gRwx!52pho@Yy0UKQ{pn7WUuV z*Cq{t!9e6j8@@x%J3b-ma9pwF(7pryxX(a3en6!PozwcS^7KWfX~T-eQEWPFds)BMVBr;i|_|8BpNQRII*sjvNkN-U5I~t_tD*@k!N@K zcP=IxFRheeor|)T&$Ym-X_;?%JhJ#c-`bt1IKEPjbrtH5Sc!F2P{)@x&M?W+MxnG3 z-p!c{g7;#g^wP=>tgqg@z6R^v_!_RmYq&mpeX;NP5uv#+;p|_jg}VFsY&U#m_5_fj zv>t>aMd5(OzttF!2h1Np|>j6mvQe&9hheM>|cC*LfzjOK>oS+L zoIc+IoZJB*_o$S^nRM(F96OVa2Eoy=aC_O&K5h81*)cOb7yF&?XGLYnqDG;pk#Fi> zE;_?o&ZO+lX)Ag4Id2^?6?yC5gLm-@y!A(~e%GJCZSWW?kp9o6a^3rRQ+Z>=7R#=s zs40!w*-798eoHPd{(`eA=xaC++EL@ysB_~8!h5{0oziB;6UrxYjH&7U?C}Ix@5V7Q z248)RUNHs@eMC)tiS1ABBE!HPj&m{hAma|i+%U|b+;PA?!30>&9SzamFOMK=Z7ypZ z6|TE;e-@v|#GV39_FG7BVu;#E^cLHUB^@@08YBYhT1y8e$na%PL!C#*_7G+|Iwd1-zq{)h_g^P|Fu@O8NDf>P2CneOeZp>^P;_;=D`hX58TkI~&q^zkrMrdF-F(Zy za_Kp~@Z83V{^im$d?8GlqG=PEG<}|Y7H1y&CX%;+i1~g$9UTJoi=vF}MRFMle0EBb zaX7QtGMV6@b+P@j_RwH~o|X@>Qo!U%F~3&=*Tr;RQqRmpSlF9D`3$NUFRZ5Ng$Y6+pr;-*PNb-kqv!R07OY&7QeHeXp!*r;)$i}{NA3#j^0#_cP{?$ z?)=@wk)=EQ{=P&_f67^>1adzuv%CVxp>9DLvHJHwepmB=ih-Pvj{Djv>bF3gO=*Il zrvJ6(w>26nCW|*!kfsJ0XwB0+S%Lse1SPFJXf4WFe+Kl$GBZvM2&&#g_cWuLH@Sx) z_Z|}m|IFz*0k#$+QdKRSp; z6qvB!vV(C?2B~NS#~M4q0jfj*^CYd2bpdt+7;oGn{}=fE#CrAnWzBq#Xl6DFmrR!C z&Sd$f7om>34&>+esLzbn`}u;=HMfg5dKMafX!QJ~sr6Iq6Kk^RpwM*i*-5_X;Br&% zwC+Rmee=u-!B~|r)_>OWRX)c`*+B94Qn)d2D^9E?E;{0$QvfQJZN2H-z% z6P%*V?eQQxK?EZi4r~A_S$q!B&W(b7;130d8K{RV^#p#gx3SU~jDUwDGQ>z%-Gp-- z&NhT$>939bo>a(fyy-RM#m|jjy4W@Q#_Yj`_{_oO;?`+n%3hYV*Zt65_l3)ybTtdE z=IK+Zy4}gTw}ra5|3mQkm1OU*&^w$sG$PcEOrK0x++b&J>hYeyA!Exe?igOG& zE<;fn!en6!L=+OXKpy~0poS7qSd;@CU$zoZAeLZ9kq~Hc1WTJDh+l)+G5F&afMgJa zmLLcd1wcUIzEOhAy~By}kyLf-9P=k(6yf*v zCaU{V6&|JYOikz8ja$+AzX{LqP3U|nz_MMv4?0=b=h2D)PYE1_FQ1R&Bp4YHP2fO< z;1rZWTZ<;ib&QIU{Q#cfi6pU!_LMN=IGkm_gM%UB(xq%wss4x-D250D_Y8XT(e5$c};1B+9Mcie`IVX(hjrE>Z5J{*a^EV(=ZR-I6d+_ouyHyCtiYP?4N zZo!QEU1$aS&;2P76v7o~#%)gstC(>+JYZp6o4*EeiB`V-WMapu&E#@r^9D_c>?rtUN@g0|?IU^X$axcMNw>jT()Wo4ftwJ43JiuA_P6je z{x%X6zw8W>&BSY&Vm!+7_4nW+t{cc!uDH(R7svjE>y)? zgvaU^znVgI>ri#8;#Uo->Xkx}z;ks@Q?A==TR>j@Y0R`G+Yz@d=ctBBg*gdY{2&T zom6$px<(-=zYF<}AwlUQ*{~ zebU__xI3PCd7oc6@a=>vDI%FACMI`o_#_*6{yjGHE)WPx zmR3mV4^p)7aqn{JThrzrn@i{3e%kbD%afK*yg#fwkQHe^yIeHDTLx103f@>jzRzpj zVgDBH#H!k9e~2|m{uTUjl|YD{*7`zMf)E49T1%du*8I$<(^pDj2f5WT1`4|EVT>&A zmy{1m@;M2%s8V1H5-kiux+i)jbM7yD=2we;H9^Hzp@O=)-m0HW&9XB1OvJBMOh#np z-AYQ>AX+6|h+`ML6_TN4S~rU^oB-Liv_BTjIFrAIDP>mr4;(N|RMj0(a!0VX3yGSh zL%Zp}z#oS|euDv3-MqmLs%Y5Y*it#AVpFMW8#Tkon!gpp=sXP0Z$bfmJ(tzLM5rp3 z8PICM6V-57{!`;?LT&{c3_KIM-txyG`IGqDAVF{lQarJ&heShqLNfRM3`f-OBe{X( z10WbNGeX1+d~(CX>=K;u6p#Rlq>2eDQ&YtxwyVQdHnkiT^G#OC3Al*+J`h!v{FC;B z$@XJH`>|yEX`%hJSoS6ujU7Gcnd^`}bNzyGSHjr3W~97tWV`X6UxlQ*j@i0nIl!A=+ib5z@Fhv{)_af)rR?PZ{Ze8>oeKUKS3MEbvig=tgT0 zv!vIpL`c0>YDfIIn`=j65n{AQw02>GgVEbk4#}(4=6`}K{s#WIzXgJ7voa@rq-jGI zNJZ;heX^oesA%Qi>E$mE3;RYA6{9KF?m2zZwOerQ=HEWeU!;XSOu{vsQi%)I?pbgq zYxfAXdzKo(1blNKQF|`sZd=fQY=2~zjXL+4R8`Yl_rsp~9!Q(s!MB}ARGrMqKv`#PZbtkLZgsL|Fa6j)G6*_~7sxdWv>@;shAOAhPiElz5Z{HyNm(ax| zZ3I&Wj4T5N4Cu(bRO`E7hJ$IXh*&_W~MzMFNQT zK+^lJ;C(mgJt25c@MkYVj{LIsQd&{<3dWrY$yBoKsL*!w`7yrj=yKcH zG)tdgtoxC%MN&bt_!LT4>JRWFk}u$IU6+BKQ-rz<$crYuegJeCQmG+i&(R?nUA7Bq z)n9Nw9~1L+7CFA4iDCu**w%IcNtU{ZA*-~~PO=ny(1uL=jQ zCFF2Bahz8wV0u9qX1eX5H&+s&a1s z&+TYY!-;As*;~b@YO`CbipkYy_eLbEhIq9q_|yO)Y{aJ(sxMpix9G?UMyvdqB@y7r zidqByjEn$i9SV#GhA^%jhVPsexhAPXZFsH&$tOsjBEe~!jVd>UuknGE6BuD6$w!tF zkjVr-g6B4!#s3Rx%W)Qe2nC$Qwb|io=dPLV2mQ1C5NGJ)o4XPv$5JY@xVC-4`Ekvo z8adcpdp70rAgc5TE)OiLJ9}PezmRZU%!*(yp5Wi<=l7mTl&c1&mHwAL_J872DCXQ3 zcn(P^K7c&u+KDmy6&kbBoI{SBLH~8;Tv6`wax&r8S3lsAO8B_$^tw>h>=X1c;IaBU z(A)Ky{h1AvaH^I48k+Ai9Z|M!CRX(m-DBJjr(;A;-s7NU( zg&2L15&|*D2+U0fY>fcRX(8#F^QTW0LZU8YV}rSw&h8X#00v=@$iGRFx9Av(vXBLX zdEX?-8@Dltz;asBjAV?yQq^b6hYcY}CyX_vd{|fTL{hw3H2fVj(1J7Te?S36Lv^-- z2bZgI>A@z6gDNIsZ5v38>POWO2)ukn==3FOucq8yuq17dY_NRb(q&=)m4w@us&0Xt z!^nIDRvBElDD1tIsJ^UfnW{8b-GTAO4xze(KXR78HYOank*E%B)bXm4<$vS5L*mJn zERaQW ziD=wC%m71V1XfOmLT<8Z^sr>_5I}@T3D!dEA@vKlERZ%Cm~1!}q{+pwei}T+AfYiV z%!L?c+>M({xFfi$!{N!sldzzHFoFrjMBLyN98Cv}3EMvRXf)1phmTLTW;jO!H0_9<_Zg)kRsgV=6l^_)h%3nAagP4EZig( zi$>kBI}M~)vO{>o>y%KuGVg8NcPFWXJ9iizUF3t;t+{8e|y8!Bel_e2Q z%6lh9Cz_w?IR-|MsKiMJ9MW+=Pg=Kw*cT66j6bHA%Gq>%xjyHN<;yi{t99s{+yT|L zGV66-+g4^pC*~ojww0M7uWc){floT80oHw4(gPk=>W4y;^<)ZVG8z<<0rwn&f$Ie{ zksjoJGRP;}vMw9NF)r7qC&3^y9EJHsE{Bijh2Sqv00;xaQlUw&^6FR44lk@Mion|! zVbc@XyFgkNu7wlQs&B27RdEVW+yug5Rc4jZ|A8Nq736*jIpHO(O`^WN1xy%DE32Bl zHT(WYcc(2Y2CA?sX|ECNH4C>XJQSC)%>yv3JcSgp#hi&0LzEgknM0Xn>XObOhTckqLZ->X{#3VGWXZ@h$!_5E9+< z!rLopnAx8!t`~~yQ?}hH`_Acj(!Nu$?|j_I@9pM2#}oDwYkF;o;a(5yU{czITa7dd z&c>9jb5rJ0!@WLWF0P-cPZsSGigu-JZ*0n3Y`AxN#gg5!qcmlEXA}N>9ckQ>-8k~U zxha3TeP`oLce12GC}~I`|LINnorZh8u;+?`|KzLrH}wDTru?M;u%}DaboYn-_xnk2 zT2l5M)A0}Q+`scU@+=_iI+?JaTFcj24fncVSgiW06);(=B$E|CqB^j=1^{r~c$ECq zpuknY0_@kMVp5GcplQV+3tn6jM&Lk^f&qTw4rBmDGXm^s{wHZO+P5h@W6Y{Oz;M6f zpp8!p}n7PSJjYR*L148awwnJk^!U+@|M)zdC}K= zVyXArd*Wi!izdb6l4qhN$k(h=XQvBk2f(`ZFIkj%uF{EOPl@P~QXOO;;yKviV`!8> zxt$p($B~nWEJ(r;;ES}!@%Uun5ddza2{+jtkW;v;VP6my`o;bX2`kt(r#QYOVFf* z^qR=ZSb|eTO}pf1`$yeG&S9MBBOZN6ue3=kGe%f2yndoV3;(JsK=dchPbx5@P^=Nw+yl+Q_W=o#2!X zFdc|^7RmQf;O_&1PUn^{ikeU+Hwi^eDMw|}Q71U+l8#2f(YWmJpeO?IXs-lOGuiR5$3aOHHlTK@7wq*Z+@+{l za5N_!9fG4{=@{?mSay&GO6t_wD9{%g?wy3&XK5u=1n|6WY}75--HX-FwL)W0!rlwQ zx7hIA(~`)=*VyN26bnf=B#Kn8qMdF>vL-N=TzB~ z?(E$)3W{qdHIl#k`CL(ckb zayGG?9^`D;Ca0g}Y(!4)HaP<Pf@*&OQ0z28IRLz`%uvJ1AUD#1QgJ&SSvhxRFlP%SuS ztEQY)HqkZTXug@p1*hn^?fM126FR2c74y}IPE)>G)>~}s>-W|P7~xa(qDQFzf$bN( zK-*NqvM17@)D0!mY2mb#URul!uy}ZuPQsbxMNtm#8|(`Y^@RuVe>@U?Gm)7KPt1j9 zVsZ3h#DUJW4@wOvkzzv1|3dP zOLBBkO3#b&%)z;|yqL(ul2IhbW|3UwaU90xh?w<{OG*Ik% zI^Xs5X4f;h-6wP2XLIgnS({6mOHE+SJ%dQ4<_h*}`%u>^p(jvVGT2PyYDi+LbTbk9;t^QT=YM(F;59qP=}NcOPr@Sfo*+&XU3u>_$NS zDx~8Wx%GoX*dw%{9DIs5mHDrf)KHU!_e?at@yU%70q z#;>bzey>`K@mf#?N@fIYfZjWfp>CcLj2Ra*Z#8D#$}_G*Fwdk9nQ?Esf1!R{Qw!5|mDqVfavXwdrzm;|}{%JbL^Sp!E9XK!zuvbyS-z7Nr3G#W_0qyD*U*ExklrOU zYx!pFw?kTdYR^OOY0>hP+|$kOv3NTr@34pEvKmXh=tGOKB(&b%q4)G&cK3Gux9=gj z+O)b)MHs?q2OjLudvw3h350V%>=S?!^>3;l=etbj12_+x&JW^zx9R-Qa#v)J;v7k* z(o%LWo2J78orDvqnY6S3pps67V<{mlCKI!X=|nP-S!O7x_If(Gl!Am_R%)+mQDB^U zNyNk-XChvypD<2vtuD5dNhi~@=_OgI8`R^t;uaDTaDpf(?h!S{p5g-R0#s65gX}NM zDb9$J#B!=Jqy{l@16lx9B$uOtnw||_GE&1MMs9Z^rIzbHtH$mIG3q97RY@)QtGGDk zxhvr0mYt>DrFlP6jc3^}0-MADgApB7T%+OwJ7K6#agGy4l4#xo0;o-=P@ANfAvoZi zP6FXbPt&DpR;JX7xKe}q#+H&9X_(*Sp zQx^l{1^49wk&3vE#9lT2-C3FuVDb+}Rm#0QaCegN_~0ePy&zO4@Tho$|v9;wF2 zr0$C*1f^~!A;}qrXq4JyOpQu3jhH|l!xGsB-a9I`yG&U)&M{C;_3Fsa#y=X*?K!qS zxGsE>`Z$$)>{QM>nsbjni0-JttkE=~{5p*$z$!&>Gl1Iy{zxeb%IdDv&S0o<%;x1S z&=Y9z$OLkM)qqbAesD0?)U~=BjTrlAEVt)q&U-B9KK5YEsiRrVTQR0Sv}LrBWeK{q zdF)}}8>rPj??S0%2VSbXED5JpIkOmND1$~@*@09~SrSfXXuw#NZB>GGPRmlS;d7?C zU@2iAi_}QeD5V-7zT%)yNO3HSF-d8lcr-l|olZztAvzb*Dg3DxV#^u^cV^N!E5YB@ zSY%~u`71<}CJZ@=V8!-7e61gPKJffbW6`%K@7uHK>v`9?2fJNAb{5{?JhI(3$+9Gk3a+=U&O5d!=~p_58Wl za|dJjVC?H^yDx74%4V;P+aDYYG<~tL@GlUlG>WlCc>+VzzD&JNca$BneYrZLVPDJl ztBoS-`>DsR-X@JJ!Ex;sdLI#Ic6fMBj9&{UW;A&yt0FKdh9Ma#l?%t|m@EomNJ*L! zjAVLiY(^iQyh|T##HqOCOe_P@=Vz0LRsfqW*}Ioyz=g4Oetk|&L@c7<;`n{)b?)##?Yb((Dr8iLY z_I}~*-3qkaciB3+e|qA_Cw_8rZKT*YoX5ZR;bPm_eA`*9z`Z+HyYk-doV)wMSFL~c zxAB-tuUhWP&~RXf)r_pY$oU#Am+@D-cDcgJK2xjZ73{aGG$@rt;=@aeRA+mJW6Agu zNy%_Zd@EzTcddWJ?B#wRWku}LZ_pp7^bY`nQC{MGzTp#8%WADsA|lf^)9KG3@v*q8I{`w~}ud-J}%w<8<=!u}I^--)7k zDDNHG^p51*BkUE8MGlusUxQ*i=cC6Y?*B)W~K)BqPrqAV*RpiBu*i!Vpxm=%HPxO8rL zFkLMdZxG)JF=5i%RM!To`y_}@UUJg|IEKAfC8&{jXHyw*R^%jt;?1Oq($Yo+FzskE z9pjah=mSt(Z=%g}8O1fn|2k9Yj3`SaH^3FC_-uOFh{rNY-O?hB2_YKG803URQ;4)k z0S#g4H!1ih6m(Ny&=kk%l!ATuFJHj?Ni@Y_&=hU1oFnv2qch}M8T+cy%ugIy7Yg2| z!A~^pz7Z-m?anvtUb|dqI=phu%vcN;e1}%fZUwtX;9VqzE zBHh#R?r71|k@s}0RTVr3R!(hsIw_?y@9A6}DR?4CY25klOtEoizH#SfV|eBCR%ids ztHsX#d}segpwRhD&e68DbKvGoapypO=fFl+VJDK>&CQv}J#{{J<@G{S42?2ZdHuCJ zFBTfEqRy>-H(kZnzIsND!WwejN8>jih`{o&Z*AXqb4HuRVzz#I#2POUsq9- z4>THHas1a0O&Z^WA_|ke759&IuG0!z3DsaI9JihNy19nsBnG|g&?bDwKRM@Vy;gSU zIqEAv4SE9=finK-;pGtPE=@ol&#VN6Kr$U)#ssK% zPMgl|9zpL;f=8#NH(L@*7brGHK@>sBSX1Agt@6q=z*?yHH`jnTXt_Hk5pP>QWwJFW z!IXFL{~o~xT7$OTc(URWRL8Mh$jrcvRx6xqhc+6q?vjueu`50(P?&&Lm}@v&25lNOTvU!yqbeFRFq zAj)wmu}FN6^t+VemFJ+oh$a&=A|UFrtOR6ez_6HzLTdy02`DQ;pF}heG)N0c#WR$~ zV2q`>D6IwfvZDzPFf2<2^WsX@vf^x^ce4bl$Vv7HL;%*)(<~mB?fdo=pjf>j?o$ zWmV>ZU(JLebQX*Sb0!_8X)!Iwl95`HHt}>a$vNTLVJ(XE8VHaKw9iV-B#+#Jtb@K9 z5(UXvJ3Oz)sg&4ttR7<1NlaCPS`_JSNH|ftPBij_8bdj*ge)&1&2^UjMZP+ankji^ z32S_%Zc>lqN{#r|BB*LXsX4_XNUKE);xVYl1+0p+sB{jma8f#tP+RO!^JQi~A;DhA zCjA)&FHvxj0w(!>j#$<;d}(B`|1ii~CLE`b263zPMwFNH0^Rd61tNly=}MDJm8B&| zC-j;)m+R|Si-#cKOm1bN`2`;LNBFN3x4pT*-ilI_=q;MQeock^!-!j<`uAO6(V(rq zh6j9G72c=VBOq_x^2!4Um|~u|~UtsdXT0=jA!XA|g1&8H8_Ojy| ziqLRHwZS?l^=wQ+0|FFQ-ae&{=pa5+vq7VoM(Us7De?{kUMLpk@M2OC8%l)Y5qKPvG&kH+#4F;|J)1u2LoOCD?L_cE+FK-yJ}F$GD)At|Vg z(Jh>!Q5iKSGjS^6(Ha@a2AvD2p;S>5+W0N5{&Fr+|#jHZrs#BA|RfQ&4Rp3WlG9{4VK7x z7mqQ0PA@a?EB%B@{e24lfC9E4pf8@YF04EMJDq+>K{o|G6cB=uKGgz((eh6);Sz>@ z>YJ)MMzplr0*v=4X0N-wcrMvUK-Kzr|qo0j^I#%$V z2VAYho`m)j8?iqh+P@j<1M>Cv63fz?_xEo4_W>D~!`?FP?cp)IHT(BZM9*x!5N2q)su^JZ*R^zbFY8=*WW{#?9RnDVdxfy?9cMfU%1x5LL zqgNKkfBn$t<$ExI!MA9|Uu=YV6XqD_q8g5_h44!gKzOo-oQ z4h6U96wL6K+r?Ng6goH~z;0=6S`06_zic*PGk!mO|bg4Dz-uw?tZ12um!41q%s?7vJS{IpNN^{u;n5i9v zQ7MQZ09jn{(!@2L7M7z}go|P->mO7T!k1YB&sIH`xUN*6IeQhiRL@Oc&(@!TnQjK= zrE++PrNv9qhLPr$mlx+?wjnF-%W4d%j=4h!#yAz5Qmt4eTFD@xApz1KbL;|aD?kA?0P-8Bw@~gPv;qvaUs5AZ z>P!^{pF<(cXyPte(Mtb^0)~efJSI@A*=BGAf~wF@N%^Ic+rz9URM!i1S+xkZBNbCaG?kS*sGVgv~UPne6$t zuAjvTd5uXs>6vAMf=Lx8kvVJl#>tA%nFcmZBKJ}VDuD$n zc%a%rs2>Jy)(>rhP+>KJ^Rh#?hhU&OTXj4PWChm*n?yogX(l#HZ@)%qDK7qLl;aOh zZEZtqd9j}g(B@%P(*2(Jau`pOsO?->hhHfWmFi0CnOY>KwyYw^){sRAH8b^dP&H`sJuI!suO|b){plK1F+Hif=_-SMA$}5GYS4*`yL%Ao< z7JTP`EXokUONE9PfCzlughRUXzV1z5FVSTNF6mzH{bbCHVit`?hn^36T# zfsK(u^We%@iQZ)$%83(r^n=T~qz+cHG&SHL-yS@*i=UZ8?PH(f65Xo4foHkV~U3<++SLWUeKT3tkfzsA$=C#E!k+2)Ft;4$(*B4{KfjP^jDOb6giVzWH;-xUrCwObpHc_8j0+v%wR#=q`es? zp(VJ?*&d?m>B422)pb?RBT3#F)Z*8WybiVcrazA$akJIox57;9mWbS1eJCjn+E8H@ zxz^IwZ|WFT+`@yhsr2=#bE0KnnOV?V|f{9P5htdpT+e@b;Y$Y$nn3(k;rqr7h zPpXazpUl!UqXDAizGjG6DM0rIDPX{hE$7QbYKX2<@IUb|c_$(yQlI;#%Fzk+(~fUE zPOgS(v{}j2c%exknQ92ek_EfT*Tayt<~4Ng#PhkAg+froI{HziZHZmQ-hzLqME3>5 zhtM-vgFl+Aoy(==?PRT;WGw>Hh)t=omO9K@*6zn(H$&-vpdX6GYFey=l(Jf9lFx)D z1^MdP>h1>XyKmR(vWxqVSl#QjzE?0mnaf|RyPK@9EqsVa37+B8-vRe2 zIZ;+ooC?m8d{9{7nO3cD0!!jIwZ5WX3Cc4RU|p=dp$DI<_YwCsv1)y#(Gg^IZq}Iz z?s;PIjIy?I-;?d$MlY-JcDcAG%6F-CsI1o9OJ)07b3YZR3WZkvZSE)4AoEj!kF?&C z{mbo<4p-#GykJbmwH5VX7Lq?=szA z%><7C(72Y!G7zSBSJ+>q)aq7&O6@7la4_QH*oy3Bq%=HlVQV|9)WOqPjT5kfp`Ng; zI49_j^dB)mZZY-b!XkNgK-EVujz#Gy@feJCp}C}VEoxQ)Hgf(zYnlP2?qXuKNv~5d zPC*~eISE2U2SY|Cj79oB#jnbv2p!3MZ_ zu=lZ@Uhp{-{}le~dci%pKzBuQgQy3Zr~c9Of>HscLmSwrRbN#I))4llF%lp!#f-DG z-Vz0CNX7MLTCb>}>I5~FzCu+)*pv77*#ptz(P}&r;uzEvmIn@eA+t`s61sfBbUp%yjOt>7097 z1)2kvK+}6=;`FJpVFP0Rkg7|AhvUZ~Y6%0I2D%)kG&iy+&FcHd7Y?s1ZGQu<6$+ZJ zEzT{=iFhKGl2)nY5h~z!DF%E4?G!P8vN2GU8aC6!xh@G>R?wWPW-2Hz!YB?V!fIC% zEhKaE=YTr)xb0q)SwBlRseIp@xR9o`S0aU70j`TMtSYfOZq%&sVDk(IJpO7JHwD)& zj- z70$gdTWFkv1(;E`9k}(oTGKC?EsmB9muyGSR4C%<}XvfOcmO$kWrXnHPZ=RWWK%Yk1G6xyDr zr?u?6alP2GFW<6nO@NJY3v7&oTh05Z{rmFGJhAy%5NOtvTwpJ$*7oKDd)Frmf#cAq z8T=Sm_E{<4W^xN}Y#lfVN-cPJ<-(UnA?T)HA#l=4F$aYj+ND|01q*GDQ}rLAbi;;v zy?a9_v<}0HkL>DtXcf^z8oaB922Zs?{u+kKs}E-50?mC znk6c%x?Qc~Ve)i$Sn2Dq!mz&EVY<7%;n4V62 z;CH**ZMvJ*D319qUK4YO8rJGKpH?H5xpV|aIzNY{A3QOV_~z+gD-_Fe7{WAs?`eJF zn72l^U^mE_Mh_CKTGa?2iQ0{a~2IS9TZ2pftsY z$rg;}!7wb-)Y)2AEyOqhrZ}0o7@00Jos+I^B4Z1(Bjfg2ggfFQyqMKl)#*3;E+0 zipMAO$0u`7UCDW`=G<2w0?npbUp$%{Yh~jt-K0mG;83b|kVy|W883ljs%aO|Tx7in z>+6&SN+n~JY%?3hycYn)RHLsKsUt{0SAt@r8^O;yKkdvtru!g|MJx$Fj<^`kVq%_@ zU=kr&rC~fJPNoqsBXDjU!&HXE8j+im#vyam1tW3xod9KMQP`L>FavOjOWcx8#Ld#b zrH9N=F+ir&dVY<}Zj=T!h2s})&r^m`m=#YMMwy~=DIka^??ONXU}P)ULq1MD`C!j# za%1MR)TgQ3%ke@`08?kU-K-`y9{=p*rzdkSMhi`^0}7bjcaCp_KHK@}&O1VG>a{{s zw3H@P^=Eh9DfnKq)U4&kqXpmVxMVy`^ZF^5_}(ru-08}DyVf2ncn`x&$H<}U%uJ>` zYsU(~LukeW6d_6JJtU>~kd%JGkkY3O`mKl!dVm|mf0w%(SUnqc=7}51)1+B;h%F|5kDIn{ zmy4UWTjgpqmBmfiE&IBpXF6C9l6hd+QP$JkjQwO;CY+Y#Beu^uzkPYTA2A>Cf{!w` zh#hp!pRuSP?W==thK?y>_8z4);`W^LWBe|2h`uu%0En5}J{Nd7(TvO}rYO!C1NX7_RMrdjM0ffy5@6xDYo0iPJh z=5=z!38JnB-uM#HcQu!J1f*U)*4$Vz&%%a9&eoqzg~0=|6X|ihKYmksagpD|B1rSa z1dt%Ih*ds0JfR}KL7oDCJDvj7mBDH<#&42CKc+ohMA@9^`#D~;gq=Zc$_}mOA~7(g zyW#bWJqc5&U|BjN{urtpCsV^c zMEUwQ%Kjm>H%0-Y3rJ9x&|nZE9Cs3~z?P}BO&wz8hn2mPm9f04Z!Nza=T>OcYHJ7} zR0rD`Cfi_Y_wjJn!H}v`bL(J`g=;s9D4s#0hk(_9sW8pk;9Yc!{4{O`T5Z~SGgI7k zFu&_yao6$uuH(gBqxoHOJ~fD7g}nmyQ~C`qn*ejc3`08X5#Z`P!igXThGW$Hr%97#){w%lMGS?vj2d;!xZ$ z24rJKsZM~2tuqFZ(!ky8Wqh+KK`!TG6`!!A?l*)_dWc zu<6KbN{-GUC5=74Lh&VRx`kak`AQ5W1D;Ew^gNmcZG(Do4ja~Fc(oaq8PG16H1|rY zmWVRoK}EaMF0*@-9om)jTgy=1L}l_ZWz3|~#P&?#4T#2RYZkU3P`nzCia{b1mk;xP z7BN-_oan5l*^s7aA~-S3_|!<9XiSJW^QmXl{d}{AvUS8irT5rPuh8H+)09TRtN1UU zSGmq3-&DC6$?3C!byKbKSF;*9Ia~10L49vv{LQAlSSWb+5Tf6c_wHE>g6H!d2d1~? z16z;Mh6P9Stw%S4pHCKA&(W3zEqjS$+?#LNyMAP2vd}U_9AjuNnd$G%hxV>HG?T!^ zLgJF6^c-!Bl%Edy{8a*lG>^hs1N5pO&%NAyJCP|lEuypj988I zgIM(+Tsilp6+2qik;c1O6ACRy@n%X_T}#@ktJ)c4o(x}CA;!lUjjj?ItxdT1Mljs0 z*IfVTJ`2uA^jR?bHdM5F)WpRUw|5NV6DvFP9JH2l&4+*9r9kxd%IW$*PZnMGcXwl<{=Ulh`Udm_stg1RYb{#?i_$ zlb&fz8UKO`$ur=GM0a=r<0Ep(GR%Ql?j)g>0z=ntj zfrZ_)e=~_K#eGqYA=M>AkA=+wT$kBj!pv-2fy^Ar%7`f_bxLf_J%Snx)M}N&xprtXg6ar?xw8CF zmj?uq%Z^7~9$0CiP%86D=C%heWe0gnXkQNV7|}f@-0bVXzN*rj)MADkX+89il|xH; z->O{q25ysw(G1lR;ZWXxXw!cr*K~CK=z8Xpw?BS+J^lH_9Y^uZi}^Dz7S9OzGeYr< zls_XC&t&swvbodW%YE#nzO&gDB=5)z>R5PF_T`9vFjF18qC9D7D|K_$sICi6Iwpj0qMLYgB%F~Bf)@qL@z4=?Egg@zcECr7QuG3MPVFJ8fdT#1O5Tk zoq~Tx?_duC;*$4bU0lLo(OtYb!{*jEWiLE8xHyhb5kEBKSZ8D;jNh2R9ZTC*!= z?upX{?-@YC2VkS_!MW+(jq8SI=4NPLi8h<>pk?KKAr|~IWKe2>78kbq4{rp4by}WX z8UNCR^)%&hTR-WG`}1x6>tdk|h_JwuIYbQAGx=T5Z0>qCxAVEr?K$sI&OO8$T*B$mJD@h)n?g{jt?JKH*q1B(FoiWM zMeLGLl?AY7936k%xaF|dz3XEKk2c*0(Z;udy0ckRkPN5UeMi>gdGAv> z_fx8fZLzd1fy#I!_I?{m-mTJPB3i(yr0^*cI+FI$P$bSt+N4;40+M*r zClrtl)lz9njVdQQ?ob*9e~$n1f5NRK=z2kRZ~^BtZ`vh8aasQ)cI>j0Y_0o>h-73Ih zfho9{%K?2)IM_a5mX3ycNqoWmFk!@<9v+sX;wA$4xiP1yUEBepi`UH@ihi`0>;lV< z68A;!VEA3`_6RlTjRt*D&0P;IOx;;NW5WWze79&ZN;6b-+(mJ_T-WSOcKo8>r5MH@z*0Jy?N-mRvnESW z{WIxTEU5>0tEi~p$llMkeB z^dl>ID}?d;ZuDz!NMmjhj>Q-@Np@U9h^IJaXd7k6C_?7)ApIMf$U_)_Du^PzBlA2^ z+;7DBZVF6QsbE*+>k08qFa&yfHRWaCiXfFr5)kZS53Ww8-&CqEq~FA2UF3MWw4k^y zvcFW3IqZpyy(bWsZ2I{kZl}c>_L*RG1c`2$p*r3g{5Vreaf~CBBs`wVjwjQ!F`H|c z{Vkcak%JwTJsbk1!-m5;H|~1~tosI+F?ri0THsZHbviGRMFoC+Uc%}(5CnZAbK(~O zhb+v;aK%Bpp+%g0H?*v~=cWFhh5jDFgbp1Nd4e(rOY9Jmk!G0pB-2clAtQB9(z3o% zF(DQ@Hu+gJQ{@}_^8UU}|3I$k;2I=9?O%6h`1J(C`Ge45+u+y1!IWwb>G( z9L7!(o6UP4FoNgXX!YjcEb^dtG^$XaIOSfTkj?4a(lLBXV2?yol&nx8Nbwm5+dm2`O2DP&`SqL2g zxnq8=azNgKR?1n0#+?6q?2%!3@FrBgh2HcS-0y0Id8`o91Hv@>vXqc|j$tbf7(Xe* z++HNoTPPki2Q7hQ<|~BX$HBm3vj@Rs3^=-(|B55`y3sVWvX)A&InZUtnfr>KN*|lz zB&9);?*~T)T+%89Y>TzK6eBBA?pZQLF-9pe;*Bjz*f8#&mM0~k zT-u?)Cf`T!Rkhu2|CO!d?`)@kW!wEL+s_he&F8XDa`! literal 0 HcmV?d00001 diff --git a/blood_bank/__pycache__/urls.cpython-312.pyc b/blood_bank/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cae8fe8054dd0f198587ffa5c0e54d6fe8440ef6 GIT binary patch literal 4895 zcma)bN5ab_sY-6% zQ^+YCIg-jAd~|Mm&t;}+swSnXtx77Vy-jL!$|>L1EolYQu8Izyy1)OgyT9)FdZznt z)zy_g_|1I(*VFY{pYLB-$^Y)<3O~Ps(w}@WU(6r(CH#kezb{r2D~*>VN)Jn+EF20a zz7n6}kCiEpf%xkS!dt(L*)?*~TH8J!A`z9UQXNL$-Z{Z1<2IKz4EZ?DUXb zK=yFRZV%Z5WFLp@^^ko)4sghR4>)90qcfLymaJQ6R@T=9w42OK^A!mS`<&d9v$XOugIpmy&oCh+*As0Mk z2*^ba`KgCo1TxGampo(`$Yl;0@sP_vu5ifDJmd9CE`$ZUVW*A)k84Eg-i! zu3N<273nPMk~NTyH6qbajdorXX+=-NWLP__NV$Qgd32O$x}K2J(NmEQ4Ubq=l4*&} z=NC2KNd-~fWS~=6lm<3L&cW8Dqaf4X@*3@}={BERpt?ef{2JZia?$q{I8V>2u4f=U za`DhwKHTawk(2syMpv~Ygj`otWdRQqd33e}MIN>c4aJ^Z*aLK!TnjcNPO^xEfQoAQ zfGXAGIjpZnAmJJcWl1|%2yQ5&?oCFirH#xfJF%zqXB8<+muQ!f-FJ^6%po>n9m3x_VHYZ%E_n#tA@QvtO6}* z%CcETPnGCv-Ylsg-I`@1j+G%NN;3LOOtj~mGanRbw@a_pl<&>O@J@121QnEq& zBMLrfn4+GE(`|&2GAH~|CySIQQH{ic=W1Gx2X*xX6PP{^CP-9}s9;QBq($lWkyO^x zS_(1>N5rC3)WQ(|zb>L$A{AHgb=-#CJqx!j+twD-8ByjAGO=PQLXL9mHo63;5PVmk{ z?xQIKlP#B1DG5JUq#S*CQzBJp@Fqm6!DL%KUk8b141vp;kKpZw)T3!cgBKIhj0P_r zq!kTbEJ!;Vyf~0fG;P*hk(9=pnI-g~)3Hrf@tr6F!QWx3sa6*e^;>t3?(3C>$JTybkY+>8&rcw`WHgePKjICH> zE9OSb78JLaYC}{Tx>lUwh&3EBpL}TxU%3IQ4O4CD!+{gow<7!IuadT)xg%7Y#Nj$G z6{ls&YMCG?{Z5FuBI3tg&kw@m{H?|9E?4NKfGcaLl#>Ml_& z%+(@PTlHg~U6&cBRkT_~bAAh->SI3@H&HYz?gsjlsas4PxL$LHR;(ddQOOowxzCvT zoOaxCdEhipTFsN@C+oJb;l5zv7yPDQGW9E_c3mk>&#cumYcB2B!mj%@Q@>#<&8Ubq z9{J&OTiACcCca`~_f^K}ows`D&B$|Gc;U)SJ!b0k`+zgEWzB4vFBDric2Agk%GA5_ zQJH$i)Sl}yr!QpnLE62%hn7a63%?Te`;lsbzjQ*$8UpDUkmg!GQ=o1{gK5zo7R$$e9O7mi^gg)POrp~-y rb7ps}*&TCVwS_ZxgQ?q0?YLTVx~8oz$hQq!*mQTO`ui$^cjf;9PoFCX literal 0 HcmV?d00001 diff --git a/blood_bank/__pycache__/views.cpython-312.pyc b/blood_bank/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3de3f34d42e55a21fee08e3d3c1a269a2495e3b GIT binary patch literal 54475 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 literal 0 HcmV?d00001 diff --git a/blood_bank/admin.py b/blood_bank/admin.py new file mode 100644 index 00000000..dfd0d721 --- /dev/null +++ b/blood_bank/admin.py @@ -0,0 +1,387 @@ +from django.contrib import admin +from django.utils.html import format_html +from django.urls import reverse +from django.utils import timezone +from .models import ( + BloodGroup, Donor, BloodComponent, BloodUnit, BloodTest, CrossMatch, + BloodRequest, BloodIssue, Transfusion, AdverseReaction, InventoryLocation, + QualityControl +) + + +@admin.register(BloodGroup) +class BloodGroupAdmin(admin.ModelAdmin): + list_display = ['abo_type', 'rh_factor', 'display_name'] + list_filter = ['abo_type', 'rh_factor'] + ordering = ['abo_type', 'rh_factor'] + + +@admin.register(Donor) +class DonorAdmin(admin.ModelAdmin): + list_display = [ + 'donor_id', 'full_name', 'blood_group', 'age', 'status', + 'total_donations', 'last_donation_date', 'is_eligible_for_donation' + ] + list_filter = [ + 'status', 'donor_type', 'blood_group', 'gender', + 'registration_date', 'last_donation_date' + ] + search_fields = ['donor_id', 'first_name', 'last_name', 'phone', 'email'] + readonly_fields = ['registration_date', 'created_at', 'updated_at', 'age'] + fieldsets = ( + ('Personal Information', { + 'fields': ( + 'donor_id', 'first_name', 'last_name', 'date_of_birth', + 'gender', 'blood_group', 'weight', 'height' + ) + }), + ('Contact Information', { + 'fields': ( + 'phone', 'email', 'address', + 'emergency_contact_name', 'emergency_contact_phone' + ) + }), + ('Donation Information', { + 'fields': ( + 'donor_type', 'status', 'total_donations', + 'last_donation_date', 'notes' + ) + }), + ('System Information', { + 'fields': ('created_by', 'registration_date', 'created_at', 'updated_at'), + 'classes': ['collapse'] + }) + ) + + def is_eligible_for_donation(self, obj): + if obj.is_eligible_for_donation: + return format_html('✓ Eligible') + else: + return format_html('✗ Not Eligible') + + is_eligible_for_donation.short_description = 'Eligible' + + +@admin.register(BloodComponent) +class BloodComponentAdmin(admin.ModelAdmin): + list_display = ['name', 'shelf_life_days', 'storage_temperature', 'volume_ml', 'is_active'] + list_filter = ['is_active', 'shelf_life_days'] + search_fields = ['name', 'description'] + + +class BloodTestInline(admin.TabularInline): + model = BloodTest + extra = 0 + readonly_fields = ['test_date', 'verified_at'] + + +class CrossMatchInline(admin.TabularInline): + model = CrossMatch + extra = 0 + readonly_fields = ['test_date', 'verified_at'] + + +@admin.register(BloodUnit) +class BloodUnitAdmin(admin.ModelAdmin): + list_display = [ + 'unit_number', 'donor', 'component', 'blood_group', + 'collection_date', 'expiry_date', 'status', 'days_to_expiry', + 'is_available' + ] + list_filter = [ + 'status', 'component', 'blood_group', 'collection_date', + 'expiry_date', 'collection_site' + ] + search_fields = ['unit_number', 'donor__donor_id', 'donor__first_name', 'donor__last_name'] + readonly_fields = ['created_at', 'updated_at', 'days_to_expiry', 'is_expired'] + inlines = [BloodTestInline, CrossMatchInline] + + fieldsets = ( + ('Unit Information', { + 'fields': ( + 'unit_number', 'donor', 'component', 'blood_group', + 'volume_ml', 'status', 'location' + ) + }), + ('Collection Details', { + 'fields': ( + 'collection_date', 'expiry_date', 'collection_site', + 'bag_type', 'anticoagulant', 'collected_by' + ) + }), + ('Additional Information', { + 'fields': ('notes', 'created_at', 'updated_at'), + 'classes': ['collapse'] + }) + ) + + def days_to_expiry(self, obj): + days = obj.days_to_expiry + if days == 0: + return format_html('Expired') + elif days <= 3: + return format_html('{} days', days) + else: + return f"{days} days" + + days_to_expiry.short_description = 'Days to Expiry' + + def is_available(self, obj): + if obj.is_available: + return format_html('✓ Available') + else: + return format_html('✗ Not Available') + + is_available.short_description = 'Available' + + +@admin.register(BloodTest) +class BloodTestAdmin(admin.ModelAdmin): + list_display = [ + 'blood_unit', 'test_type', 'result', 'test_date', + 'tested_by', 'verified_by', 'verified_at' + ] + list_filter = ['test_type', 'result', 'test_date', 'verified_at'] + search_fields = ['blood_unit__unit_number', 'equipment_used', 'lot_number'] + readonly_fields = ['test_date', 'verified_at'] + + +@admin.register(CrossMatch) +class CrossMatchAdmin(admin.ModelAdmin): + list_display = [ + 'blood_unit', 'recipient', 'test_type', 'compatibility', + 'test_date', 'tested_by', 'verified_by' + ] + list_filter = ['test_type', 'compatibility', 'test_date'] + search_fields = [ + 'blood_unit__unit_number', 'recipient__first_name', + 'recipient__last_name', 'recipient__patient_id' + ] + readonly_fields = ['test_date', 'verified_at'] + + +class BloodIssueInline(admin.TabularInline): + model = BloodIssue + extra = 0 + readonly_fields = ['issue_date', 'expiry_time'] + + +@admin.register(BloodRequest) +class BloodRequestAdmin(admin.ModelAdmin): + list_display = [ + 'request_number', 'patient', 'component_requested', + 'units_requested', 'urgency', 'status', 'request_date', + 'required_by', 'is_overdue' + ] + list_filter = [ + 'urgency', 'status', 'component_requested', + 'requesting_department', 'request_date', 'required_by' + ] + search_fields = [ + 'request_number', 'patient__first_name', 'patient__last_name', + 'patient__patient_id', 'indication' + ] + readonly_fields = ['request_date', 'processed_at'] + inlines = [BloodIssueInline] + + fieldsets = ( + ('Request Information', { + 'fields': ( + 'request_number', 'patient', 'requesting_department', + 'requesting_physician', 'urgency', 'status' + ) + }), + ('Blood Requirements', { + 'fields': ( + 'component_requested', 'units_requested', 'patient_blood_group', + 'special_requirements' + ) + }), + ('Clinical Information', { + 'fields': ( + 'indication', 'hemoglobin_level', 'platelet_count' + ) + }), + ('Timeline', { + 'fields': ( + 'request_date', 'required_by', 'processed_by', 'processed_at' + ) + }), + ('Additional Information', { + 'fields': ('notes',), + 'classes': ['collapse'] + }) + ) + + def is_overdue(self, obj): + if obj.is_overdue: + return format_html('✗ Overdue') + else: + return format_html('✓ On Time') + + is_overdue.short_description = 'Status' + + +@admin.register(BloodIssue) +class BloodIssueAdmin(admin.ModelAdmin): + list_display = [ + 'blood_unit', 'blood_request', 'issued_by', 'issued_to', + 'issue_date', 'expiry_time', 'returned', 'is_expired' + ] + list_filter = ['returned', 'issue_date', 'expiry_time'] + search_fields = [ + 'blood_unit__unit_number', 'blood_request__request_number', + 'blood_request__patient__first_name', 'blood_request__patient__last_name' + ] + readonly_fields = ['issue_date', 'is_expired'] + + def is_expired(self, obj): + if obj.is_expired: + return format_html('✗ Expired') + else: + return format_html('✓ Valid') + + is_expired.short_description = 'Status' + + +class AdverseReactionInline(admin.TabularInline): + model = AdverseReaction + extra = 0 + readonly_fields = ['onset_time', 'report_date'] + + +@admin.register(Transfusion) +class TransfusionAdmin(admin.ModelAdmin): + list_display = [ + 'blood_issue', 'start_time', 'end_time', 'status', + 'volume_transfused', 'administered_by', 'duration_minutes' + ] + list_filter = ['status', 'start_time', 'patient_consent'] + search_fields = [ + 'blood_issue__blood_unit__unit_number', + 'blood_issue__blood_request__patient__first_name', + 'blood_issue__blood_request__patient__last_name' + ] + readonly_fields = ['duration_minutes'] + inlines = [AdverseReactionInline] + + fieldsets = ( + ('Transfusion Information', { + 'fields': ( + 'blood_issue', 'start_time', 'end_time', 'status', + 'volume_transfused', 'transfusion_rate' + ) + }), + ('Personnel', { + 'fields': ('administered_by', 'witnessed_by') + }), + ('Consent', { + 'fields': ('patient_consent', 'consent_date') + }), + ('Vital Signs', { + 'fields': ('pre_transfusion_vitals', 'post_transfusion_vitals'), + 'classes': ['collapse'] + }), + ('Additional Information', { + 'fields': ('notes',), + 'classes': ['collapse'] + }) + ) + + +@admin.register(AdverseReaction) +class AdverseReactionAdmin(admin.ModelAdmin): + list_display = [ + 'transfusion', 'reaction_type', 'severity', 'onset_time', + 'reported_by', 'regulatory_reported' + ] + list_filter = [ + 'reaction_type', 'severity', 'onset_time', + 'regulatory_reported' + ] + search_fields = [ + 'transfusion__blood_issue__blood_unit__unit_number', + 'symptoms', 'treatment_given' + ] + readonly_fields = ['onset_time', 'report_date'] + + fieldsets = ( + ('Reaction Information', { + 'fields': ( + 'transfusion', 'reaction_type', 'severity', + 'onset_time', 'symptoms' + ) + }), + ('Treatment', { + 'fields': ('treatment_given', 'outcome') + }), + ('Reporting', { + 'fields': ( + 'reported_by', 'investigated_by', 'investigation_notes', + 'regulatory_reported', 'report_date' + ) + }) + ) + + +@admin.register(InventoryLocation) +class InventoryLocationAdmin(admin.ModelAdmin): + list_display = [ + 'name', 'location_type', 'temperature_range', + 'current_stock', 'capacity', 'utilization_percentage', 'is_active' + ] + list_filter = ['location_type', 'is_active'] + search_fields = ['name', 'notes'] + + def utilization_percentage(self, obj): + percentage = obj.utilization_percentage + if percentage >= 90: + color = 'red' + elif percentage >= 75: + color = 'orange' + else: + color = 'green' + return format_html( + '{:.1f}%', + color, percentage + ) + + utilization_percentage.short_description = 'Utilization' + + +@admin.register(QualityControl) +class QualityControlAdmin(admin.ModelAdmin): + list_display = [ + 'test_type', 'test_date', 'equipment_tested', + 'status', 'performed_by', 'reviewed_by', 'next_test_date' + ] + list_filter = ['test_type', 'status', 'test_date', 'next_test_date'] + search_fields = ['equipment_tested', 'parameters_tested', 'corrective_action'] + readonly_fields = ['test_date'] + + fieldsets = ( + ('Test Information', { + 'fields': ( + 'test_type', 'test_date', 'equipment_tested', + 'parameters_tested' + ) + }), + ('Results', { + 'fields': ( + 'expected_results', 'actual_results', 'status' + ) + }), + ('Personnel', { + 'fields': ('performed_by', 'reviewed_by') + }), + ('Follow-up', { + 'fields': ('corrective_action', 'next_test_date') + }) + ) + + +# Custom admin site configuration +admin.site.site_header = "Blood Bank Management System" +admin.site.site_title = "Blood Bank Admin" +admin.site.index_title = "Blood Bank Administration" + diff --git a/blood_bank/apps.py b/blood_bank/apps.py new file mode 100644 index 00000000..d8016264 --- /dev/null +++ b/blood_bank/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class BloodBankConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'blood_bank' + verbose_name = 'Blood Bank Management' + diff --git a/blood_bank/forms.py b/blood_bank/forms.py new file mode 100644 index 00000000..a187e648 --- /dev/null +++ b/blood_bank/forms.py @@ -0,0 +1,429 @@ +from django import forms +from django.contrib.auth.models import User +from django.utils import timezone +from datetime import timedelta +from patients.models import PatientProfile +from core.models import Department +from .models import ( + BloodGroup, Donor, BloodComponent, BloodUnit, BloodTest, CrossMatch, + BloodRequest, BloodIssue, Transfusion, AdverseReaction, InventoryLocation, + QualityControl +) + + +class DonorForm(forms.ModelForm): + """Form for donor registration and updates""" + + class Meta: + model = Donor + fields = [ + 'donor_id', 'first_name', 'last_name', 'date_of_birth', + 'gender', 'blood_group', 'phone', 'email', 'address', + 'emergency_contact_name', 'emergency_contact_phone', + 'donor_type', 'status', 'weight', 'height', 'notes' + ] + widgets = { + 'date_of_birth': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}), + 'first_name': forms.TextInput(attrs={'class': 'form-control'}), + 'last_name': forms.TextInput(attrs={'class': 'form-control'}), + 'donor_id': forms.TextInput(attrs={'class': 'form-control'}), + 'gender': forms.Select(attrs={'class': 'form-select'}), + 'blood_group': forms.Select(attrs={'class': 'form-select'}), + 'phone': forms.TextInput(attrs={'class': 'form-control'}), + 'email': forms.EmailInput(attrs={'class': 'form-control'}), + 'address': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'emergency_contact_name': forms.TextInput(attrs={'class': 'form-control'}), + 'emergency_contact_phone': forms.TextInput(attrs={'class': 'form-control'}), + 'donor_type': forms.Select(attrs={'class': 'form-select'}), + 'status': forms.Select(attrs={'class': 'form-select'}), + 'weight': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'height': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def clean_weight(self): + weight = self.cleaned_data.get('weight') + if weight and weight < 45.0: + raise forms.ValidationError("Minimum weight for donation is 45 kg.") + return weight + + def clean_date_of_birth(self): + dob = self.cleaned_data.get('date_of_birth') + if dob: + today = timezone.now().date() + age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) + if age < 18: + raise forms.ValidationError("Donor must be at least 18 years old.") + if age > 65: + raise forms.ValidationError("Donor must be under 65 years old.") + return dob + + +class BloodUnitForm(forms.ModelForm): + """Form for blood unit registration""" + + class Meta: + model = BloodUnit + fields = [ + 'unit_number', 'donor', 'component', 'blood_group', + 'collection_date', 'volume_ml', 'location', 'bag_type', + 'anticoagulant', 'collection_site', 'notes' + ] + widgets = { + 'unit_number': forms.TextInput(attrs={'class': 'form-control'}), + 'donor': forms.Select(attrs={'class': 'form-select'}), + 'component': forms.Select(attrs={'class': 'form-select'}), + 'blood_group': forms.Select(attrs={'class': 'form-select'}), + 'collection_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'volume_ml': forms.NumberInput(attrs={'class': 'form-control'}), + 'location': forms.TextInput(attrs={'class': 'form-control'}), + 'bag_type': forms.TextInput(attrs={'class': 'form-control'}), + 'anticoagulant': forms.TextInput(attrs={'class': 'form-control'}), + 'collection_site': forms.TextInput(attrs={'class': 'form-control'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter active donors only + self.fields['donor'].queryset = Donor.objects.filter(status='active') + self.fields['component'].queryset = BloodComponent.objects.filter(is_active=True) + + def save(self, commit=True): + instance = super().save(commit=False) + if not instance.expiry_date: + # Calculate expiry date based on component + component = instance.component + instance.expiry_date = instance.collection_date + timedelta(days=component.shelf_life_days) + if commit: + instance.save() + return instance + + +class BloodTestForm(forms.ModelForm): + """Form for blood test results""" + + class Meta: + model = BloodTest + fields = [ + 'blood_unit', 'test_type', 'result', 'test_date', + 'equipment_used', 'lot_number', 'notes' + ] + widgets = { + 'blood_unit': forms.Select(attrs={'class': 'form-select'}), + 'test_type': forms.Select(attrs={'class': 'form-select'}), + 'result': forms.Select(attrs={'class': 'form-select'}), + 'test_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'equipment_used': forms.TextInput(attrs={'class': 'form-control'}), + 'lot_number': forms.TextInput(attrs={'class': 'form-control'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter blood units that are in testing or quarantine + self.fields['blood_unit'].queryset = BloodUnit.objects.filter( + status__in=['collected', 'testing', 'quarantine'] + ) + + +class CrossMatchForm(forms.ModelForm): + """Form for crossmatch testing""" + + class Meta: + model = CrossMatch + fields = [ + 'blood_unit', 'recipient', 'test_type', 'compatibility', + 'test_date', 'temperature', 'incubation_time', 'notes' + ] + widgets = { + 'blood_unit': forms.Select(attrs={'class': 'form-select'}), + 'recipient': forms.Select(attrs={'class': 'form-select'}), + 'test_type': forms.Select(attrs={'class': 'form-select'}), + 'compatibility': forms.Select(attrs={'class': 'form-select'}), + 'test_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'temperature': forms.TextInput(attrs={'class': 'form-control'}), + 'incubation_time': forms.NumberInput(attrs={'class': 'form-control'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter available blood units + self.fields['blood_unit'].queryset = BloodUnit.objects.filter( + status__in=['available', 'quarantine'] + ) + + +class BloodRequestForm(forms.ModelForm): + """Form for blood transfusion requests""" + + class Meta: + model = BloodRequest + fields = [ + 'patient', 'requesting_department', 'component_requested', + 'units_requested', 'urgency', 'indication', 'special_requirements', + 'patient_blood_group', 'hemoglobin_level', 'platelet_count', + 'required_by' + ] + widgets = { + 'patient': forms.Select(attrs={'class': 'form-select'}), + 'requesting_department': forms.Select(attrs={'class': 'form-select'}), + 'component_requested': forms.Select(attrs={'class': 'form-select'}), + 'units_requested': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}), + 'urgency': forms.Select(attrs={'class': 'form-select'}), + 'indication': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'special_requirements': forms.Textarea(attrs={'class': 'form-control', 'rows': 2}), + 'patient_blood_group': forms.Select(attrs={'class': 'form-select'}), + 'hemoglobin_level': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'platelet_count': forms.NumberInput(attrs={'class': 'form-control'}), + 'required_by': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['component_requested'].queryset = BloodComponent.objects.filter(is_active=True) + + def clean_required_by(self): + required_by = self.cleaned_data.get('required_by') + if required_by and required_by <= timezone.now(): + raise forms.ValidationError("Required by date must be in the future.") + return required_by + + +class BloodIssueForm(forms.ModelForm): + """Form for blood unit issuance""" + + class Meta: + model = BloodIssue + fields = [ + 'blood_request', 'blood_unit', 'crossmatch', + 'issued_to', 'expiry_time', 'notes' + ] + widgets = { + 'blood_request': forms.Select(attrs={'class': 'form-select'}), + 'blood_unit': forms.Select(attrs={'class': 'form-select'}), + 'crossmatch': forms.Select(attrs={'class': 'form-select'}), + 'issued_to': forms.Select(attrs={'class': 'form-select'}), + 'expiry_time': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter pending/processing blood requests + self.fields['blood_request'].queryset = BloodRequest.objects.filter( + status__in=['pending', 'processing', 'ready'] + ) + # Filter available blood units + self.fields['blood_unit'].queryset = BloodUnit.objects.filter(status='available') + # Filter staff users + self.fields['issued_to'].queryset = User.objects.filter(is_staff=True) + + +class TransfusionForm(forms.ModelForm): + """Form for transfusion administration""" + + class Meta: + model = Transfusion + fields = [ + 'blood_issue', 'start_time', 'end_time', 'status', + 'volume_transfused', 'transfusion_rate', 'witnessed_by', + 'patient_consent', 'consent_date', 'notes' + ] + widgets = { + 'blood_issue': forms.Select(attrs={'class': 'form-select'}), + 'start_time': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'end_time': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'status': forms.Select(attrs={'class': 'form-select'}), + 'volume_transfused': forms.NumberInput(attrs={'class': 'form-control'}), + 'transfusion_rate': forms.TextInput(attrs={'class': 'form-control'}), + 'witnessed_by': forms.Select(attrs={'class': 'form-select'}), + 'patient_consent': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'consent_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter issued blood units + self.fields['blood_issue'].queryset = BloodIssue.objects.filter(returned=False) + # Filter staff users for witness + self.fields['witnessed_by'].queryset = User.objects.filter(is_staff=True) + + +class AdverseReactionForm(forms.ModelForm): + """Form for adverse reaction reporting""" + + class Meta: + model = AdverseReaction + fields = [ + 'transfusion', 'reaction_type', 'severity', 'onset_time', + 'symptoms', 'treatment_given', 'outcome', 'investigation_notes', + 'regulatory_reported' + ] + widgets = { + 'transfusion': forms.Select(attrs={'class': 'form-select'}), + 'reaction_type': forms.Select(attrs={'class': 'form-select'}), + 'severity': forms.Select(attrs={'class': 'form-select'}), + 'onset_time': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'symptoms': forms.Textarea(attrs={'class': 'form-control', 'rows': 4}), + 'treatment_given': forms.Textarea(attrs={'class': 'form-control', 'rows': 4}), + 'outcome': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'investigation_notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'regulatory_reported': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + } + + +class InventoryLocationForm(forms.ModelForm): + """Form for inventory location management""" + + class Meta: + model = InventoryLocation + fields = [ + 'name', 'location_type', 'temperature_range', + 'capacity', 'is_active', 'notes' + ] + widgets = { + 'name': forms.TextInput(attrs={'class': 'form-control'}), + 'location_type': forms.Select(attrs={'class': 'form-select'}), + 'temperature_range': forms.TextInput(attrs={'class': 'form-control'}), + 'capacity': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}), + 'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + } + + +class QualityControlForm(forms.ModelForm): + """Form for quality control testing""" + + class Meta: + model = QualityControl + fields = [ + 'test_type', 'test_date', 'equipment_tested', + 'parameters_tested', 'expected_results', 'actual_results', + 'status', 'corrective_action', 'next_test_date' + ] + widgets = { + 'test_type': forms.Select(attrs={'class': 'form-select'}), + 'test_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + 'equipment_tested': forms.TextInput(attrs={'class': 'form-control'}), + 'parameters_tested': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'expected_results': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'actual_results': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'status': forms.Select(attrs={'class': 'form-select'}), + 'corrective_action': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'next_test_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}), + } + + +class DonorEligibilityForm(forms.Form): + """Form for donor eligibility screening""" + + # Basic health questions + feeling_well = forms.BooleanField( + label="Are you feeling well today?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + adequate_sleep = forms.BooleanField( + label="Did you get adequate sleep last night?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + eaten_today = forms.BooleanField( + label="Have you eaten within the last 4 hours?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + # Medical history + recent_illness = forms.BooleanField( + required=False, + label="Have you had any illness in the past 2 weeks?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + medications = forms.BooleanField( + required=False, + label="Are you currently taking any medications?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + recent_travel = forms.BooleanField( + required=False, + label="Have you traveled outside the country in the past 3 months?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + # Risk factors + recent_tattoo = forms.BooleanField( + required=False, + label="Have you had a tattoo or piercing in the past 12 months?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + recent_surgery = forms.BooleanField( + required=False, + label="Have you had any surgery in the past 12 months?", + widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) + ) + + # Additional notes + notes = forms.CharField( + required=False, + label="Additional notes or concerns", + widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 3}) + ) + + def clean(self): + cleaned_data = super().clean() + + # Check mandatory requirements + if not cleaned_data.get('feeling_well'): + raise forms.ValidationError("Donor must be feeling well to donate.") + + if not cleaned_data.get('adequate_sleep'): + raise forms.ValidationError("Donor must have adequate sleep before donation.") + + if not cleaned_data.get('eaten_today'): + raise forms.ValidationError("Donor must have eaten within the last 4 hours.") + + return cleaned_data + + +class BloodInventorySearchForm(forms.Form): + """Form for searching blood inventory""" + + blood_group = forms.ModelChoiceField( + queryset=BloodGroup.objects.all(), + required=False, + empty_label="All Blood Groups", + widget=forms.Select(attrs={'class': 'form-select'}) + ) + + component = forms.ModelChoiceField( + queryset=BloodComponent.objects.filter(is_active=True), + required=False, + empty_label="All Components", + widget=forms.Select(attrs={'class': 'form-select'}) + ) + + status = forms.ChoiceField( + choices=[('', 'All Statuses')] + BloodUnit.STATUS_CHOICES, + required=False, + widget=forms.Select(attrs={'class': 'form-select'}) + ) + + location = forms.ModelChoiceField( + queryset=InventoryLocation.objects.filter(is_active=True), + required=False, + empty_label="All Locations", + widget=forms.Select(attrs={'class': 'form-select'}) + ) + + expiry_days = forms.IntegerField( + required=False, + label="Expiring within (days)", + widget=forms.NumberInput(attrs={'class': 'form-control', 'min': '0'}) + ) + diff --git a/blood_bank/management/__init__.py b/blood_bank/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/blood_bank/management/__pycache__/__init__.cpython-312.pyc b/blood_bank/management/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..504142e7d148e4c616b71f526da31940a35ddc42 GIT binary patch literal 194 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

@3 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 JibP2H{|{EI1JwWk literal 0 HcmV?d00001 diff --git a/blood_bank/management/commands/blood_bank_data.py b/blood_bank/management/commands/blood_bank_data.py new file mode 100644 index 00000000..4f894f03 --- /dev/null +++ b/blood_bank/management/commands/blood_bank_data.py @@ -0,0 +1,339 @@ +import random +from datetime import datetime, timedelta +from django.core.management.base import BaseCommand +from django.utils import timezone +from django.db import transaction + +from accounts.models import User +from blood_bank.models import ( + BloodGroup, Donor, BloodComponent, BloodUnit, BloodTest, + BloodRequest, InventoryLocation, QualityControl +) +from patients.models import PatientProfile +from core.models import Department + + +class Command(BaseCommand): + help = 'Generate Saudi-influenced blood bank test data' + + def add_arguments(self, parser): + parser.add_argument('--donors', type=int, default=50, help='Number of donors to create (default: 50)') + parser.add_argument('--units', type=int, default=100, help='Number of blood units to create (default: 100)') + + def handle(self, *args, **options): + self.stdout.write(self.style.SUCCESS('Starting Saudi blood bank data generation...')) + try: + with transaction.atomic(): + users = list(User.objects.all()) + patients = list(PatientProfile.objects.all()) + departments = list(Department.objects.all()) + + if not users: + self.stdout.write(self.style.ERROR('No users found. Please create users first.')) + return + + self.create_blood_groups() + self.create_blood_components() + self.create_inventory_locations() + + donors = self.create_saudi_donors(options['donors'], users) + blood_units = self.create_blood_units(options['units'], donors, users) + self.create_blood_tests(blood_units, users) + + if patients and departments: + self.create_blood_requests(20, patients, departments, users) + + self.create_quality_control_records(users) + + except Exception as e: + self.stdout.write(self.style.ERROR(f'Error: {str(e)}')) + return + + self.stdout.write(self.style.SUCCESS('Saudi blood bank data generation completed!')) + + # ---------- seeders ---------- + + def create_blood_groups(self): + """Create ABO/Rh blood groups with correct choices (POS/NEG).""" + blood_groups = [ + ('A', 'POS'), ('A', 'NEG'), + ('B', 'POS'), ('B', 'NEG'), + ('AB', 'POS'), ('AB', 'NEG'), + ('O', 'POS'), ('O', 'NEG'), + ] + for abo, rh in blood_groups: + BloodGroup.objects.get_or_create(abo_type=abo, rh_factor=rh) + self.stdout.write('✓ Created blood groups') + + def create_blood_components(self): + """Create blood components with required fields.""" + components = [ + # (name, volume_ml, shelf_life_days, storage_temperature, description) + ('whole_blood', 450, 35, '2–6°C', 'Whole blood unit'), + ('packed_rbc', 300, 42, '2–6°C', 'Packed red blood cells'), + ('fresh_frozen_plasma', 250, 365, '≤ -18°C', 'Fresh frozen plasma'), + ('platelets', 50, 5, '20–24°C with agitation', 'Platelet concentrate'), + # Optional extras (your model allows them) + ('cryoprecipitate', 15, 365, '≤ -18°C', 'Cryoprecipitated AHF'), + ('granulocytes', 200, 1, '20–24°C', 'Granulocyte concentrate'), + ] + for name, volume, shelf_life, temp, desc in components: + BloodComponent.objects.get_or_create( + name=name, + defaults={ + 'description': desc, + 'shelf_life_days': shelf_life, + 'storage_temperature': temp, + 'volume_ml': volume, + 'is_active': True + } + ) + self.stdout.write('✓ Created blood components') + + def create_inventory_locations(self): + """Create storage locations with required fields.""" + locations = [ + # (name, type, capacity, temperature_range) + ('Main Refrigerator A', 'refrigerator', 100, '2–6°C'), + ('Main Refrigerator B', 'refrigerator', 100, '2–6°C'), + ('Platelet Agitator 1', 'platelet_agitator', 30, '20–24°C'), + ('Plasma Freezer A', 'freezer', 200, '≤ -18°C'), + ('Quarantine Storage', 'quarantine', 50, '2–6°C'), + ('Testing Area 1', 'testing', 20, 'Room temp'), + ] + for name, loc_type, capacity, temp_range in locations: + InventoryLocation.objects.get_or_create( + name=name, + defaults={ + 'location_type': loc_type, + 'temperature_range': temp_range, + 'capacity': capacity, + 'is_active': True, + 'current_stock': 0, + } + ) + self.stdout.write('✓ Created inventory locations') + + def create_saudi_donors(self, count, users): + """Create Saudi-influenced donors aligned with Donor model fields.""" + saudi_male_names = [ + 'Abdullah', 'Mohammed', 'Ahmed', 'Ali', 'Omar', 'Khalid', 'Fahd', 'Salman', + 'Faisal', 'Turki', 'Nasser', 'Saud', 'Bandar', 'Majid', 'Waleed', 'Yazeed', + 'Abdulaziz', 'Abdulrahman', 'Ibrahim', 'Hassan', 'Hussein', 'Mansour' + ] + saudi_female_names = [ + 'Fatima', 'Aisha', 'Maryam', 'Khadija', 'Zainab', 'Noura', 'Sarah', 'Hala', + 'Reem', 'Lama', 'Nada', 'Rana', 'Dina', 'Lina', 'Maha', 'Wafa', 'Amal', + 'Najla', 'Huda', 'Layla', 'Nour', 'Ghada', 'Rania' + ] + saudi_family_names = [ + 'Al-Saud', 'Al-Rashid', 'Al-Otaibi', 'Al-Dosari', 'Al-Harbi', 'Al-Zahrani', + 'Al-Ghamdi', 'Al-Qahtani', 'Al-Mutairi', 'Al-Malki', 'Al-Subai', 'Al-Shehri', + 'Al-Dawsari', 'Al-Enezi', 'Al-Rasheed', 'Al-Faraj', 'Al-Mansour', 'Al-Nasser' + ] + + blood_groups = list(BloodGroup.objects.all()) + created_by = random.choice(users) + + donors = [] + for i in range(count): + try: + gender = random.choice(['M', 'F']) + first_name = random.choice(saudi_male_names if gender == 'M' else saudi_female_names) + last_name = random.choice(saudi_family_names) + + national_id = f"{random.choice([1, 2])}{random.randint(100000000, 999999999)}" # 10 digits + donor_id = f"SA{random.randint(100000, 999999)}" + + age = random.randint(18, 65) + birth_date = timezone.now().date() - timedelta(days=age * 365) + + phone = f"+966{random.choice([50, 51, 52, 53, 54, 55])}{random.randint(1000000, 9999999)}" + weight = random.randint(60, 120) if gender == 'M' else random.randint(45, 90) + height = random.randint(150, 190) + + blood_group = random.choice(blood_groups) + + donor = Donor.objects.create( + donor_id=donor_id, + first_name=first_name, + last_name=last_name, + date_of_birth=birth_date, + gender=gender, + blood_group=blood_group, + national_id=national_id, + phone=phone, # field is `phone` + email=f"{first_name.lower()}.{last_name.lower().replace('-', '').replace(' ', '')}@gmail.com", + address=f"{random.randint(1, 999)} King Fahd Road, Saudi Arabia", + emergency_contact_name=f"{random.choice(saudi_male_names + saudi_female_names)} {random.choice(saudi_family_names)}", + emergency_contact_phone=f"+966{random.choice([50, 51, 52, 53, 54, 55])}{random.randint(1000000, 9999999)}", + donor_type='voluntary', + status='active', + last_donation_date=timezone.now() - timedelta(days=random.randint(60, 365)) if random.random() < 0.6 else None, + total_donations=random.randint(0, 10), + weight=weight, + height=height, + notes="Saudi donor", + created_by=created_by, # required + ) + donors.append(donor) + except Exception as e: + self.stdout.write(f"Error creating donor {i}: {str(e)}") + continue + + self.stdout.write(f'✓ Created {len(donors)} Saudi donors') + return donors + + def create_blood_units(self, count, donors, users): + """Create blood units; save location as string and update stock.""" + if not donors: + self.stdout.write('No donors available for blood units') + return [] + + components = list(BloodComponent.objects.filter(is_active=True)) + locations = list(InventoryLocation.objects.filter(is_active=True)) + blood_units = [] + + for i in range(count): + try: + donor = random.choice(donors) + component = random.choice(components) + inv = random.choice(locations) + + unit_number = f"SA{timezone.now().year}{random.randint(100000, 999999)}" + collection_date = timezone.now() - timedelta(days=random.randint(0, 30)) + expiry_date = collection_date + timedelta(days=component.shelf_life_days) + + status = random.choice(['available', 'reserved', 'issued', 'collected', 'testing', 'quarantine']) + + blood_unit = BloodUnit.objects.create( + unit_number=unit_number, + donor=donor, + blood_group=donor.blood_group, + component=component, + volume_ml=component.volume_ml, + collection_date=collection_date, + expiry_date=expiry_date, + status=status, + location=inv.name, # CharField on model + collected_by=random.choice(users), + collection_site='King Fahd Medical City Blood Bank', + bag_type='single', + anticoagulant='CPDA-1', + notes=f"Collected from donor {donor.donor_id}" + ) + blood_units.append(blood_unit) + + # Update inventory stock (bounded by capacity) + inv.current_stock = min(inv.capacity, inv.current_stock + 1) + inv.save(update_fields=['current_stock']) + + except Exception as e: + self.stdout.write(f"Error creating blood unit {i}: {str(e)}") + continue + + self.stdout.write(f'✓ Created {len(blood_units)} blood units') + return blood_units + + def create_blood_tests(self, blood_units, users): + """Create infectious disease tests for each unit.""" + test_types = ['hiv', 'hbv', 'hcv', 'syphilis'] # must match TEST_TYPE_CHOICES keys + + for unit in blood_units: + try: + for test_type in test_types: + result = random.choices(['negative', 'positive'], weights=[0.95, 0.05])[0] + BloodTest.objects.create( + blood_unit=unit, + test_type=test_type, + result=result, + test_date=unit.collection_date + timedelta(hours=random.randint(2, 24)), + tested_by=random.choice(users), + equipment_used=f"Abbott PRISM {random.randint(1000, 9999)}", + lot_number=f"LOT{random.randint(100000, 999999)}", + notes="Routine infectious disease screening" + ) + except Exception as e: + self.stdout.write(f"Error creating tests for unit {unit.unit_number}: {str(e)}") + continue + + self.stdout.write(f'✓ Created blood tests for {len(blood_units)} units') + + def create_blood_requests(self, count, patients, departments, users): + """Create blood requests from departments.""" + components = list(BloodComponent.objects.filter(is_active=True)) + blood_groups = list(BloodGroup.objects.all()) + + for i in range(count): + try: + patient = random.choice(patients) + department = random.choice(departments) + component = random.choice(components) + + request_number = f"REQ{timezone.now().year}{random.randint(10000, 99999)}" + indications = [ + 'Surgical blood loss during cardiac surgery', + 'Anemia secondary to chronic kidney disease', + 'Postpartum hemorrhage', + 'Trauma-related blood loss', + 'Chemotherapy-induced anemia' + ] + urgency = random.choice(['routine', 'urgent', 'emergency']) + status = random.choice(['pending', 'processing', 'ready']) + + request_date = timezone.now() - timedelta(days=random.randint(0, 7)) + required_by = request_date + timedelta(hours=random.randint(2, 48)) + + BloodRequest.objects.create( + request_number=request_number, + patient=patient, + requesting_department=department, + requesting_physician=random.choice(users), + component_requested=component, + units_requested=random.randint(1, 3), + urgency=urgency, + indication=random.choice(indications), + patient_blood_group=random.choice(blood_groups), + hemoglobin_level=round(random.uniform(7.0, 12.0), 1), + status=status, + # auto_now_add request_date on model; we still set required_by + required_by=required_by, + notes=f"Request from {department.name}" + ) + except Exception as e: + self.stdout.write(f"Error creating blood request {i}: {str(e)}") + continue + + self.stdout.write('✓ Created blood requests') + + def create_quality_control_records(self, users): + """Create quality control records.""" + test_types = ['temperature_monitoring', 'equipment_calibration', 'reagent_testing'] + for i in range(10): + try: + test_type = random.choice(test_types) + status = random.choice(['pass', 'fail', 'pending']) + performed_by = random.choice(users) + qc = QualityControl.objects.create( + test_type=test_type, + test_date=timezone.now() - timedelta(days=random.randint(0, 30)), + equipment_tested=f"Equipment {random.randint(1000, 9999)}", + parameters_tested="Temperature range, accuracy", + expected_results="Within acceptable limits", + actual_results="Pass" if status == 'pass' else "Out of range" if status == 'fail' else "Pending", + status=status, + performed_by=performed_by, + corrective_action="Recalibration performed" if status == 'fail' else "", + next_test_date=timezone.now() + timedelta(days=30) + ) + # Optionally auto-review passes + if status == 'pass' and random.random() < 0.5: + qc.reviewed_by = random.choice(users) + qc.review_date = timezone.now() + qc.review_notes = "Reviewed and verified." + qc.save(update_fields=['reviewed_by', 'review_date', 'review_notes']) + except Exception as e: + self.stdout.write(f"Error creating QC record {i}: {str(e)}") + continue + + self.stdout.write('✓ Created quality control records') \ No newline at end of file diff --git a/blood_bank/migrations/0001_initial.py b/blood_bank/migrations/0001_initial.py new file mode 100644 index 00000000..5c595c34 --- /dev/null +++ b/blood_bank/migrations/0001_initial.py @@ -0,0 +1,925 @@ +# Generated by Django 5.2.4 on 2025-09-04 15:11 + +import django.core.validators +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("core", "0001_initial"), + ("patients", "0007_alter_consenttemplate_category"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="BloodComponent", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + choices=[ + ("whole_blood", "Whole Blood"), + ("packed_rbc", "Packed Red Blood Cells"), + ("fresh_frozen_plasma", "Fresh Frozen Plasma"), + ("platelets", "Platelets"), + ("cryoprecipitate", "Cryoprecipitate"), + ("granulocytes", "Granulocytes"), + ], + max_length=50, + unique=True, + ), + ), + ("description", models.TextField()), + ("shelf_life_days", models.PositiveIntegerField()), + ("storage_temperature", models.CharField(max_length=50)), + ("volume_ml", models.PositiveIntegerField()), + ("is_active", models.BooleanField(default=True)), + ], + options={ + "ordering": ["name"], + }, + ), + migrations.CreateModel( + name="InventoryLocation", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100, unique=True)), + ( + "location_type", + models.CharField( + choices=[ + ("refrigerator", "Refrigerator"), + ("freezer", "Freezer"), + ("platelet_agitator", "Platelet Agitator"), + ("quarantine", "Quarantine"), + ("testing", "Testing Area"), + ], + max_length=20, + ), + ), + ("temperature_range", models.CharField(max_length=50)), + ("temperature", models.FloatField(blank=True, null=True)), + ("capacity", models.PositiveIntegerField()), + ("current_stock", models.PositiveIntegerField(default=0)), + ("is_active", models.BooleanField(default=True)), + ("notes", models.TextField(blank=True)), + ], + options={ + "ordering": ["name"], + }, + ), + migrations.CreateModel( + name="BloodGroup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "abo_type", + models.CharField( + choices=[("A", "A"), ("B", "B"), ("AB", "AB"), ("O", "O")], + max_length=2, + ), + ), + ( + "rh_factor", + models.CharField( + choices=[("POS", "Positive"), ("NEG", "Negative")], max_length=8 + ), + ), + ], + options={ + "ordering": ["abo_type", "rh_factor"], + "unique_together": {("abo_type", "rh_factor")}, + }, + ), + migrations.CreateModel( + name="BloodRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("request_number", models.CharField(max_length=20, unique=True)), + ( + "units_requested", + models.PositiveIntegerField( + validators=[django.core.validators.MinValueValidator(1)] + ), + ), + ( + "urgency", + models.CharField( + choices=[ + ("routine", "Routine"), + ("urgent", "Urgent"), + ("emergency", "Emergency"), + ], + default="routine", + max_length=10, + ), + ), + ("indication", models.TextField()), + ("special_requirements", models.TextField(blank=True)), + ("hemoglobin_level", models.FloatField(blank=True, null=True)), + ("platelet_count", models.IntegerField(blank=True, null=True)), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("processing", "Processing"), + ("ready", "Ready"), + ("issued", "Issued"), + ("completed", "Completed"), + ("cancelled", "Cancelled"), + ], + default="pending", + max_length=15, + ), + ), + ("request_date", models.DateTimeField(auto_now_add=True)), + ("required_by", models.DateTimeField()), + ("processed_at", models.DateTimeField(blank=True, null=True)), + ("notes", models.TextField(blank=True)), + ("cancellation_reason", models.TextField(blank=True)), + ("cancellation_date", models.DateTimeField(blank=True, null=True)), + ( + "cancelled_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="cancelled_requests", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "component_requested", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.bloodcomponent", + ), + ), + ( + "patient", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="blood_requests", + to="patients.patientprofile", + ), + ), + ( + "patient_blood_group", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.bloodgroup", + ), + ), + ( + "processed_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="processed_requests", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "requesting_department", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="core.department", + ), + ), + ( + "requesting_physician", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="blood_requests", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-request_date"], + }, + ), + migrations.CreateModel( + name="BloodUnit", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("unit_number", models.CharField(max_length=20, unique=True)), + ("collection_date", models.DateTimeField()), + ("expiry_date", models.DateTimeField()), + ("volume_ml", models.PositiveIntegerField()), + ( + "status", + models.CharField( + choices=[ + ("collected", "Collected"), + ("testing", "Testing"), + ("quarantine", "Quarantine"), + ("available", "Available"), + ("reserved", "Reserved"), + ("issued", "Issued"), + ("transfused", "Transfused"), + ("expired", "Expired"), + ("discarded", "Discarded"), + ], + default="collected", + max_length=20, + ), + ), + ("location", models.CharField(max_length=100)), + ("bag_type", models.CharField(max_length=50)), + ("anticoagulant", models.CharField(default="CPDA-1", max_length=50)), + ("collection_site", models.CharField(max_length=100)), + ("notes", models.TextField(blank=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "blood_group", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.bloodgroup", + ), + ), + ( + "collected_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="collected_units", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "component", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.bloodcomponent", + ), + ), + ], + options={ + "ordering": ["-collection_date"], + }, + ), + migrations.CreateModel( + name="CrossMatch", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "test_type", + models.CharField( + choices=[ + ("major", "Major Crossmatch"), + ("minor", "Minor Crossmatch"), + ("immediate_spin", "Immediate Spin"), + ("antiglobulin", "Antiglobulin Test"), + ], + max_length=20, + ), + ), + ( + "compatibility", + models.CharField( + choices=[ + ("compatible", "Compatible"), + ("incompatible", "Incompatible"), + ("pending", "Pending"), + ], + default="pending", + max_length=15, + ), + ), + ("test_date", models.DateTimeField()), + ("temperature", models.CharField(default="37°C", max_length=20)), + ("incubation_time", models.PositiveIntegerField(default=15)), + ("notes", models.TextField(blank=True)), + ("verified_at", models.DateTimeField(blank=True, null=True)), + ( + "blood_unit", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="crossmatches", + to="blood_bank.bloodunit", + ), + ), + ( + "recipient", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="patients.patientprofile", + ), + ), + ( + "tested_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "verified_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="verified_crossmatches", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-test_date"], + }, + ), + migrations.CreateModel( + name="BloodIssue", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("issue_date", models.DateTimeField(auto_now_add=True)), + ("expiry_time", models.DateTimeField()), + ("returned", models.BooleanField(default=False)), + ("return_date", models.DateTimeField(blank=True, null=True)), + ("return_reason", models.TextField(blank=True)), + ("notes", models.TextField(blank=True)), + ( + "issued_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="issued_units", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "issued_to", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="received_units", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "blood_request", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="issues", + to="blood_bank.bloodrequest", + ), + ), + ( + "blood_unit", + models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="issue", + to="blood_bank.bloodunit", + ), + ), + ( + "crossmatch", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.crossmatch", + ), + ), + ], + options={ + "ordering": ["-issue_date"], + }, + ), + migrations.CreateModel( + name="Donor", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("donor_id", models.CharField(max_length=20, unique=True)), + ("first_name", models.CharField(max_length=100)), + ("last_name", models.CharField(max_length=100)), + ("date_of_birth", models.DateField()), + ( + "gender", + models.CharField( + choices=[ + ("male", "Male"), + ("female", "Female"), + ("other", "Other"), + ], + max_length=10, + ), + ), + ("phone", models.CharField(max_length=20)), + ("email", models.EmailField(blank=True, max_length=254)), + ("address", models.TextField()), + ("emergency_contact_name", models.CharField(max_length=100)), + ("emergency_contact_phone", models.CharField(max_length=20)), + ( + "donor_type", + models.CharField( + choices=[ + ("voluntary", "Voluntary"), + ("replacement", "Replacement"), + ("autologous", "Autologous"), + ("directed", "Directed"), + ], + default="voluntary", + max_length=20, + ), + ), + ( + "status", + models.CharField( + choices=[ + ("active", "Active"), + ("deferred", "Deferred"), + ("permanently_deferred", "Permanently Deferred"), + ("inactive", "Inactive"), + ], + default="active", + max_length=20, + ), + ), + ("registration_date", models.DateTimeField(auto_now_add=True)), + ("last_donation_date", models.DateTimeField(blank=True, null=True)), + ("total_donations", models.PositiveIntegerField(default=0)), + ( + "weight", + models.FloatField( + validators=[django.core.validators.MinValueValidator(45.0)] + ), + ), + ( + "height", + models.FloatField( + validators=[django.core.validators.MinValueValidator(140.0)] + ), + ), + ("notes", models.TextField(blank=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "blood_group", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="blood_bank.bloodgroup", + ), + ), + ( + "created_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="created_donors", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-registration_date"], + }, + ), + migrations.AddField( + model_name="bloodunit", + name="donor", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="blood_units", + to="blood_bank.donor", + ), + ), + migrations.CreateModel( + name="QualityControl", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "test_type", + models.CharField( + choices=[ + ("temperature_monitoring", "Temperature Monitoring"), + ("equipment_calibration", "Equipment Calibration"), + ("reagent_testing", "Reagent Testing"), + ("proficiency_testing", "Proficiency Testing"), + ("process_validation", "Process Validation"), + ], + max_length=30, + ), + ), + ("test_date", models.DateTimeField()), + ("equipment_tested", models.CharField(blank=True, max_length=100)), + ("parameters_tested", models.TextField()), + ("expected_results", models.TextField()), + ("actual_results", models.TextField()), + ( + "status", + models.CharField( + choices=[ + ("pass", "Pass"), + ("fail", "Fail"), + ("pending", "Pending"), + ], + max_length=10, + ), + ), + ("review_date", models.DateTimeField(blank=True, null=True)), + ("review_notes", models.TextField(blank=True)), + ("corrective_action", models.TextField(blank=True)), + ("next_test_date", models.DateTimeField(blank=True, null=True)), + ("capa_initiated", models.BooleanField(default=False)), + ("capa_number", models.CharField(blank=True, max_length=50)), + ( + "capa_priority", + models.CharField( + blank=True, + choices=[ + ("low", "Low"), + ("medium", "Medium"), + ("high", "High"), + ], + max_length=10, + ), + ), + ("capa_date", models.DateTimeField(blank=True, null=True)), + ("capa_assessment", models.TextField(blank=True)), + ( + "capa_status", + models.CharField( + blank=True, + choices=[ + ("open", "Open"), + ("in_progress", "In Progress"), + ("closed", "Closed"), + ], + max_length=20, + ), + ), + ( + "capa_initiated_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="initiated_capas", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "performed_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="qc_tests", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "reviewed_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="reviewed_qc_tests", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-test_date"], + }, + ), + migrations.CreateModel( + name="Transfusion", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("start_time", models.DateTimeField()), + ("end_time", models.DateTimeField(blank=True, null=True)), + ( + "status", + models.CharField( + choices=[ + ("started", "Started"), + ("in_progress", "In Progress"), + ("completed", "Completed"), + ("stopped", "Stopped"), + ("adverse_reaction", "Adverse Reaction"), + ], + default="started", + max_length=20, + ), + ), + ( + "volume_transfused", + models.PositiveIntegerField(blank=True, null=True), + ), + ("transfusion_rate", models.CharField(blank=True, max_length=50)), + ("pre_transfusion_vitals", models.JSONField(default=dict)), + ("post_transfusion_vitals", models.JSONField(default=dict)), + ("vital_signs_history", models.JSONField(default=list)), + ("current_blood_pressure", models.CharField(blank=True, max_length=20)), + ("current_heart_rate", models.IntegerField(blank=True, null=True)), + ("current_temperature", models.FloatField(blank=True, null=True)), + ( + "current_respiratory_rate", + models.IntegerField(blank=True, null=True), + ), + ( + "current_oxygen_saturation", + models.IntegerField(blank=True, null=True), + ), + ("last_vitals_check", models.DateTimeField(blank=True, null=True)), + ("patient_consent", models.BooleanField(default=False)), + ("consent_date", models.DateTimeField(blank=True, null=True)), + ("notes", models.TextField(blank=True)), + ("stop_reason", models.TextField(blank=True)), + ("completion_notes", models.TextField(blank=True)), + ( + "administered_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="administered_transfusions", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "blood_issue", + models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="transfusion", + to="blood_bank.bloodissue", + ), + ), + ( + "completed_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="completed_transfusions", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "stopped_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="stopped_transfusions", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "witnessed_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="witnessed_transfusions", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-start_time"], + }, + ), + migrations.CreateModel( + name="AdverseReaction", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "reaction_type", + models.CharField( + choices=[ + ("febrile", "Febrile Non-Hemolytic"), + ("allergic", "Allergic"), + ("hemolytic_acute", "Acute Hemolytic"), + ("hemolytic_delayed", "Delayed Hemolytic"), + ("anaphylactic", "Anaphylactic"), + ("septic", "Septic"), + ("circulatory_overload", "Circulatory Overload"), + ("lung_injury", "Transfusion-Related Acute Lung Injury"), + ("other", "Other"), + ], + max_length=30, + ), + ), + ( + "severity", + models.CharField( + choices=[ + ("mild", "Mild"), + ("moderate", "Moderate"), + ("severe", "Severe"), + ("life_threatening", "Life Threatening"), + ], + max_length=20, + ), + ), + ("onset_time", models.DateTimeField()), + ("symptoms", models.TextField()), + ("treatment_given", models.TextField()), + ("outcome", models.TextField()), + ("investigation_notes", models.TextField(blank=True)), + ("regulatory_reported", models.BooleanField(default=False)), + ("report_date", models.DateTimeField(blank=True, null=True)), + ( + "investigated_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="investigated_reactions", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "reported_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="reported_reactions", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "transfusion", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="adverse_reactions", + to="blood_bank.transfusion", + ), + ), + ], + options={ + "ordering": ["-onset_time"], + }, + ), + migrations.CreateModel( + name="BloodTest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "test_type", + models.CharField( + choices=[ + ("abo_rh", "ABO/Rh Typing"), + ("antibody_screen", "Antibody Screening"), + ("hiv", "HIV"), + ("hbv", "Hepatitis B"), + ("hcv", "Hepatitis C"), + ("syphilis", "Syphilis"), + ("htlv", "HTLV"), + ("cmv", "CMV"), + ("malaria", "Malaria"), + ], + max_length=20, + ), + ), + ( + "result", + models.CharField( + choices=[ + ("positive", "Positive"), + ("negative", "Negative"), + ("indeterminate", "Indeterminate"), + ("pending", "Pending"), + ], + default="pending", + max_length=15, + ), + ), + ("test_date", models.DateTimeField()), + ("equipment_used", models.CharField(blank=True, max_length=100)), + ("lot_number", models.CharField(blank=True, max_length=50)), + ("notes", models.TextField(blank=True)), + ("verified_at", models.DateTimeField(blank=True, null=True)), + ( + "tested_by", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "verified_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="verified_tests", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "blood_unit", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="tests", + to="blood_bank.bloodunit", + ), + ), + ], + options={ + "ordering": ["-test_date"], + "unique_together": {("blood_unit", "test_type")}, + }, + ), + ] diff --git a/blood_bank/migrations/0002_donor_national_id_alter_donor_gender.py b/blood_bank/migrations/0002_donor_national_id_alter_donor_gender.py new file mode 100644 index 00000000..e1bc71a6 --- /dev/null +++ b/blood_bank/migrations/0002_donor_national_id_alter_donor_gender.py @@ -0,0 +1,26 @@ +# Generated by Django 5.2.4 on 2025-09-04 15:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("blood_bank", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="donor", + name="national_id", + field=models.CharField(default=1129632798, max_length=10, unique=True), + preserve_default=False, + ), + migrations.AlterField( + model_name="donor", + name="gender", + field=models.CharField( + choices=[("M", "Male"), ("F", "Female"), ("O", "Other")], max_length=10 + ), + ), + ] diff --git a/blood_bank/migrations/__init__.py b/blood_bank/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/blood_bank/migrations/__pycache__/0001_initial.cpython-312.pyc b/blood_bank/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f14a3dc8923f0ce30346bbb1f2edc4d5f43aa98 GIT binary patch literal 24919 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 literal 0 HcmV?d00001 diff --git a/blood_bank/migrations/__pycache__/0002_donor_national_id_alter_donor_gender.cpython-312.pyc b/blood_bank/migrations/__pycache__/0002_donor_national_id_alter_donor_gender.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84e96f43df68327257762d451ed35a3736ae63bc GIT binary patch literal 1060 zcmZ`%O=uHA6rS15ZnE1XO=Cf&Z4R+o_R>`GBvL4aC}LZX79p2mnwf4k?oT?qY0XWg z2amn=;>nZJ9P}c1^C);RP-vK|r``gM2%enTWN8H**thSS{odQ}{d~*iOd!si51$(! z6##xnkQ{C7oG%OK2oOM^3p`kZo>EgFP{0E~lmkFi3Y&Tobn!k`M}AH1q%7@B0!!hh z=hzHKPT+@J_X0xQuznE(fH4N=pM-M+D5yaKY6^iitf>m1sb(zratIJIi2SBE^MBt< zL{dZ}dN-ZOA(^gmoEq`se1(6+D8&30L;uDB6R{Gdh0d-5Kf3nKXa zslRxbCigrx(g~R`2VkHBV_~2w)B20Y0}~jtug%lU zOfNIjzgp@~mHNf<;jPnRxmPT|yZ5F1b@Qb7q(4_48k%7avcM=w`dlwF7t^m_qVsDH zzi&Mqs>+r8Fs%#rWWK1se8lDx5$j?F4AR8D9W0XVxV>>xM>20nTFkvEJf68fn$a>_ j5D za`N+2;*%2dvh{N_(~A;IGV}9__2c6+^D;}~= 56 + + @property + def next_eligible_date(self): + """Calculate next eligible donation date""" + if not self.last_donation_date: + return timezone.now().date() + + return (self.last_donation_date + timedelta(days=56)).date() + + +class BloodComponent(models.Model): + """Types of blood components (Whole Blood, RBC, Plasma, Platelets, etc.)""" + COMPONENT_CHOICES = [ + ('whole_blood', 'Whole Blood'), + ('packed_rbc', 'Packed Red Blood Cells'), + ('fresh_frozen_plasma', 'Fresh Frozen Plasma'), + ('platelets', 'Platelets'), + ('cryoprecipitate', 'Cryoprecipitate'), + ('granulocytes', 'Granulocytes'), + ] + + name = models.CharField(max_length=50, choices=COMPONENT_CHOICES, unique=True) + description = models.TextField() + shelf_life_days = models.PositiveIntegerField() # Storage duration in days + storage_temperature = models.CharField(max_length=50) # Storage requirements + volume_ml = models.PositiveIntegerField() # Standard volume in ml + is_active = models.BooleanField(default=True) + + class Meta: + ordering = ['name'] + + def __str__(self): + return self.get_name_display() + + +class BloodUnit(models.Model): + """Individual blood unit from donation to disposal""" + STATUS_CHOICES = [ + ('collected', 'Collected'), + ('testing', 'Testing'), + ('quarantine', 'Quarantine'), + ('available', 'Available'), + ('reserved', 'Reserved'), + ('issued', 'Issued'), + ('transfused', 'Transfused'), + ('expired', 'Expired'), + ('discarded', 'Discarded'), + ] + + unit_number = models.CharField(max_length=20, unique=True) + donor = models.ForeignKey(Donor, on_delete=models.PROTECT, related_name='blood_units') + component = models.ForeignKey(BloodComponent, on_delete=models.PROTECT) + blood_group = models.ForeignKey(BloodGroup, on_delete=models.PROTECT) + collection_date = models.DateTimeField() + expiry_date = models.DateTimeField() + volume_ml = models.PositiveIntegerField() + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='collected') + location = models.CharField(max_length=100) # Storage location/refrigerator + bag_type = models.CharField(max_length=50) + anticoagulant = models.CharField(max_length=50, default='CPDA-1') + collection_site = models.CharField(max_length=100) + collected_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='collected_units') + notes = models.TextField(blank=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + ordering = ['-collection_date'] + + def __str__(self): + return f"{self.unit_number} - {self.component} ({self.blood_group})" + + @property + def is_expired(self): + return timezone.now() > self.expiry_date + + @property + def days_to_expiry(self): + delta = self.expiry_date - timezone.now() + return delta.days if delta.days > 0 else 0 + + @property + def is_available(self): + return self.status == 'available' and not self.is_expired + + +class BloodTest(models.Model): + """Blood testing results for infectious diseases and compatibility""" + TEST_TYPE_CHOICES = [ + ('abo_rh', 'ABO/Rh Typing'), + ('antibody_screen', 'Antibody Screening'), + ('hiv', 'HIV'), + ('hbv', 'Hepatitis B'), + ('hcv', 'Hepatitis C'), + ('syphilis', 'Syphilis'), + ('htlv', 'HTLV'), + ('cmv', 'CMV'), + ('malaria', 'Malaria'), + ] + + RESULT_CHOICES = [ + ('positive', 'Positive'), + ('negative', 'Negative'), + ('indeterminate', 'Indeterminate'), + ('pending', 'Pending'), + ] + + blood_unit = models.ForeignKey(BloodUnit, on_delete=models.CASCADE, related_name='tests') + test_type = models.CharField(max_length=20, choices=TEST_TYPE_CHOICES) + result = models.CharField(max_length=15, choices=RESULT_CHOICES, default='pending') + test_date = models.DateTimeField() + tested_by = models.ForeignKey(User, on_delete=models.PROTECT) + equipment_used = models.CharField(max_length=100, blank=True) + lot_number = models.CharField(max_length=50, blank=True) + notes = models.TextField(blank=True) + verified_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='verified_tests', null=True, + blank=True) + verified_at = models.DateTimeField(null=True, blank=True) + + class Meta: + unique_together = ['blood_unit', 'test_type'] + ordering = ['-test_date'] + + def __str__(self): + return f"{self.blood_unit.unit_number} - {self.get_test_type_display()}: {self.result}" + + +class CrossMatch(models.Model): + """Cross-matching tests between donor blood and recipient""" + COMPATIBILITY_CHOICES = [ + ('compatible', 'Compatible'), + ('incompatible', 'Incompatible'), + ('pending', 'Pending'), + ] + + TEST_TYPE_CHOICES = [ + ('major', 'Major Crossmatch'), + ('minor', 'Minor Crossmatch'), + ('immediate_spin', 'Immediate Spin'), + ('antiglobulin', 'Antiglobulin Test'), + ] + + blood_unit = models.ForeignKey(BloodUnit, on_delete=models.CASCADE, related_name='crossmatches') + recipient = models.ForeignKey(PatientProfile, on_delete=models.PROTECT) + test_type = models.CharField(max_length=20, choices=TEST_TYPE_CHOICES) + compatibility = models.CharField(max_length=15, choices=COMPATIBILITY_CHOICES, default='pending') + test_date = models.DateTimeField() + tested_by = models.ForeignKey(User, on_delete=models.PROTECT) + temperature = models.CharField(max_length=20, default='37°C') + incubation_time = models.PositiveIntegerField(default=15) # minutes + notes = models.TextField(blank=True) + verified_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='verified_crossmatches', null=True, + blank=True) + verified_at = models.DateTimeField(null=True, blank=True) + + class Meta: + ordering = ['-test_date'] + + def __str__(self): + return f"{self.blood_unit.unit_number} x {self.recipient} - {self.compatibility}" + + +class BloodRequest(models.Model): + """Blood transfusion requests from clinical departments""" + URGENCY_CHOICES = [ + ('routine', 'Routine'), + ('urgent', 'Urgent'), + ('emergency', 'Emergency'), + ] + + STATUS_CHOICES = [ + ('pending', 'Pending'), + ('processing', 'Processing'), + ('ready', 'Ready'), + ('issued', 'Issued'), + ('completed', 'Completed'), + ('cancelled', 'Cancelled'), + ] + + request_number = models.CharField(max_length=20, unique=True) + patient = models.ForeignKey(PatientProfile, on_delete=models.PROTECT, related_name='blood_requests') + requesting_department = models.ForeignKey(Department, on_delete=models.PROTECT) + requesting_physician = models.ForeignKey(User, on_delete=models.PROTECT, related_name='blood_requests') + component_requested = models.ForeignKey(BloodComponent, on_delete=models.PROTECT) + units_requested = models.PositiveIntegerField(validators=[MinValueValidator(1)]) + urgency = models.CharField(max_length=10, choices=URGENCY_CHOICES, default='routine') + indication = models.TextField() # Clinical indication for transfusion + special_requirements = models.TextField(blank=True) # CMV negative, irradiated, etc. + patient_blood_group = models.ForeignKey(BloodGroup, on_delete=models.PROTECT) + hemoglobin_level = models.FloatField(null=True, blank=True) + platelet_count = models.IntegerField(null=True, blank=True) + status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='pending') + request_date = models.DateTimeField(auto_now_add=True) + required_by = models.DateTimeField() + processed_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='processed_requests', null=True, + blank=True) + processed_at = models.DateTimeField(null=True, blank=True) + notes = models.TextField(blank=True) + + # Cancellation fields + cancellation_reason = models.TextField(blank=True) + cancelled_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='cancelled_requests', null=True, + blank=True) + cancellation_date = models.DateTimeField(null=True, blank=True) + + class Meta: + ordering = ['-request_date'] + + def __str__(self): + return f"{self.request_number} - {self.patient} ({self.component_requested})" + + @property + def is_overdue(self): + return timezone.now() > self.required_by and self.status not in ['completed', 'cancelled'] + + +class BloodIssue(models.Model): + """Blood unit issuance to patients""" + blood_request = models.ForeignKey(BloodRequest, on_delete=models.PROTECT, related_name='issues') + blood_unit = models.OneToOneField(BloodUnit, on_delete=models.PROTECT, related_name='issue') + crossmatch = models.ForeignKey(CrossMatch, on_delete=models.PROTECT, null=True, blank=True) + issued_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='issued_units') + issued_to = models.ForeignKey(User, on_delete=models.PROTECT, related_name='received_units') # Nurse/physician + issue_date = models.DateTimeField(auto_now_add=True) + expiry_time = models.DateTimeField() # 4 hours from issue for RBC + returned = models.BooleanField(default=False) + return_date = models.DateTimeField(null=True, blank=True) + return_reason = models.TextField(blank=True) + notes = models.TextField(blank=True) + + class Meta: + ordering = ['-issue_date'] + + def __str__(self): + return f"{self.blood_unit.unit_number} issued to {self.blood_request.patient}" + + @property + def is_expired(self): + return timezone.now() > self.expiry_time and not self.returned + + +class Transfusion(models.Model): + """Blood transfusion administration records""" + STATUS_CHOICES = [ + ('started', 'Started'), + ('in_progress', 'In Progress'), + ('completed', 'Completed'), + ('stopped', 'Stopped'), + ('adverse_reaction', 'Adverse Reaction'), + ] + + blood_issue = models.OneToOneField(BloodIssue, on_delete=models.PROTECT, related_name='transfusion') + start_time = models.DateTimeField() + end_time = models.DateTimeField(null=True, blank=True) + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='started') + volume_transfused = models.PositiveIntegerField(null=True, blank=True) # ml + transfusion_rate = models.CharField(max_length=50, blank=True) # ml/hour + administered_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='administered_transfusions') + witnessed_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='witnessed_transfusions', null=True, + blank=True) + pre_transfusion_vitals = models.JSONField(default=dict) # BP, HR, Temp, etc. + post_transfusion_vitals = models.JSONField(default=dict) + vital_signs_history = models.JSONField(default=list) # Array of vital signs during transfusion + current_blood_pressure = models.CharField(max_length=20, blank=True) + current_heart_rate = models.IntegerField(null=True, blank=True) + current_temperature = models.FloatField(null=True, blank=True) + current_respiratory_rate = models.IntegerField(null=True, blank=True) + current_oxygen_saturation = models.IntegerField(null=True, blank=True) + last_vitals_check = models.DateTimeField(null=True, blank=True) + patient_consent = models.BooleanField(default=False) + consent_date = models.DateTimeField(null=True, blank=True) + notes = models.TextField(blank=True) + + # Completion/Stop fields + stop_reason = models.TextField(blank=True) + stopped_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='stopped_transfusions', null=True, + blank=True) + completed_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='completed_transfusions', null=True, + blank=True) + completion_notes = models.TextField(blank=True) + + class Meta: + ordering = ['-start_time'] + + def __str__(self): + return f"Transfusion: {self.blood_issue.blood_unit.unit_number} to {self.blood_issue.blood_request.patient}" + + @property + def duration_minutes(self): + if self.end_time: + return int((self.end_time - self.start_time).total_seconds() / 60) + return None + + +class AdverseReaction(models.Model): + """Adverse transfusion reactions""" + SEVERITY_CHOICES = [ + ('mild', 'Mild'), + ('moderate', 'Moderate'), + ('severe', 'Severe'), + ('life_threatening', 'Life Threatening'), + ] + + REACTION_TYPE_CHOICES = [ + ('febrile', 'Febrile Non-Hemolytic'), + ('allergic', 'Allergic'), + ('hemolytic_acute', 'Acute Hemolytic'), + ('hemolytic_delayed', 'Delayed Hemolytic'), + ('anaphylactic', 'Anaphylactic'), + ('septic', 'Septic'), + ('circulatory_overload', 'Circulatory Overload'), + ('lung_injury', 'Transfusion-Related Acute Lung Injury'), + ('other', 'Other'), + ] + + transfusion = models.ForeignKey(Transfusion, on_delete=models.CASCADE, related_name='adverse_reactions') + reaction_type = models.CharField(max_length=30, choices=REACTION_TYPE_CHOICES) + severity = models.CharField(max_length=20, choices=SEVERITY_CHOICES) + onset_time = models.DateTimeField() + symptoms = models.TextField() + treatment_given = models.TextField() + outcome = models.TextField() + reported_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='reported_reactions') + investigated_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='investigated_reactions', + null=True, blank=True) + investigation_notes = models.TextField(blank=True) + regulatory_reported = models.BooleanField(default=False) + report_date = models.DateTimeField(null=True, blank=True) + + class Meta: + ordering = ['-onset_time'] + + def __str__(self): + return f"{self.get_reaction_type_display()} - {self.severity} ({self.transfusion.blood_issue.blood_request.patient})" + + +class InventoryLocation(models.Model): + """Blood bank storage locations""" + LOCATION_TYPE_CHOICES = [ + ('refrigerator', 'Refrigerator'), + ('freezer', 'Freezer'), + ('platelet_agitator', 'Platelet Agitator'), + ('quarantine', 'Quarantine'), + ('testing', 'Testing Area'), + ] + + name = models.CharField(max_length=100, unique=True) + location_type = models.CharField(max_length=20, choices=LOCATION_TYPE_CHOICES) + temperature_range = models.CharField(max_length=50) + temperature = models.FloatField(null=True, blank=True) # Current temperature + capacity = models.PositiveIntegerField() # Number of units + current_stock = models.PositiveIntegerField(default=0) + is_active = models.BooleanField(default=True) + notes = models.TextField(blank=True) + + class Meta: + ordering = ['name'] + + def __str__(self): + return f"{self.name} ({self.get_location_type_display()})" + + @property + def utilization_percentage(self): + if self.capacity == 0: + return 0 + return (self.current_stock / self.capacity) * 100 + + +class QualityControl(models.Model): + """Quality control tests and monitoring""" + TEST_TYPE_CHOICES = [ + ('temperature_monitoring', 'Temperature Monitoring'), + ('equipment_calibration', 'Equipment Calibration'), + ('reagent_testing', 'Reagent Testing'), + ('proficiency_testing', 'Proficiency Testing'), + ('process_validation', 'Process Validation'), + ] + + STATUS_CHOICES = [ + ('pass', 'Pass'), + ('fail', 'Fail'), + ('pending', 'Pending'), + ] + + test_type = models.CharField(max_length=30, choices=TEST_TYPE_CHOICES) + test_date = models.DateTimeField() + equipment_tested = models.CharField(max_length=100, blank=True) + parameters_tested = models.TextField() + expected_results = models.TextField() + actual_results = models.TextField() + status = models.CharField(max_length=10, choices=STATUS_CHOICES) + performed_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='qc_tests') + reviewed_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='reviewed_qc_tests', null=True, + blank=True) + review_date = models.DateTimeField(null=True, blank=True) + review_notes = models.TextField(blank=True) + corrective_action = models.TextField(blank=True) + next_test_date = models.DateTimeField(null=True, blank=True) + + # CAPA (Corrective and Preventive Action) fields + capa_initiated = models.BooleanField(default=False) + capa_number = models.CharField(max_length=50, blank=True) + capa_priority = models.CharField(max_length=10, choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], + blank=True) + capa_initiated_by = models.ForeignKey(User, on_delete=models.PROTECT, related_name='initiated_capas', null=True, + blank=True) + capa_date = models.DateTimeField(null=True, blank=True) + capa_assessment = models.TextField(blank=True) + capa_status = models.CharField(max_length=20, + choices=[('open', 'Open'), ('in_progress', 'In Progress'), ('closed', 'Closed')], + blank=True) + + class Meta: + ordering = ['-test_date'] + + def __str__(self): + return f"{self.get_test_type_display()} - {self.test_date.strftime('%Y-%m-%d')} ({self.status})" + diff --git a/blood_bank/tests.py b/blood_bank/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/blood_bank/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blood_bank/urls.py b/blood_bank/urls.py new file mode 100644 index 00000000..2d2164f9 --- /dev/null +++ b/blood_bank/urls.py @@ -0,0 +1,78 @@ +from django.urls import path +from . import views + +app_name = 'blood_bank' + +urlpatterns = [ + # Dashboard + path('', views.dashboard, name='dashboard'), + + # Donor Management + path('donors/', views.donor_list, name='donor_list'), + path('donors//', views.donor_detail, name='donor_detail'), + path('donors/create/', views.donor_create, name='donor_create'), + path('donors//update/', views.donor_update, name='donor_update'), + path('donors//eligibility/', views.donor_eligibility_check, name='donor_eligibility'), + + # Blood Unit Management + path('units/', views.blood_unit_list, name='blood_unit_list'), + path('units//', views.blood_unit_detail, name='blood_unit_detail'), + path('units/create/', views.blood_unit_create, name='blood_unit_create'), + path('units/create//', views.blood_unit_create, name='blood_unit_create_for_donor'), + + # Blood Testing + path('units//test/', views.blood_test_create, name='blood_test_create'), + path('units//crossmatch//', views.crossmatch_create, name='crossmatch_create'), + + # Blood Requests + path('requests/', views.blood_request_list, name='blood_request_list'), + path('requests//', views.blood_request_detail, name='blood_request_detail'), + path('requests/create/', views.blood_request_create, name='blood_request_create'), + + # Blood Issue and Transfusion + path('requests//issue/', views.blood_issue_create, name='blood_issue_create'), + path('transfusions/', views.transfusion_list, name='transfusion_list'), + path('transfusions//', views.transfusion_detail, name='transfusion_detail'), + path('issues//transfusion/', views.transfusion_create, name='transfusion_create'), + + # Inventory Management + path('inventory/', views.inventory_overview, name='inventory_overview'), + + # Quality Control + path('quality-control/', views.quality_control_list, name='quality_control_list'), + path('quality-control/create/', views.quality_control_create, name='quality_control_create'), + + # Reports + path('reports/', views.reports_dashboard, name='reports_dashboard'), + + # API Endpoints + path('api/blood-availability/', views.api_blood_availability, name='api_blood_availability'), + path('api/donor-search/', views.api_donor_search, name='api_donor_search'), + + # Blood Unit Management APIs + path('api/units//move/', views.api_move_unit, name='api_move_unit'), + path('api/expiry-report/', views.api_expiry_report, name='api_expiry_report'), + + # Blood Request Management APIs + path('api/requests//cancel/', views.api_cancel_request, name='api_cancel_request'), + path('api/check-availability/', views.api_check_availability, name='api_check_availability'), + path('api/urgency-report/', views.api_urgency_report, name='api_urgency_report'), + + # Quality Control APIs + path('api/initiate-capa/', views.api_initiate_capa, name='api_initiate_capa'), + path('api/review-results/', views.api_review_results, name='api_review_results'), + + # Transfusion Management APIs + path('api/record-vital-signs/', views.api_record_vital_signs, name='api_record_vital_signs'), + path('api/transfusions//stop/', views.api_stop_transfusion, name='api_stop_transfusion'), + path('api/transfusions//complete/', views.api_complete_transfusion, + name='api_complete_transfusion'), + + # Inventory Management APIs + path('api/inventory-locations/', views.api_inventory_locations, name='api_inventory_locations'), + path('api/locations//update/', views.api_update_location, name='api_update_location'), + + # Export and Utility APIs + path('api/export-csv/', views.api_export_csv, name='api_export_csv'), +] + diff --git a/blood_bank/views.py b/blood_bank/views.py new file mode 100644 index 00000000..64a01258 --- /dev/null +++ b/blood_bank/views.py @@ -0,0 +1,1228 @@ +from django.shortcuts import render, get_object_or_404, redirect +from django.contrib.auth.decorators import login_required, permission_required +from django.contrib import messages +from django.http import JsonResponse, HttpResponse +from django.core.paginator import Paginator +from django.db.models import Q, Count, Sum, Avg +from django.utils import timezone +from django.views.decorators.http import require_http_methods +from django.contrib.auth.models import User +from datetime import timedelta +import json + +from .models import ( + BloodGroup, Donor, BloodComponent, BloodUnit, BloodTest, CrossMatch, + BloodRequest, BloodIssue, Transfusion, AdverseReaction, InventoryLocation, + QualityControl +) +from .forms import ( + DonorForm, BloodUnitForm, BloodTestForm, CrossMatchForm, BloodRequestForm, + BloodIssueForm, TransfusionForm, AdverseReactionForm, InventoryLocationForm, + QualityControlForm, DonorEligibilityForm, BloodInventorySearchForm +) + + +@login_required +def dashboard(request): + """Blood bank dashboard with key metrics""" + context = { + 'total_donors': Donor.objects.filter(status='active').count(), + 'total_units': BloodUnit.objects.filter(status='available').count(), + 'pending_requests': BloodRequest.objects.filter(status='pending').count(), + 'expiring_soon': BloodUnit.objects.filter( + expiry_date__lte=timezone.now() + timedelta(days=7), + status='available' + ).count(), + 'recent_donations': BloodUnit.objects.filter( + collection_date__gte=timezone.now() - timedelta(days=7) + ).count(), + 'active_transfusions': Transfusion.objects.filter( + status__in=['started', 'in_progress'] + ).count(), + } + + # Blood group distribution + blood_group_stats = BloodUnit.objects.filter(status='available').values( + 'blood_group__abo_type', 'blood_group__rh_factor' + ).annotate(count=Count('id')) + + context['blood_group_stats'] = blood_group_stats + + # Recent activities + context['recent_units'] = BloodUnit.objects.select_related( + 'donor', 'component', 'blood_group' + ).order_by('-collection_date')[:10] + + context['urgent_requests'] = BloodRequest.objects.filter( + urgency='emergency', status__in=['pending', 'processing'] + ).select_related('patient', 'component_requested')[:5] + + return render(request, 'blood_bank/dashboard.html', context) + + +# Donor Management Views +@login_required +def donor_list(request): + """List all donors with filtering and search""" + donors = Donor.objects.select_related('blood_group').order_by('-registration_date') + + # Search functionality + search_query = request.GET.get('search') + if search_query: + donors = donors.filter( + Q(donor_id__icontains=search_query) | + Q(first_name__icontains=search_query) | + Q(last_name__icontains=search_query) | + Q(phone__icontains=search_query) + ) + + # Filter by status + status_filter = request.GET.get('status') + if status_filter: + donors = donors.filter(status=status_filter) + + # Filter by blood group + blood_group_filter = request.GET.get('blood_group') + if blood_group_filter: + donors = donors.filter(blood_group_id=blood_group_filter) + + paginator = Paginator(donors, 25) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + context = { + 'page_obj': page_obj, + 'blood_groups': BloodGroup.objects.all(), + 'status_choices': Donor.STATUS_CHOICES, + 'search_query': search_query, + 'status_filter': status_filter, + 'blood_group_filter': blood_group_filter, + } + + return render(request, 'blood_bank/donors/donor_list.html', context) + + +@login_required +def donor_detail(request, donor_id): + """Donor detail view with donation history""" + donor = get_object_or_404(Donor, id=donor_id) + + # Get donation history + blood_units = BloodUnit.objects.filter(donor=donor).select_related( + 'component', 'blood_group' + ).order_by('-collection_date') + + context = { + 'donor': donor, + 'blood_units': blood_units, + 'total_donations': blood_units.count(), + 'last_donation': blood_units.first(), + } + + return render(request, 'blood_bank/donors/donor_detail.html', context) + + +@login_required +@permission_required('blood_bank.add_donor') +def donor_create(request): + """Create new donor""" + if request.method == 'POST': + form = DonorForm(request.POST) + if form.is_valid(): + donor = form.save(commit=False) + donor.created_by = request.user + donor.save() + messages.success(request, f'Donor {donor.donor_id} created successfully.') + return redirect('blood_bank:donor_detail', donor_id=donor.id) + else: + form = DonorForm() + + return render(request, 'blood_bank/donors/donor_form.html', {'form': form, 'title': 'Add New Donor'}) + + +@login_required +@permission_required('blood_bank.change_donor') +def donor_update(request, donor_id): + """Update donor information""" + donor = get_object_or_404(Donor, id=donor_id) + + if request.method == 'POST': + form = DonorForm(request.POST, instance=donor) + if form.is_valid(): + form.save() + messages.success(request, f'Donor {donor.donor_id} updated successfully.') + return redirect('blood_bank:donor_detail', donor_id=donor.id) + else: + form = DonorForm(instance=donor) + + return render(request, 'blood_bank/donors/donor_form.html', { + 'form': form, 'donor': donor, 'title': 'Update Donor' + }) + + +@login_required +def donor_eligibility_check(request, donor_id): + """Check donor eligibility for donation""" + donor = get_object_or_404(Donor, id=donor_id) + + if request.method == 'POST': + form = DonorEligibilityForm(request.POST) + if form.is_valid(): + # Process eligibility check + messages.success(request, f'Donor {donor.donor_id} is eligible for donation.') + return redirect('blood_bank:blood_unit_create', donor_id=donor.id) + else: + form = DonorEligibilityForm() + + context = { + 'donor': donor, + 'form': form, + 'is_eligible': donor.is_eligible_for_donation, + 'next_eligible_date': donor.next_eligible_date, + } + + return render(request, 'blood_bank/donors/donor_eligibility.html', context) + + +# Blood Unit Management Views +@login_required +def blood_unit_list(request): + """List all blood units with filtering""" + form = BloodInventorySearchForm(request.GET) + blood_units = BloodUnit.objects.select_related( + 'donor', 'component', 'blood_group' + ).order_by('-collection_date') + + if form.is_valid(): + if form.cleaned_data['blood_group']: + blood_units = blood_units.filter(blood_group=form.cleaned_data['blood_group']) + + if form.cleaned_data['component']: + blood_units = blood_units.filter(component=form.cleaned_data['component']) + + if form.cleaned_data['status']: + blood_units = blood_units.filter(status=form.cleaned_data['status']) + + if form.cleaned_data['expiry_days']: + expiry_date = timezone.now() + timedelta(days=form.cleaned_data['expiry_days']) + blood_units = blood_units.filter(expiry_date__lte=expiry_date) + + paginator = Paginator(blood_units, 25) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + context = { + 'page_obj': page_obj, + 'form': form, + } + + return render(request, 'blood_bank/units/blood_unit_list.html', context) + + +@login_required +def blood_unit_detail(request, unit_id): + """Blood unit detail view with test results""" + blood_unit = get_object_or_404(BloodUnit, id=unit_id) + + # Get test results + tests = BloodTest.objects.filter(blood_unit=blood_unit).select_related('tested_by') + crossmatches = CrossMatch.objects.filter(blood_unit=blood_unit).select_related( + 'recipient', 'tested_by' + ) + + context = { + 'blood_unit': blood_unit, + 'tests': tests, + 'crossmatches': crossmatches, + } + + return render(request, 'blood_bank/units/blood_unit_detail.html', context) + + +@login_required +@permission_required('blood_bank.add_bloodunit') +def blood_unit_create(request, donor_id=None): + """Create new blood unit""" + donor = None + if donor_id: + donor = get_object_or_404(Donor, id=donor_id) + + if request.method == 'POST': + form = BloodUnitForm(request.POST) + if form.is_valid(): + blood_unit = form.save(commit=False) + blood_unit.collected_by = request.user + blood_unit.save() + + # Update donor's last donation date and total donations + if blood_unit.donor: + blood_unit.donor.last_donation_date = blood_unit.collection_date + blood_unit.donor.total_donations += 1 + blood_unit.donor.save() + + messages.success(request, f'Blood unit {blood_unit.unit_number} created successfully.') + return redirect('blood_bank:blood_unit_detail', unit_id=blood_unit.id) + else: + initial_data = {} + if donor: + initial_data['donor'] = donor + initial_data['blood_group'] = donor.blood_group + form = BloodUnitForm(initial=initial_data) + + return render(request, 'blood_bank/units/blood_unit_form.html', { + 'form': form, 'donor': donor, 'title': 'Register Blood Unit' + }) + + +# Blood Request Management Views +@login_required +def blood_request_list(request): + """List all blood requests""" + requests = BloodRequest.objects.select_related( + 'patient', 'requesting_department', 'requesting_physician', 'component_requested' + ).order_by('-request_date') + + # Filter by status + status_filter = request.GET.get('status') + if status_filter: + requests = requests.filter(status=status_filter) + + # Filter by urgency + urgency_filter = request.GET.get('urgency') + if urgency_filter: + requests = requests.filter(urgency=urgency_filter) + + paginator = Paginator(requests, 25) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + context = { + 'page_obj': page_obj, + 'status_choices': BloodRequest.STATUS_CHOICES, + 'urgency_choices': BloodRequest.URGENCY_CHOICES, + 'status_filter': status_filter, + 'urgency_filter': urgency_filter, + } + + return render(request, 'blood_bank/requests/blood_request_list.html', context) + + +@login_required +def blood_request_detail(request, request_id): + """Blood request detail view""" + blood_request = get_object_or_404(BloodRequest, id=request_id) + + # Get issued units for this request + issues = BloodIssue.objects.filter(blood_request=blood_request).select_related( + 'blood_unit', 'issued_by', 'issued_to' + ) + + context = { + 'blood_request': blood_request, + 'issues': issues, + } + + return render(request, 'blood_bank/requests/blood_request_detail.html', context) + + +@login_required +@permission_required('blood_bank.add_bloodrequest') +def blood_request_create(request): + """Create new blood request""" + if request.method == 'POST': + form = BloodRequestForm(request.POST) + if form.is_valid(): + blood_request = form.save(commit=False) + blood_request.requesting_physician = request.user + # Generate request number + blood_request.request_number = f"BR{timezone.now().strftime('%Y%m%d')}{BloodRequest.objects.count() + 1:04d}" + blood_request.save() + messages.success(request, f'Blood request {blood_request.request_number} created successfully.') + return redirect('blood_bank:blood_request_detail', request_id=blood_request.id) + else: + form = BloodRequestForm() + + return render(request, 'blood_bank/requests/blood_request_form.html', { + 'form': form, 'title': 'Create Blood Request' + }) + + +# Blood Issue and Transfusion Views +@login_required +@permission_required('blood_bank.add_bloodissue') +def blood_issue_create(request, request_id): + """Issue blood unit for a request""" + blood_request = get_object_or_404(BloodRequest, id=request_id) + + if request.method == 'POST': + form = BloodIssueForm(request.POST) + if form.is_valid(): + blood_issue = form.save(commit=False) + blood_issue.issued_by = request.user + blood_issue.save() + + # Update blood unit status + blood_issue.blood_unit.status = 'issued' + blood_issue.blood_unit.save() + + # Update request status + blood_request.status = 'issued' + blood_request.processed_by = request.user + blood_request.processed_at = timezone.now() + blood_request.save() + + messages.success(request, f'Blood unit {blood_issue.blood_unit.unit_number} issued successfully.') + return redirect('blood_bank:blood_request_detail', request_id=blood_request.id) + else: + # Filter compatible blood units + compatible_units = BloodUnit.objects.filter( + blood_group=blood_request.patient_blood_group, + component=blood_request.component_requested, + status='available' + ) + + form = BloodIssueForm(initial={ + 'blood_request': blood_request, + 'expiry_time': timezone.now() + timedelta(hours=4) + }) + form.fields['blood_unit'].queryset = compatible_units + + context = { + 'form': form, + 'blood_request': blood_request, + 'title': 'Issue Blood Unit' + } + + return render(request, 'blood_bank/issues/blood_issue_form.html', context) + + +@login_required +def transfusion_list(request): + """List all transfusions""" + transfusions = Transfusion.objects.select_related( + 'blood_issue__blood_unit', 'blood_issue__blood_request__patient', + 'administered_by' + ).order_by('-start_time') + + paginator = Paginator(transfusions, 25) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + return render(request, 'blood_bank/transfusions/transfusion_list.html', {'page_obj': page_obj}) + + +@login_required +def transfusion_detail(request, transfusion_id): + """Transfusion detail view""" + transfusion = get_object_or_404(Transfusion, id=transfusion_id) + + # Get adverse reactions + reactions = AdverseReaction.objects.filter(transfusion=transfusion) + + context = { + 'transfusion': transfusion, + 'reactions': reactions, + } + + return render(request, 'blood_bank/transfusions/transfusion_detail.html', context) + + +@login_required +@permission_required('blood_bank.add_transfusion') +def transfusion_create(request, issue_id): + """Start transfusion""" + blood_issue = get_object_or_404(BloodIssue, id=issue_id) + + if request.method == 'POST': + form = TransfusionForm(request.POST) + if form.is_valid(): + transfusion = form.save(commit=False) + transfusion.administered_by = request.user + transfusion.save() + + # Update blood unit status + blood_issue.blood_unit.status = 'transfused' + blood_issue.blood_unit.save() + + messages.success(request, 'Transfusion started successfully.') + return redirect('blood_bank:transfusion_detail', transfusion_id=transfusion.id) + else: + form = TransfusionForm(initial={ + 'blood_issue': blood_issue, + 'start_time': timezone.now() + }) + + context = { + 'form': form, + 'blood_issue': blood_issue, + 'title': 'Start Transfusion' + } + + return render(request, 'blood_bank/transfusions/transfusion_form.html', context) + + +# Testing Views +@login_required +@permission_required('blood_bank.add_bloodtest') +def blood_test_create(request, unit_id): + """Add test result for blood unit""" + blood_unit = get_object_or_404(BloodUnit, id=unit_id) + + if request.method == 'POST': + form = BloodTestForm(request.POST) + if form.is_valid(): + test = form.save(commit=False) + test.tested_by = request.user + test.save() + + # Update blood unit status based on test results + if test.result == 'positive' and test.test_type in ['hiv', 'hbv', 'hcv', 'syphilis']: + blood_unit.status = 'discarded' + blood_unit.save() + + messages.success(request, f'Test result for {test.get_test_type_display()} added successfully.') + return redirect('blood_bank:blood_unit_detail', unit_id=blood_unit.id) + else: + form = BloodTestForm(initial={ + 'blood_unit': blood_unit, + 'test_date': timezone.now() + }) + + context = { + 'form': form, + 'blood_unit': blood_unit, + 'title': 'Add Test Result' + } + + return render(request, 'blood_bank/tests/blood_test_form.html', context) + + +@login_required +@permission_required('blood_bank.add_crossmatch') +def crossmatch_create(request, unit_id, patient_id): + """Create crossmatch test""" + blood_unit = get_object_or_404(BloodUnit, id=unit_id) + + if request.method == 'POST': + form = CrossMatchForm(request.POST) + if form.is_valid(): + crossmatch = form.save(commit=False) + crossmatch.tested_by = request.user + crossmatch.save() + + messages.success(request, 'Crossmatch test created successfully.') + return redirect('blood_bank:blood_unit_detail', unit_id=blood_unit.id) + else: + form = CrossMatchForm(initial={ + 'blood_unit': blood_unit, + 'test_date': timezone.now() + }) + + context = { + 'form': form, + 'blood_unit': blood_unit, + 'title': 'Crossmatch Test' + } + + return render(request, 'blood_bank/crossmatch/crossmatch_form.html', context) + + +# Inventory Management Views +@login_required +def inventory_overview(request): + """Blood inventory overview""" + # Get inventory by blood group and component + inventory_data = BloodUnit.objects.filter(status='available').values( + 'blood_group__abo_type', 'blood_group__rh_factor', 'component__name' + ).annotate(count=Count('id')).order_by( + 'blood_group__abo_type', 'blood_group__rh_factor', 'component__name' + ) + + # Get expiring units + expiring_units = BloodUnit.objects.filter( + status='available', + expiry_date__lte=timezone.now() + timedelta(days=7) + ).select_related('component', 'blood_group').order_by('expiry_date') + + # Get location utilization + locations = InventoryLocation.objects.filter(is_active=True) + + context = { + 'inventory_data': inventory_data, + 'expiring_units': expiring_units, + 'locations': locations, + } + + return render(request, 'blood_bank/inventory/inventory_overview.html', context) + + +# Quality Control Views +@login_required +def quality_control_list(request): + """List quality control tests""" + qc_tests = QualityControl.objects.select_related( + 'performed_by', 'reviewed_by' + ).order_by('-test_date') + + paginator = Paginator(qc_tests, 25) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + return render(request, 'blood_bank/quality_control/quality_control_list.html', {'page_obj': page_obj}) + + +@login_required +@permission_required('blood_bank.add_qualitycontrol') +def quality_control_create(request): + """Create quality control test""" + if request.method == 'POST': + form = QualityControlForm(request.POST) + if form.is_valid(): + qc_test = form.save(commit=False) + qc_test.performed_by = request.user + qc_test.save() + messages.success(request, 'Quality control test created successfully.') + return redirect('blood_bank:quality_control_list') + else: + form = QualityControlForm(initial={'test_date': timezone.now()}) + + return render(request, 'blood_bank/quality_control/quality_control_form.html', { + 'form': form, 'title': 'Create QC Test' + }) + + +# API Views for AJAX requests +@login_required +@require_http_methods(["GET"]) +def api_blood_availability(request): + """API endpoint for checking blood availability""" + blood_group_id = request.GET.get('blood_group') + component_id = request.GET.get('component') + + if not blood_group_id or not component_id: + return JsonResponse({'error': 'Missing parameters'}, status=400) + + available_units = BloodUnit.objects.filter( + blood_group_id=blood_group_id, + component_id=component_id, + status='available' + ).count() + + return JsonResponse({'available_units': available_units}) + + +@login_required +@require_http_methods(["GET"]) +def api_donor_search(request): + """API endpoint for donor search""" + query = request.GET.get('q', '') + + if len(query) < 2: + return JsonResponse({'donors': []}) + + donors = Donor.objects.filter( + Q(donor_id__icontains=query) | + Q(first_name__icontains=query) | + Q(last_name__icontains=query) + ).filter(status='active')[:10] + + donor_data = [{ + 'id': donor.id, + 'donor_id': donor.donor_id, + 'name': donor.full_name, + 'blood_group': str(donor.blood_group), + 'is_eligible': donor.is_eligible_for_donation + } for donor in donors] + + return JsonResponse({'donors': donor_data}) + + +# Reports Views +@login_required +def reports_dashboard(request): + """Blood bank reports dashboard""" + # Get date range from request + start_date = request.GET.get('start_date') + end_date = request.GET.get('end_date') + + if not start_date: + start_date = timezone.now() - timedelta(days=30) + else: + start_date = timezone.datetime.strptime(start_date, '%Y-%m-%d').date() + + if not end_date: + end_date = timezone.now().date() + else: + end_date = timezone.datetime.strptime(end_date, '%Y-%m-%d').date() + + # Collection statistics + collections = BloodUnit.objects.filter( + collection_date__date__range=[start_date, end_date] + ) + + # Transfusion statistics + transfusions = Transfusion.objects.filter( + start_time__date__range=[start_date, end_date] + ) + + # Adverse reactions + reactions = AdverseReaction.objects.filter( + onset_time__date__range=[start_date, end_date] + ) + + context = { + 'start_date': start_date, + 'end_date': end_date, + 'total_collections': collections.count(), + 'total_transfusions': transfusions.count(), + 'total_reactions': reactions.count(), + 'collections_by_type': collections.values('component__name').annotate(count=Count('id')), + 'transfusions_by_type': transfusions.values( + 'blood_issue__blood_unit__component__name' + ).annotate(count=Count('id')), + 'reactions_by_type': reactions.values('reaction_type').annotate(count=Count('id')), + } + + return render(request, 'blood_bank/reports_dashboard.html', context) + + +# Additional API Views for JavaScript functions +@login_required +@require_http_methods(["POST"]) +def api_move_unit(request, unit_id): + """API endpoint for moving blood unit to different location""" + try: + unit = BloodUnit.objects.get(id=unit_id) + new_location_id = request.POST.get('location_id') + + if not new_location_id: + return JsonResponse({'error': 'Location ID required'}, status=400) + + try: + new_location = InventoryLocation.objects.get(id=new_location_id) + except InventoryLocation.DoesNotExist: + return JsonResponse({'error': 'Invalid location'}, status=400) + + # Check location capacity + current_units = BloodUnit.objects.filter( + current_location=new_location, + status__in=['available', 'quarantined'] + ).count() + + if current_units >= new_location.capacity: + return JsonResponse({'error': 'Location at capacity'}, status=400) + + old_location = unit.current_location + unit.current_location = new_location + unit.save() + + return JsonResponse({ + 'success': True, + 'message': f'Unit moved from {old_location} to {new_location}', + 'new_location': str(new_location) + }) + + except BloodUnit.DoesNotExist: + return JsonResponse({'error': 'Blood unit not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["GET"]) +def api_expiry_report(request): + """API endpoint for expiry report""" + days_ahead = int(request.GET.get('days', 7)) + + expiring_units = BloodUnit.objects.filter( + expiry_date__lte=timezone.now() + timedelta(days=days_ahead), + status='available' + ).select_related('blood_group', 'component', 'current_location') + + report_data = [] + for unit in expiring_units: + days_to_expiry = (unit.expiry_date - timezone.now().date()).days + report_data.append({ + 'unit_number': unit.unit_number, + 'blood_group': str(unit.blood_group), + 'component': unit.component.get_name_display(), + 'expiry_date': unit.expiry_date.strftime('%Y-%m-%d'), + 'days_to_expiry': days_to_expiry, + 'location': str(unit.current_location), + 'urgency': 'critical' if days_to_expiry <= 2 else 'warning' if days_to_expiry <= 5 else 'normal' + }) + + return JsonResponse({ + 'units': report_data, + 'total_expiring': len(report_data), + 'critical_count': len([u for u in report_data if u['urgency'] == 'critical']), + 'warning_count': len([u for u in report_data if u['urgency'] == 'warning']) + }) + + +@login_required +@require_http_methods(["POST"]) +def api_cancel_request(request, request_id): + """API endpoint for cancelling blood request""" + try: + blood_request = BloodRequest.objects.get(id=request_id) + + if blood_request.status in ['completed', 'cancelled']: + return JsonResponse({'error': 'Request cannot be cancelled'}, status=400) + + cancellation_reason = request.POST.get('reason', '') + if not cancellation_reason: + return JsonResponse({'error': 'Cancellation reason required'}, status=400) + + # Release any reserved units + reserved_units = BloodUnit.objects.filter( + reserved_for_request=blood_request, + status='reserved' + ) + reserved_units.update(status='available', reserved_for_request=None) + + blood_request.status = 'cancelled' + blood_request.cancellation_reason = cancellation_reason + blood_request.cancelled_by = request.user + blood_request.cancellation_date = timezone.now() + blood_request.save() + + return JsonResponse({ + 'success': True, + 'message': 'Blood request cancelled successfully', + 'released_units': reserved_units.count() + }) + + except BloodRequest.DoesNotExist: + return JsonResponse({'error': 'Blood request not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["GET"]) +def api_check_availability(request): + """API endpoint for real-time blood availability checking""" + blood_group_id = request.GET.get('blood_group') + component_id = request.GET.get('component') + quantity = int(request.GET.get('quantity', 1)) + + if not blood_group_id or not component_id: + return JsonResponse({'error': 'Missing parameters'}, status=400) + + available_units = BloodUnit.objects.filter( + blood_group_id=blood_group_id, + component_id=component_id, + status='available' + ).order_by('expiry_date') + + total_available = available_units.count() + expiring_soon = available_units.filter( + expiry_date__lte=timezone.now() + timedelta(days=7) + ).count() + + # Get units by location + location_breakdown = {} + for unit in available_units: + location = str(unit.current_location) + if location not in location_breakdown: + location_breakdown[location] = 0 + location_breakdown[location] += 1 + + return JsonResponse({ + 'total_available': total_available, + 'requested_quantity': quantity, + 'can_fulfill': total_available >= quantity, + 'expiring_soon': expiring_soon, + 'location_breakdown': location_breakdown, + 'oldest_unit_expiry': available_units.first().expiry_date.strftime( + '%Y-%m-%d') if available_units.exists() else None + }) + + +@login_required +@require_http_methods(["GET"]) +def api_urgency_report(request): + """API endpoint for urgency statistics report""" + # Get requests by urgency level + urgency_stats = BloodRequest.objects.values('urgency').annotate( + count=Count('id'), + pending=Count('id', filter=Q(status='pending')), + completed=Count('id', filter=Q(status='completed')) + ) + + # Get emergency requests from last 24 hours + emergency_requests = BloodRequest.objects.filter( + urgency='emergency', + created_at__gte=timezone.now() - timedelta(hours=24) + ).count() + + # Average response time for urgent requests + urgent_completed = BloodRequest.objects.filter( + urgency__in=['urgent', 'emergency'], + status='completed', + completed_at__isnull=False + ) + + avg_response_times = {} + for request in urgent_completed: + urgency = request.urgency + response_time = (request.completed_at - request.created_at).total_seconds() / 60 # minutes + if urgency not in avg_response_times: + avg_response_times[urgency] = [] + avg_response_times[urgency].append(response_time) + + # Calculate averages + for urgency in avg_response_times: + times = avg_response_times[urgency] + avg_response_times[urgency] = sum(times) / len(times) if times else 0 + + return JsonResponse({ + 'urgency_breakdown': list(urgency_stats), + 'emergency_last_24h': emergency_requests, + 'avg_response_times': avg_response_times, + 'total_pending': BloodRequest.objects.filter(status='pending').count() + }) + + +@login_required +@require_http_methods(["POST"]) +def api_initiate_capa(request): + """API endpoint for initiating CAPA (Corrective and Preventive Action)""" + qc_record_id = request.POST.get('qc_record_id') + priority = request.POST.get('priority', 'medium') + assessment = request.POST.get('assessment', '') + + if not qc_record_id: + return JsonResponse({'error': 'QC record ID required'}, status=400) + + try: + qc_record = QualityControl.objects.get(id=qc_record_id) + + if qc_record.capa_initiated: + return JsonResponse({'error': 'CAPA already initiated'}, status=400) + + # Generate CAPA number + capa_number = f"CAPA-{qc_record.id}-{timezone.now().strftime('%Y%m%d')}" + + qc_record.capa_initiated = True + qc_record.capa_number = capa_number + qc_record.capa_priority = priority + qc_record.capa_initiated_by = request.user + qc_record.capa_date = timezone.now() + qc_record.capa_assessment = assessment + qc_record.capa_status = 'open' + qc_record.save() + + return JsonResponse({ + 'success': True, + 'capa_number': capa_number, + 'message': f'CAPA {capa_number} initiated successfully' + }) + + except QualityControl.DoesNotExist: + return JsonResponse({'error': 'QC record not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["POST"]) +def api_review_results(request): + """API endpoint for reviewing QC results""" + qc_record_id = request.POST.get('qc_record_id') + review_notes = request.POST.get('review_notes', '') + + if not qc_record_id: + return JsonResponse({'error': 'QC record ID required'}, status=400) + + try: + qc_record = QualityControl.objects.get(id=qc_record_id) + + if qc_record.reviewed_by: + return JsonResponse({'error': 'Results already reviewed'}, status=400) + + qc_record.reviewed_by = request.user + qc_record.review_date = timezone.now() + qc_record.review_notes = review_notes + qc_record.save() + + return JsonResponse({ + 'success': True, + 'reviewed_by': request.user.get_full_name(), + 'review_date': qc_record.review_date.strftime('%Y-%m-%d %H:%M'), + 'message': 'QC results reviewed successfully' + }) + + except QualityControl.DoesNotExist: + return JsonResponse({'error': 'QC record not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["POST"]) +def api_record_vital_signs(request): + """API endpoint for recording vital signs during transfusion""" + transfusion_id = request.POST.get('transfusion_id') + + if not transfusion_id: + return JsonResponse({'error': 'Transfusion ID required'}, status=400) + + try: + transfusion = Transfusion.objects.get(id=transfusion_id) + + vital_signs = { + 'blood_pressure': request.POST.get('blood_pressure'), + 'heart_rate': request.POST.get('heart_rate'), + 'temperature': request.POST.get('temperature'), + 'respiratory_rate': request.POST.get('respiratory_rate'), + 'oxygen_saturation': request.POST.get('oxygen_saturation'), + 'recorded_at': timezone.now().isoformat(), + 'recorded_by': request.user.get_full_name() + } + + # Add to existing vital signs history + if transfusion.vital_signs_history: + vital_signs_list = json.loads(transfusion.vital_signs_history) + else: + vital_signs_list = [] + + vital_signs_list.append(vital_signs) + transfusion.vital_signs_history = json.dumps(vital_signs_list) + + # Update current vital signs + transfusion.current_blood_pressure = vital_signs['blood_pressure'] + transfusion.current_heart_rate = vital_signs['heart_rate'] + transfusion.current_temperature = vital_signs['temperature'] + transfusion.current_respiratory_rate = vital_signs['respiratory_rate'] + transfusion.current_oxygen_saturation = vital_signs['oxygen_saturation'] + transfusion.last_vitals_check = timezone.now() + + transfusion.save() + + return JsonResponse({ + 'success': True, + 'message': 'Vital signs recorded successfully', + 'vital_signs': vital_signs + }) + + except Transfusion.DoesNotExist: + return JsonResponse({'error': 'Transfusion not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["POST"]) +def api_stop_transfusion(request): + """API endpoint for emergency stop of transfusion""" + transfusion_id = request.POST.get('transfusion_id') + stop_reason = request.POST.get('stop_reason', '') + + if not transfusion_id: + return JsonResponse({'error': 'Transfusion ID required'}, status=400) + + try: + transfusion = Transfusion.objects.get(id=transfusion_id) + + if transfusion.status not in ['started', 'in_progress']: + return JsonResponse({'error': 'Transfusion cannot be stopped'}, status=400) + + transfusion.status = 'stopped' + transfusion.end_time = timezone.now() + transfusion.stop_reason = stop_reason + transfusion.stopped_by = request.user + + # Calculate volume transfused based on time elapsed + if transfusion.start_time: + elapsed_minutes = (timezone.now() - transfusion.start_time).total_seconds() / 60 + rate_ml_per_min = transfusion.transfusion_rate / 60 if transfusion.transfusion_rate else 0 + volume_transfused = min(elapsed_minutes * rate_ml_per_min, transfusion.blood_unit.volume_ml) + transfusion.volume_transfused = volume_transfused + + transfusion.save() + + return JsonResponse({ + 'success': True, + 'message': 'Transfusion stopped successfully', + 'volume_transfused': transfusion.volume_transfused, + 'stop_time': transfusion.end_time.strftime('%Y-%m-%d %H:%M:%S') + }) + + except Transfusion.DoesNotExist: + return JsonResponse({'error': 'Transfusion not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["POST"]) +def api_complete_transfusion(request): + """API endpoint for completing transfusion""" + transfusion_id = request.POST.get('transfusion_id') + completion_notes = request.POST.get('completion_notes', '') + + if not transfusion_id: + return JsonResponse({'error': 'Transfusion ID required'}, status=400) + + try: + transfusion = Transfusion.objects.get(id=transfusion_id) + + if transfusion.status not in ['started', 'in_progress']: + return JsonResponse({'error': 'Transfusion cannot be completed'}, status=400) + + transfusion.status = 'completed' + transfusion.end_time = timezone.now() + transfusion.completion_notes = completion_notes + transfusion.completed_by = request.user + + # Set volume transfused to full unit if not already set + if not transfusion.volume_transfused: + transfusion.volume_transfused = transfusion.blood_unit.volume_ml + + transfusion.save() + + # Update blood unit status + blood_unit = transfusion.blood_unit + blood_unit.status = 'transfused' + blood_unit.save() + + return JsonResponse({ + 'success': True, + 'message': 'Transfusion completed successfully', + 'completion_time': transfusion.end_time.strftime('%Y-%m-%d %H:%M:%S'), + 'total_volume': transfusion.volume_transfused + }) + + except Transfusion.DoesNotExist: + return JsonResponse({'error': 'Transfusion not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + +@login_required +@require_http_methods(["GET"]) +def api_export_csv(request): + """API endpoint for exporting data to CSV""" + import csv + from django.http import HttpResponse + + export_type = request.GET.get('type', 'donors') + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = f'attachment; filename="{export_type}_{timezone.now().strftime("%Y%m%d")}.csv"' + + writer = csv.writer(response) + + if export_type == 'donors': + writer.writerow(['Donor ID', 'Name', 'Blood Group', 'Status', 'Last Donation', 'Total Donations']) + donors = Donor.objects.select_related('blood_group').all() + for donor in donors: + last_donation = donor.blood_units.order_by('-collection_date').first() + writer.writerow([ + donor.donor_id, + donor.full_name, + str(donor.blood_group), + donor.get_status_display(), + last_donation.collection_date.strftime('%Y-%m-%d') if last_donation else 'Never', + donor.blood_units.count() + ]) + + elif export_type == 'units': + writer.writerow( + ['Unit Number', 'Blood Group', 'Component', 'Status', 'Collection Date', 'Expiry Date', 'Location']) + units = BloodUnit.objects.select_related('blood_group', 'component', 'current_location').all() + for unit in units: + writer.writerow([ + unit.unit_number, + str(unit.blood_group), + unit.component.get_name_display(), + unit.get_status_display(), + unit.collection_date.strftime('%Y-%m-%d'), + unit.expiry_date.strftime('%Y-%m-%d'), + str(unit.current_location) + ]) + + elif export_type == 'requests': + writer.writerow( + ['Request Number', 'Patient', 'Blood Group', 'Component', 'Quantity', 'Urgency', 'Status', 'Created Date']) + requests = BloodRequest.objects.select_related('patient', 'component').all() + for req in requests: + writer.writerow([ + req.request_number, + req.patient.full_name, + str(req.patient.blood_group), + req.component.get_name_display(), + req.quantity_requested, + req.get_urgency_display(), + req.get_status_display(), + req.created_at.strftime('%Y-%m-%d %H:%M') + ]) + + return response + + +@login_required +@require_http_methods(["GET"]) +def api_inventory_locations(request): + """API endpoint for inventory location management""" + locations = InventoryLocation.objects.all() + + location_data = [] + for location in locations: + current_units = BloodUnit.objects.filter( + current_location=location, + status__in=['available', 'quarantined'] + ).count() + + location_data.append({ + 'id': location.id, + 'name': location.name, + 'location_type': location.get_location_type_display(), + 'capacity': location.capacity, + 'current_units': current_units, + 'available_space': location.capacity - current_units, + 'temperature': location.temperature, + 'is_active': location.is_active, + 'utilization_percent': round((current_units / location.capacity) * 100, 1) if location.capacity > 0 else 0 + }) + + return JsonResponse({'locations': location_data}) + + +@login_required +@require_http_methods(["POST"]) +def api_update_location(request, location_id): + """API endpoint for updating inventory location""" + try: + location = InventoryLocation.objects.get(id=location_id) + + # Update fields if provided + if 'temperature' in request.POST: + location.temperature = float(request.POST['temperature']) + + if 'is_active' in request.POST: + location.is_active = request.POST['is_active'].lower() == 'true' + + if 'notes' in request.POST: + location.notes = request.POST['notes'] + + location.save() + + return JsonResponse({ + 'success': True, + 'message': 'Location updated successfully', + 'location': { + 'id': location.id, + 'name': location.name, + 'temperature': location.temperature, + 'is_active': location.is_active + } + }) + + except InventoryLocation.DoesNotExist: + return JsonResponse({'error': 'Location not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + diff --git a/core/templatetags/__pycache__/custom_filters.cpython-312.pyc b/core/templatetags/__pycache__/custom_filters.cpython-312.pyc index 35fcc78a60e5f66db0685cacf1841979be850f85..a33beab2609bec226a8dd355b36df2a03b09c4f3 100644 GIT binary patch delta 5130 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 D7qh;W delta 1350 zcmZ`(O=uHQ5YF45m~7l6+x)aK)~2?mU96x*YC)+~tXQRDD-`u$sM&41lI)h*O`!+z z(o?;(JkX=wL@H9)lLztSNj-S*V5EvS3o7kFPad52LgMnn zsHzgeXXne~`IW+2yn~!s>l>AXkV)w3!SvcjRF0Xk8y%D!PA8W`>&zFQt12fyN-1qu zfQ=)YqsVqf9!1wl!`Dy(9*NezSb$Bo*xdnEYq4s8ZELc0oa~lU&979(NGy|9e(5H! z1+&hySS=7S+hW@SYFrb!k5EG_5}n=_m*qItuh6tK zU5KIuOlMa>C=@`&S6wu$MbOYn&=sjb5_Da@D0h>D5Aqd>#OcfEY0^P8 zWq`!!h@xkC7{#qsON%p=n(4wIZp`^Nm9%&~kESj`n1$+PP-M`@;IB*~)mp`~7Ai|{ z6xS#Gm#QO7vH%a|e+8&(S50tETZ@)!IrbQU1AoU1V|A8c!Z3y@9b5mK7}r; z{@ct8;TAgpIvFs*^+=^lV98{Hipr1{-res(iZmYyj&%7oV%ch2RC$71ydRRLl~N5%8Jgw~@)y z=w0MQ)iG)na|CSU*q@d=kGL%oLN-JB522n-C6s>`N^FMqZioH#V-rN#5%!QSU@?9I D-{Ke@ diff --git a/core/templatetags/custom_filters.py b/core/templatetags/custom_filters.py index 6a7871a0..81a20d89 100644 --- a/core/templatetags/custom_filters.py +++ b/core/templatetags/custom_filters.py @@ -3,6 +3,11 @@ from django.db.models import Sum, F from decimal import Decimal import operator from functools import reduce +from django.utils import timezone +from datetime import datetime, date +from dateutil.relativedelta import relativedelta # pip install python-dateutil +import math + register = template.Library() @@ -320,3 +325,112 @@ def calculate_stock_value(inventory_items): return Decimal('0.00') + + + +def _to_datetime(d): + """Coerce date or datetime to an aware datetime in current timezone.""" + if isinstance(d, datetime): + dt = d + elif isinstance(d, date): + dt = datetime(d.year, d.month, d.day) + else: + return None + if timezone.is_naive(dt): + dt = timezone.make_aware(dt, timezone.get_current_timezone()) + return dt + + +def _age_breakdown(dob, now=None): + """ + Returns (value:int, unit:str) choosing one of hours/days/months/years. + Auto logic: + - < 48 hours -> hours + - < 60 days -> days + - < 24 months -> months + - otherwise -> years + """ + dt_dob = _to_datetime(dob) + if not dt_dob: + return (0, "days") + + now = now or timezone.now() + if dt_dob > now: # future DOB guard + return (0, "days") + + # Raw time diff + delta = now - dt_dob + total_hours = delta.total_seconds() / 3600.0 + total_days = delta.days + + # Months/years via relativedelta for calendar accuracy + rd = relativedelta(now, dt_dob) + total_months = rd.years * 12 + rd.months + years = rd.years + + if total_hours < 24: + return (int(math.floor(total_hours)), "hours") + if total_days < 30: + return (int(total_days), "days") + if total_months < 12: + return (int(total_months), "months") + return (int(years), "years") + + +def _age_in_unit(dob, unit, now=None): + """Force a specific unit: hours/days/months/years.""" + dt_dob = _to_datetime(dob) + if not dt_dob: + return 0, unit + + now = now or timezone.now() + if dt_dob > now: + return 0, unit + + delta = now - dt_dob + if unit == "hours": + val = int(delta.total_seconds() // 3600) + elif unit == "days": + val = delta.days + elif unit == "months": + rd = relativedelta(now, dt_dob) + val = rd.years * 12 + rd.months + elif unit == "years": + rd = relativedelta(now, dt_dob) + val = rd.years + else: + # Fallback to auto if unit invalid + return _age_breakdown(dob, now) + return val, unit + + +@register.filter +def age_label(dob, mode="auto"): + """ + Returns a human-friendly string like: "12 hours", "17 days", "3 months", "5 years". + Usage: + {{ person.dob|age_label }} -> auto unit + {{ person.dob|age_label:"months" }} -> force months + """ + if mode in ("hours", "days", "months", "years"): + value, unit = _age_in_unit(dob, mode) + else: + value, unit = _age_breakdown(dob) + return f"{value} {unit}" + + +@register.simple_tag +def age_parts(dob, mode="auto"): + """ + Returns a dict with separate value and unit for flexible rendering. + Usage: + {% age_parts person.dob as a %} + {{ a.value }} {{ a.unit }} + # Or force a unit: + {% age_parts person.dob "months" as a %} + """ + if mode in ("hours", "days", "months", "years"): + value, unit = _age_in_unit(dob, mode) + else: + value, unit = _age_breakdown(dob) + return {"value": value, "unit": unit} \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 254681eb86153fb5637b8729d637b8f894304846..1bbada67a855e136f7a82fc04b97fd201e6574d0 100644 GIT binary patch delta 919130 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 MCe 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≶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 bs)%Z$h8RZF62plR#7JV4Y$N>1TYmgsWkw3c diff --git a/hospital_management/__pycache__/settings.cpython-312.pyc b/hospital_management/__pycache__/settings.cpython-312.pyc index 721430c8edf435dd85727e97e597596431bd5f46..dbcf00ebef3509152917c1f95a09b2c4c57c729f 100644 GIT binary patch delta 303 zcmdmHdB~FYG%qg~0}uqQ-kG7dkvD){R_GQ>a(+?jEsn(G-M3hbbCEmceV{)}bHoGt%Qv=rr Pt<7&Gjxw`s1Ihvb>K<0Z delta 266 zcmX?Pxy_RIG%qg~0}wbeZpo0@$Q!^eD0qt{Iln0N7Dr-oa(-!EN%7_?_AnMkmCYBq zS1>awO|IfEWt5xzf&VL`-Q;Hi?n3rJ-I~lrPC%;28AP~Fwigst_5d;6L2^vDI5HCR zQgTv@iovRYiakM+PLs<8;~6~{Ul(K)jQ|SV;`Z<{k9YNRbn~CZlByPk?mpk6RqN9V2I+YG_Ew(G?`q*{855CDJMTaMK>uiFI&HgAIymd saW<#2h%hsroLt4;Fxj0$VDc~am%Q3y0!$wn#2A?xxIY+7{=nf40O-&v?f?J) delta 124 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 diff --git a/inpatients/migrations/0004_bed_is_active_bed_is_active_out_of_service_and_more.py b/inpatients/migrations/0004_bed_is_active_bed_is_active_out_of_service_and_more.py new file mode 100644 index 00000000..8e22d5bb --- /dev/null +++ b/inpatients/migrations/0004_bed_is_active_bed_is_active_out_of_service_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.4 on 2025-09-03 15:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("inpatients", "0003_alter_bed_bed_position"), + ] + + operations = [ + migrations.AddField( + model_name="bed", + name="is_active", + field=models.BooleanField(default=True, help_text="Active status"), + ), + migrations.AddField( + model_name="bed", + name="is_active_out_of_service", + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name="bed", + name="is_operational", + field=models.BooleanField(default=True, help_text="Operational status"), + ), + ] diff --git a/inpatients/migrations/__pycache__/0004_bed_is_active_bed_is_active_out_of_service_and_more.cpython-312.pyc b/inpatients/migrations/__pycache__/0004_bed_is_active_bed_is_active_out_of_service_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4470ef833d182ef9577d538be5065304687b9f0 GIT binary patch literal 1142 zcmb7D&ui2`6rM@4X_9u!8pNu*fkOD@B7=XIMUzszJ?wOowLZM}@p1duzqIhy9+jK2j!3TNszL{^{ynJuwQ?=?KX>VY6#nBP^ zqCjbtli+Ax23v?BhC>u#A4i(6VWgq^h-n*$>3} zDm&)3Hh?=LWm*5oWu2dE$KJ;Ok;yqf6C3?oRc+n3dShNy*pEt`lxRVmO3fh7xv0;~ z%*+xR=8%ykV8xdvJW!GfUCszQ;DomFU=^ONR~L%lI?rj|gJs$cb78MQn35b` z=AJIQqB=oh8i6nhUs(xLlXF+yH+X{ZiVh(QW5gSZs{&(!S^)&gVqR3Vw6;MmdMb|&F8W{-i&CrMq?VT(J+u8?sAf5Ne5bab0y(vkkgRJY1)QJib{Bo z=Ma(Ax#m#l=J296rQ~yk&_gwp^h0!38$x3ye=>vVw3n%uQ8*Rw_tI^kzKQJHeOp^hPm&~p2NFw zhWB~?$-et^K%J<$=IaO9)w0M%&k#22(72sUv!$X5h4h2pxT0tUw=N@L-5GRpKD#EN hdKbJQU0=r-e>V~Kj?GKh+;k3VlY6zvZ%Be-_b*}+B[0-9]+)/\\Z'] +ERROR 2025-09-03 15:00:18,230 basehttp 389 6236844032 "GET /en/patients/insurance-info/22/ HTTP/1.1" 500 228831 +INFO 2025-09-03 15:01:17,975 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:02:06,753 basehttp 389 6236844032 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:02:06,811 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:02:06,811 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:02:06,843 basehttp 389 6220017664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:02:06,851 log 389 6253670400 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:02:06,853 basehttp 389 6253670400 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:02:06,860 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:02:06,861 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +ERROR 2025-09-03 15:02:07,018 log 389 6236844032 Internal Server Error: /en/patients/insurance-info/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_create' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/create/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 15:02:07,019 basehttp 389 6236844032 "GET /en/patients/insurance-info/22/ HTTP/1.1" 500 230401 +INFO 2025-09-03 15:02:28,782 basehttp 389 6236844032 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:02:28,839 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:02:28,839 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:02:28,900 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:02:28,905 log 389 6220017664 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:02:28,907 basehttp 389 6220017664 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:02:28,913 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:02:28,913 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +ERROR 2025-09-03 15:02:29,073 log 389 6253670400 Internal Server Error: /en/patients/insurance-info/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_create' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/create/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 15:02:29,074 basehttp 389 6253670400 "GET /en/patients/insurance-info/22/ HTTP/1.1" 500 230389 +INFO 2025-09-03 15:03:18,326 basehttp 389 6253670400 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:03:18,382 log 389 6253670400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:03:18,382 basehttp 389 6253670400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:03:18,419 basehttp 389 6253670400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:03:18,426 log 389 6236844032 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:03:18,427 basehttp 389 6236844032 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:03:18,437 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:03:18,441 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +ERROR 2025-09-03 15:03:18,465 log 389 6220017664 Internal Server Error: /en/patients/insurance-info/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_coverage' not found. 'insurance_coverage' is not a valid view function or pattern name. +ERROR 2025-09-03 15:03:18,466 basehttp 389 6220017664 "GET /en/patients/insurance-info/22/ HTTP/1.1" 500 228801 +INFO 2025-09-03 15:04:18,403 basehttp 389 6220017664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:04:45,026 basehttp 389 6220017664 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:04:45,064 log 389 6220017664 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:04:45,064 basehttp 389 6220017664 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:04:45,112 basehttp 389 6220017664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:04:45,125 log 389 6253670400 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:04:45,126 basehttp 389 6253670400 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:04:45,137 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:04:45,141 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +ERROR 2025-09-03 15:04:45,164 log 389 6236844032 Internal Server Error: /en/patients/insurance-info/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'verify_insurance' not found. 'verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 15:04:45,165 basehttp 389 6236844032 "GET /en/patients/insurance-info/22/ HTTP/1.1" 500 229936 +INFO 2025-09-03 15:05:33,442 basehttp 389 6236844032 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:05:33,499 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:05:33,499 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:05:33,536 log 389 6220017664 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 15:05:33,539 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:05:33,541 basehttp 389 6220017664 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:05:33,552 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:05:33,556 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +INFO 2025-09-03 15:05:33,562 basehttp 389 6253670400 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 138520 +WARNING 2025-09-03 15:05:33,591 basehttp 389 6203191296 "GET /static/assets/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 404 2143 +WARNING 2025-09-03 15:05:33,591 basehttp 389 6220017664 "GET /static/assets/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2098 +WARNING 2025-09-03 15:05:33,593 basehttp 389 6236844032 "GET /static/assets/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 404 2122 +WARNING 2025-09-03 15:05:33,595 basehttp 389 6287323136 "GET /static/assets/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 404 2155 +INFO 2025-09-03 15:05:33,596 basehttp 389 6270496768 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 15:05:33,596 basehttp 389 6253670400 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 15:05:33,601 basehttp 389 6253670400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:05:58,001 basehttp 389 6253670400 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:05:58,032 log 389 6253670400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:05:58,032 basehttp 389 6253670400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:05:58,104 log 389 6220017664 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 15:05:58,106 basehttp 389 6253670400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:05:58,106 basehttp 389 6220017664 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:05:58,116 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:05:58,120 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +INFO 2025-09-03 15:05:58,127 basehttp 389 6203191296 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 138485 +INFO 2025-09-03 15:05:58,164 basehttp 389 6203191296 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-03 15:05:58,176 basehttp 389 6270496768 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 15:05:58,176 basehttp 389 6253670400 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 15:05:58,177 basehttp 389 6220017664 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 15:05:58,181 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:06:00,785 basehttp 389 6236844032 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +INFO 2025-09-03 15:06:00,795 basehttp 389 6253670400 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-03 15:06:00,799 basehttp 389 6287323136 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 15:06:00,800 basehttp 389 6253670400 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-03 15:06:00,810 basehttp 389 6236844032 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-03 15:06:00,812 basehttp 389 6253670400 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +WARNING 2025-09-03 15:06:00,818 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:06:00,819 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:06:00,820 basehttp 389 6203191296 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 15:06:00,822 basehttp 389 6236844032 - Broken pipe from ('127.0.0.1', 51105) +INFO 2025-09-03 15:06:00,825 basehttp 389 6270496768 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 15:06:00,826 basehttp 389 6220017664 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 15:06:00,827 basehttp 389 6287323136 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 15:06:01,133 basehttp 389 6287323136 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 15:06:01,133 basehttp 389 6220017664 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 15:06:01,133 basehttp 389 6253670400 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 15:06:01,134 basehttp 389 6270496768 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 15:06:01,137 basehttp 389 6203191296 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 15:06:01,138 basehttp 389 6236844032 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 15:06:01,138 basehttp 389 6270496768 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 15:06:01,139 basehttp 389 6287323136 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 15:06:01,140 basehttp 389 6270496768 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 15:06:01,142 basehttp 389 6287323136 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 15:06:01,143 basehttp 389 6270496768 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 15:06:01,145 basehttp 389 6287323136 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 15:06:01,145 basehttp 389 6270496768 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 15:06:01,146 basehttp 389 6270496768 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 15:06:01,146 basehttp 389 6287323136 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 15:06:01,147 basehttp 389 6270496768 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 15:06:01,148 basehttp 389 6287323136 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 15:06:01,149 basehttp 389 6270496768 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 15:06:01,149 basehttp 389 6287323136 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 15:06:01,151 basehttp 389 6270496768 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 15:06:01,151 basehttp 389 6287323136 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 15:06:01,153 basehttp 389 6287323136 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 15:06:01,153 basehttp 389 6270496768 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-03 15:06:01,167 basehttp 389 6253670400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:06:01,176 log 389 6236844032 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:06:01,179 basehttp 389 6236844032 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63628 +ERROR 2025-09-03 15:06:01,184 log 389 6220017664 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:06:01,187 basehttp 389 6220017664 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 90058 +INFO 2025-09-03 15:06:01,193 basehttp 389 6203191296 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 138485 +INFO 2025-09-03 15:06:01,210 basehttp 389 6287323136 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 15:06:01,211 basehttp 389 6253670400 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 15:06:01,211 basehttp 389 6203191296 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 15:06:01,212 basehttp 389 6270496768 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 15:06:01,212 basehttp 389 6220017664 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 15:06:01,212 basehttp 389 6236844032 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-03 15:06:01,218 basehttp 389 6236844032 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 15:06:01,282 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 15:06:01,301 log 389 6236844032 Not Found: /favicon.ico +WARNING 2025-09-03 15:06:01,301 basehttp 389 6236844032 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-03 15:07:01,151 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:07:01,290 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:07:03,927 basehttp 389 6236844032 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +WARNING 2025-09-03 15:07:03,958 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:07:03,958 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:07:04,004 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:07:04,029 log 389 6203191296 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:07:04,031 basehttp 389 6203191296 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +ERROR 2025-09-03 15:07:04,044 log 389 6270496768 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:07:04,048 basehttp 389 6270496768 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 89793 +INFO 2025-09-03 15:07:04,050 basehttp 389 6220017664 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 138485 +INFO 2025-09-03 15:07:04,074 basehttp 389 6220017664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:07:09,121 basehttp 389 6220017664 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +INFO 2025-09-03 15:07:09,132 basehttp 389 6203191296 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-03 15:07:09,134 basehttp 389 6287323136 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 15:07:09,135 basehttp 389 6203191296 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-03 15:07:09,146 basehttp 389 6220017664 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +WARNING 2025-09-03 15:07:09,149 log 389 6287323136 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:07:09,149 basehttp 389 6287323136 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:07:09,152 basehttp 389 6253670400 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 15:07:09,152 basehttp 389 6220017664 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-03 15:07:09,155 basehttp 389 6236844032 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 15:07:09,156 basehttp 389 6270496768 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 15:07:09,157 basehttp 389 6203191296 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 15:07:09,362 basehttp 389 6253670400 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 15:07:09,363 basehttp 389 6220017664 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 15:07:09,363 basehttp 389 6270496768 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 15:07:09,364 basehttp 389 6236844032 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 15:07:09,365 basehttp 389 6203191296 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 15:07:09,366 basehttp 389 6287323136 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 15:07:09,368 basehttp 389 6287323136 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 15:07:09,369 basehttp 389 6220017664 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 15:07:09,369 basehttp 389 6287323136 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 15:07:09,370 basehttp 389 6220017664 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 15:07:09,371 basehttp 389 6287323136 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 15:07:09,371 basehttp 389 6220017664 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 15:07:09,372 basehttp 389 6287323136 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 15:07:09,372 basehttp 389 6220017664 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 15:07:09,372 basehttp 389 6287323136 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 15:07:09,373 basehttp 389 6220017664 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 15:07:09,373 basehttp 389 6287323136 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 15:07:09,374 basehttp 389 6220017664 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 15:07:09,374 basehttp 389 6287323136 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 15:07:09,375 basehttp 389 6220017664 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 15:07:09,375 basehttp 389 6287323136 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 15:07:09,376 basehttp 389 6220017664 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 15:07:09,376 basehttp 389 6287323136 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-03 15:07:09,394 basehttp 389 6253670400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:07:09,401 log 389 6203191296 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:07:09,403 basehttp 389 6203191296 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63628 +ERROR 2025-09-03 15:07:09,416 log 389 6236844032 Internal Server Error: /en/patients/emergency-contacts/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 1112, in emergency_contacts_list + ).order_by('-is_primary', 'name') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'name' into field. Choices are: address_line_1, address_line_2, authorization_number, city, created_at, email, first_name, id, is_active, is_authorized_for_financial_decisions, is_authorized_for_information, is_authorized_for_medical_decisions, is_primary, last_name, mobile_number, notes, patient, patient_id, phone_number, priority, relationship, state, updated_at, zip_code +ERROR 2025-09-03 15:07:09,419 basehttp 389 6236844032 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 500 90058 +INFO 2025-09-03 15:07:09,425 basehttp 389 6270496768 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 138485 +INFO 2025-09-03 15:07:09,427 basehttp 389 6203191296 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 15:07:09,462 basehttp 389 6253670400 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 15:07:09,462 basehttp 389 6203191296 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 15:07:09,462 basehttp 389 6220017664 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 15:07:09,463 basehttp 389 6287323136 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 15:07:09,463 basehttp 389 6270496768 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 15:07:09,463 basehttp 389 6236844032 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-03 15:07:09,517 basehttp 389 6236844032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 15:07:09,538 log 389 6236844032 Not Found: /favicon.ico +WARNING 2025-09-03 15:07:09,539 basehttp 389 6236844032 "GET /favicon.ico HTTP/1.1" 404 2557 +WARNING 2025-09-03 15:07:39,480 log 389 6236844032 Not Found: /en/patients/insurance +WARNING 2025-09-03 15:07:39,480 basehttp 389 6236844032 "GET /en/patients/insurance HTTP/1.1" 404 41364 +WARNING 2025-09-03 15:07:39,511 log 389 6236844032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:07:39,512 basehttp 389 6236844032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:08:21,542 autoreload 389 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:08:21,959 autoreload 4226 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:08:24,624 basehttp 4226 6123991040 "GET /en/patients/insurance-info HTTP/1.1" 301 0 +INFO 2025-09-03 15:08:24,691 basehttp 4226 6140817408 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +WARNING 2025-09-03 15:08:24,713 log 4226 6140817408 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:08:24,713 basehttp 4226 6140817408 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:08:24,775 basehttp 4226 6140817408 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:08:32,089 log 4226 6140817408 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_create' with no arguments not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/create/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 15:08:32,091 basehttp 4226 6140817408 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 180114 +WARNING 2025-09-03 15:08:32,109 log 4226 6140817408 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:08:32,109 basehttp 4226 6140817408 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:09:29,204 log 4226 6140817408 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'verify_insurance' not found. 'verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 15:09:29,205 basehttp 4226 6140817408 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172792 +WARNING 2025-09-03 15:09:29,220 log 4226 6140817408 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:09:29,221 basehttp 4226 6140817408 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:10:52,504 autoreload 4226 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:10:52,844 autoreload 5399 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:11:06,353 autoreload 5399 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:11:06,644 autoreload 5485 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-03 15:11:14,885 log 5485 6188003328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:11:14,886 basehttp 5485 6188003328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:11:14,945 basehttp 5485 6171176960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 15:11:15,057 log 5485 6171176960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:11:15,057 basehttp 5485 6171176960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:11:15,728 basehttp 5485 6171176960 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +WARNING 2025-09-03 15:11:15,744 log 5485 6171176960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:11:15,744 basehttp 5485 6171176960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:11:15,824 basehttp 5485 6171176960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:11:17,301 log 5485 6171176960 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'verify_insurance' not found. 'verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 15:11:17,303 basehttp 5485 6171176960 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172655 +WARNING 2025-09-03 15:11:17,320 log 5485 6171176960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:11:17,321 basehttp 5485 6171176960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:11:29,821 autoreload 5485 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:11:30,147 autoreload 5651 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 15:11:30,626 log 5651 6197702656 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' not found. 'check_eligibility' is not a valid view function or pattern name. +ERROR 2025-09-03 15:11:30,627 basehttp 5651 6197702656 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172927 +WARNING 2025-09-03 15:11:30,645 log 5651 6197702656 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:11:30,645 basehttp 5651 6197702656 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:15:08,350 autoreload 5651 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 15:15:08,717 autoreload 7264 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:24:42,899 autoreload 7264 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 15:24:43,417 autoreload 11531 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:28:16,434 autoreload 11531 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:28:16,933 autoreload 13108 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:28:28,613 autoreload 13108 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:28:28,975 autoreload 13192 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:30:17,833 autoreload 13192 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 15:30:18,177 autoreload 13969 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:30:51,592 autoreload 13969 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:30:51,919 autoreload 14286 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 15:30:54,800 log 14286 6200602624 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_claims_history' not found. 'insurance_claims_history' is not a valid view function or pattern name. +ERROR 2025-09-03 15:30:54,801 basehttp 14286 6200602624 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172422 +WARNING 2025-09-03 15:30:54,814 log 14286 6200602624 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:30:54,814 basehttp 14286 6200602624 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:32:45,369 autoreload 14286 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 15:32:45,749 autoreload 15060 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 15:33:46,568 log 15060 6198390784 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_claims_history' not found. 'insurance_claims_history' is not a valid view function or pattern name. +ERROR 2025-09-03 15:33:46,569 basehttp 15060 6198390784 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172422 +WARNING 2025-09-03 15:33:46,581 log 15060 6198390784 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:33:46,581 basehttp 15060 6198390784 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:33:48,014 log 15060 6198390784 Internal Server Error: /en/patients/insurance-info/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_claims_history' not found. 'insurance_claims_history' is not a valid view function or pattern name. +ERROR 2025-09-03 15:33:48,014 basehttp 15060 6198390784 "GET /en/patients/insurance-info/5/ HTTP/1.1" 500 172422 +WARNING 2025-09-03 15:33:48,026 log 15060 6198390784 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:33:48,026 basehttp 15060 6198390784 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:34:11,771 autoreload 15060 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 15:34:12,192 autoreload 15768 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:34:15,733 basehttp 15768 6205255680 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +WARNING 2025-09-03 15:34:15,755 log 15768 6205255680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:34:15,755 basehttp 15768 6205255680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:34:15,829 basehttp 15768 6205255680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:34:27,784 basehttp 15768 6205255680 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14966 +INFO 2025-09-03 15:34:38,972 basehttp 15768 6205255680 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14939 +INFO 2025-09-03 15:34:45,843 basehttp 15768 6205255680 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 80854 +INFO 2025-09-03 15:35:15,823 basehttp 15768 6205255680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:35:15,834 basehttp 15768 6222082048 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 66320 +ERROR 2025-09-03 15:35:22,519 log 15768 6222082048 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_list' with arguments '(6,)' not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/\\Z'] +ERROR 2025-09-03 15:35:22,520 basehttp 15768 6222082048 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 187855 +WARNING 2025-09-03 15:35:22,558 log 15768 6222082048 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:35:22,558 basehttp 15768 6222082048 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:36:19,724 log 15768 6222082048 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_list' with arguments '(6,)' not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/\\Z'] +ERROR 2025-09-03 15:36:19,725 basehttp 15768 6222082048 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 187992 +WARNING 2025-09-03 15:36:19,738 log 15768 6222082048 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:36:19,738 basehttp 15768 6222082048 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:38:18,580 basehttp 15768 6222082048 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 37289 +WARNING 2025-09-03 15:38:18,595 log 15768 6222082048 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:38:18,596 basehttp 15768 6222082048 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:38:18,701 basehttp 15768 6222082048 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:38:18,702 basehttp 15768 6205255680 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +ERROR 2025-09-03 15:38:18,707 log 15768 6255734784 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:38:18,709 basehttp 15768 6255734784 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63351 +INFO 2025-09-03 15:38:18,709 basehttp 15768 6238908416 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +INFO 2025-09-03 15:38:18,743 basehttp 15768 6238908416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:38:48,774 basehttp 15768 6238908416 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 64580 +INFO 2025-09-03 15:39:18,660 basehttp 15768 6238908416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:39:18,768 basehttp 15768 6255734784 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:39:18,770 basehttp 15768 6238908416 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 75153 +INFO 2025-09-03 15:39:48,783 basehttp 15768 6238908416 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 62062 +INFO 2025-09-03 15:40:18,665 basehttp 15768 6238908416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:40:18,781 basehttp 15768 6255734784 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:40:18,783 basehttp 15768 6238908416 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 63158 +INFO 2025-09-03 15:40:26,401 autoreload 15768 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 15:40:26,836 autoreload 18503 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 15:40:27,578 basehttp 18503 6194622464 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 37289 +INFO 2025-09-03 15:40:27,672 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:40:27,687 log 18503 6245101568 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 15:40:27,688 basehttp 18503 6211448832 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +WARNING 2025-09-03 15:40:27,690 log 18503 6194622464 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-03 15:40:27,691 basehttp 18503 6228275200 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +WARNING 2025-09-03 15:40:27,691 basehttp 18503 6194622464 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 15:40:27,691 basehttp 18503 6245101568 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63351 +INFO 2025-09-03 15:40:27,726 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:40:33,880 basehttp 18503 6245101568 "GET /en/patients/patientprofile/7/details/ HTTP/1.1" 200 37320 +WARNING 2025-09-03 15:40:33,901 log 18503 6245101568 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:40:33,901 basehttp 18503 6245101568 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:40:33,970 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:40:33,979 log 18503 6211448832 Internal Server Error: /en/patients/appointments/7/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 15:40:33,980 basehttp 18503 6194622464 "GET /en/patients/emergency-contacts/7/ HTTP/1.1" 200 145 +ERROR 2025-09-03 15:40:33,980 basehttp 18503 6211448832 "GET /en/patients/appointments/7/ HTTP/1.1" 500 63351 +INFO 2025-09-03 15:40:33,980 basehttp 18503 6228275200 "GET /en/patients/insurance-info/7/ HTTP/1.1" 200 36257 +INFO 2025-09-03 15:40:34,026 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:40:43,215 basehttp 18503 6228275200 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +WARNING 2025-09-03 15:40:43,233 log 18503 6228275200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:40:43,233 basehttp 18503 6228275200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:40:43,258 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:40:50,101 basehttp 18503 6228275200 "GET /en/patients/insurance-info/43/ HTTP/1.1" 200 36270 +WARNING 2025-09-03 15:40:50,122 log 18503 6228275200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 15:40:50,122 basehttp 18503 6228275200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 15:40:50,166 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:41:09,285 basehttp 18503 6228275200 "POST /en/patients/check-eligibility/43/ HTTP/1.1" 200 14972 +INFO 2025-09-03 15:41:23,886 basehttp 18503 6228275200 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 74397 +ERROR 2025-09-03 15:41:31,202 log 18503 6228275200 Internal Server Error: /en/patients/insurance-info/update/43/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_primary_insurance' not found. 'check_primary_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 15:41:31,204 basehttp 18503 6228275200 "GET /en/patients/insurance-info/update/43/ HTTP/1.1" 500 187179 +ERROR 2025-09-03 15:41:42,767 log 18503 6228275200 Internal Server Error: /en/patients/insurance-info/create/50/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_primary_insurance' not found. 'check_primary_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 15:41:42,769 basehttp 18503 6228275200 "GET /en/patients/insurance-info/create/50/ HTTP/1.1" 500 184447 +ERROR 2025-09-03 15:41:53,885 log 18503 6228275200 Internal Server Error: /en/patients/renew-insurance/43/ +ERROR 2025-09-03 15:41:53,886 basehttp 18503 6228275200 "POST /en/patients/renew-insurance/43/ HTTP/1.1" 500 126 +INFO 2025-09-03 15:42:04,598 basehttp 18503 6228275200 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 76561 +INFO 2025-09-03 15:42:34,587 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:42:34,600 basehttp 18503 6211448832 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 57536 +INFO 2025-09-03 15:42:40,989 basehttp 18503 6211448832 "POST /en/patients/check-eligibility/43/ HTTP/1.1" 200 14944 +INFO 2025-09-03 15:42:50,140 basehttp 18503 6211448832 "POST /en/patients/check-eligibility/43/ HTTP/1.1" 200 14093 +INFO 2025-09-03 15:43:04,606 basehttp 18503 6211448832 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 56708 +INFO 2025-09-03 15:43:37,610 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:43:37,613 basehttp 18503 6228275200 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 56866 +INFO 2025-09-03 15:44:04,608 basehttp 18503 6228275200 "GET /en/patients/insurance-claims-history/43/ HTTP/1.1" 200 59687 +INFO 2025-09-03 15:44:09,301 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:44:18,627 log 18503 6228275200 Internal Server Error: /en/patients/insurance-info/delete/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_create' with no arguments not found. 1 pattern(s) tried: ['en/patients/insurance\\-info/create/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 15:44:18,628 basehttp 18503 6228275200 "GET /en/patients/insurance-info/delete/5/ HTTP/1.1" 500 178234 +INFO 2025-09-03 15:44:25,825 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:25,834 basehttp 18503 6228275200 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 59303 +INFO 2025-09-03 15:44:25,838 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:34,055 basehttp 18503 6194622464 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 69869 +INFO 2025-09-03 15:44:42,743 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:42,756 basehttp 18503 6194622464 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 48076 +INFO 2025-09-03 15:44:42,761 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:43,396 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:43,399 basehttp 18503 6211448832 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 64166 +INFO 2025-09-03 15:44:47,838 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:44:49,066 basehttp 18503 6211448832 "GET /en/appointments/detail/1515/ HTTP/1.1" 200 22888 +INFO 2025-09-03 15:44:50,570 basehttp 18503 6211448832 "GET /en/appointments/ HTTP/1.1" 200 44186 +INFO 2025-09-03 15:44:50,612 basehttp 18503 6211448832 "GET /en/appointments/stats/ HTTP/1.1" 200 3132 +INFO 2025-09-03 15:44:56,947 basehttp 18503 6211448832 "GET /en/appointments/detail/1515/ HTTP/1.1" 200 22888 +INFO 2025-09-03 15:44:56,978 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:45:00,788 basehttp 18503 6211448832 "GET /en/appointments/create/ HTTP/1.1" 200 36516 +INFO 2025-09-03 15:46:01,798 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:13,460 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:13,480 basehttp 18503 6211448832 "GET /en/appointments/stats/ HTTP/1.1" 200 3132 +INFO 2025-09-03 15:46:14,146 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:17,985 basehttp 18503 6211448832 "GET /en/appointments/detail/1515/ HTTP/1.1" 200 22888 +INFO 2025-09-03 15:46:18,020 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:19,831 basehttp 18503 6211448832 "GET /en/patients/patientprofile/22/details/ HTTP/1.1" 200 37307 +INFO 2025-09-03 15:46:19,881 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:19,889 basehttp 18503 6194622464 "GET /en/patients/emergency-contacts/22/ HTTP/1.1" 200 145 +INFO 2025-09-03 15:46:19,890 basehttp 18503 6228275200 "GET /en/patients/insurance-info/22/ HTTP/1.1" 200 36185 +ERROR 2025-09-03 15:46:19,894 log 18503 6245101568 Internal Server Error: /en/patients/appointments/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 15:46:19,895 basehttp 18503 6245101568 "GET /en/patients/appointments/22/ HTTP/1.1" 500 63363 +INFO 2025-09-03 15:46:19,926 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:46:22,323 log 18503 6245101568 Internal Server Error: /en/patients/emergency-contacts/create/22/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'patient_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/patientprofile/(?P[0-9]+)/details/\\Z'] +ERROR 2025-09-03 15:46:22,324 basehttp 18503 6245101568 "GET /en/patients/emergency-contacts/create/22/ HTTP/1.1" 500 181662 +INFO 2025-09-03 15:46:29,661 basehttp 18503 6245101568 "GET /en/emr/encounters/create/?patient=22 HTTP/1.1" 200 56248 +INFO 2025-09-03 15:46:29,693 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:32,859 basehttp 18503 6245101568 "GET /en/laboratory/orders/create/?patient=22 HTTP/1.1" 200 36955 +INFO 2025-09-03 15:46:32,892 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:46:36,130 basehttp 18503 6245101568 "GET /en/billing/bills/create/?patient=22 HTTP/1.1" 200 109320 +INFO 2025-09-03 15:46:36,165 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:47:18,034 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:48:18,776 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:49:19,774 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:50:20,773 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:51:21,773 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:51:29,348 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:51:29,368 basehttp 18503 6245101568 "GET /en/appointments/stats/ HTTP/1.1" 200 3132 +INFO 2025-09-03 15:51:31,904 basehttp 18503 6245101568 "GET /en/ HTTP/1.1" 200 49798 +INFO 2025-09-03 15:51:31,969 basehttp 18503 6194622464 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 15:51:31,970 basehttp 18503 6211448832 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-03 15:51:31,971 basehttp 18503 6245101568 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2095 +WARNING 2025-09-03 15:51:43,608 log 18503 6245101568 Not Found: /en/insurance-info +WARNING 2025-09-03 15:51:43,608 basehttp 18503 6245101568 "GET /en/insurance-info HTTP/1.1" 404 29883 +INFO 2025-09-03 15:51:50,153 basehttp 18503 6245101568 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +INFO 2025-09-03 15:51:50,200 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:51:54,051 basehttp 18503 6245101568 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +INFO 2025-09-03 15:51:54,083 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:52:01,775 basehttp 18503 6245101568 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14964 +INFO 2025-09-03 15:52:06,298 basehttp 18503 6245101568 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14084 +ERROR 2025-09-03 15:52:15,651 log 18503 6245101568 Internal Server Error: /en/patients/renew-insurance/5/ +ERROR 2025-09-03 15:52:15,652 basehttp 18503 6245101568 "POST /en/patients/renew-insurance/5/ HTTP/1.1" 500 126 +INFO 2025-09-03 15:52:24,105 basehttp 18503 6245101568 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 76173 +INFO 2025-09-03 15:52:40,863 basehttp 18503 6245101568 "GET /en/appointments/ HTTP/1.1" 200 44186 +INFO 2025-09-03 15:52:40,896 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:52:40,911 basehttp 18503 6211448832 "GET /en/appointments/stats/ HTTP/1.1" 200 3132 +INFO 2025-09-03 15:52:46,120 basehttp 18503 6211448832 "GET /en/emr HTTP/1.1" 301 0 +INFO 2025-09-03 15:52:46,143 basehttp 18503 6245101568 "GET /en/emr/ HTTP/1.1" 200 71709 +INFO 2025-09-03 15:52:46,193 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:52:46,198 basehttp 18503 6194622464 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 15:52:50,838 basehttp 18503 6194622464 "GET /en/emr/ HTTP/1.1" 200 71709 +INFO 2025-09-03 15:52:50,889 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:52:50,894 basehttp 18503 6245101568 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 15:52:53,686 basehttp 18503 6245101568 "GET /en/radiology HTTP/1.1" 301 0 +INFO 2025-09-03 15:52:53,767 basehttp 18503 6194622464 "GET /en/radiology/ HTTP/1.1" 200 29206 +INFO 2025-09-03 15:52:53,799 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:52:53,828 log 18503 6211448832 Internal Server Error: /en/radiology/htmx/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/radiology/views.py", line 861, in radiology_stats + 'critical_findings': RadiologyReport.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'has_critical_findings' into field. Choices are: addendum, addendum_datetime, clinical_history, created_at, critical_communicated, critical_communicated_datetime, critical_communicated_to, critical_finding, dictated_by, dictated_by_id, dictated_datetime, finalized_datetime, findings, id, impression, radiologist, radiologist_id, recommendations, report_id, report_length, status, structured_data, study, study_id, technique, template_used, template_used_id, transcribed_by, transcribed_by_id, transcribed_datetime, turnaround_time, updated_at, verified_datetime +ERROR 2025-09-03 15:52:53,830 basehttp 18503 6211448832 "GET /en/radiology/htmx/stats/ HTTP/1.1" 500 124367 +INFO 2025-09-03 15:52:55,899 basehttp 18503 6211448832 "GET /en/radiology/orders/ HTTP/1.1" 200 88633 +INFO 2025-09-03 15:52:55,932 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 15:52:59,433 log 18503 6211448832 Internal Server Error: /en/radiology/orders/403/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/fields/__init__.py", line 2128, in get_prep_value + return int(value) + ^^^^^^^^^^ +TypeError: int() argument must be a string, a bytes-like object or a real number, not 'method' + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/radiology/views.py", line 359, in get_context_data + study_reports = RadiologyReport.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1588, in build_filter + condition = self.build_lookup(lookups, col, value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1415, in build_lookup + lookup = lookup_class(lhs, rhs) + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/lookups.py", line 38, in __init__ + self.rhs = self.get_prep_lookup() + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/fields/related_lookups.py", line 112, in get_prep_lookup + self.rhs = target_field.get_prep_value(self.rhs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/fields/__init__.py", line 2130, in get_prep_value + raise e.__class__( +TypeError: Field 'id' expected a number but got ]>>. +ERROR 2025-09-03 15:52:59,434 basehttp 18503 6211448832 "GET /en/radiology/orders/403/ HTTP/1.1" 500 151378 +INFO 2025-09-03 15:53:05,498 basehttp 18503 6211448832 "GET /en/emr/ HTTP/1.1" 200 71709 +INFO 2025-09-03 15:53:05,549 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:53:05,555 basehttp 18503 6194622464 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 15:53:07,760 basehttp 18503 6194622464 "GET /en/inpatients/ HTTP/1.1" 200 41779 +INFO 2025-09-03 15:53:07,806 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:53:07,808 basehttp 18503 6211448832 "GET /en/inpatients/stats/ HTTP/1.1" 200 3000 +INFO 2025-09-03 15:53:07,832 basehttp 18503 6228275200 "GET /en/inpatients/bed-grid/ HTTP/1.1" 200 611361 +INFO 2025-09-03 15:53:10,466 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:53:10,547 basehttp 18503 6228275200 "GET /static/plugins/dropzone/dist/min/dropzone.min.js HTTP/1.1" 200 114702 +INFO 2025-09-03 15:53:10,583 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:53:10,697 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:53:40,707 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:54:10,596 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:54:10,699 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:54:40,719 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:55:10,599 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:55:10,696 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:55:40,720 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:56:10,603 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:56:10,692 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:56:40,719 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:57:10,606 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:57:10,696 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:57:40,720 basehttp 18503 6228275200 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:58:10,602 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:58:10,690 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:58:40,722 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:59:10,609 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 15:59:10,702 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 15:59:40,721 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:00:10,613 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:00:10,706 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:00:40,721 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:01:10,620 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:01:10,710 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:01:40,721 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:02:10,623 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:02:10,700 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:02:40,696 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:03:10,635 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:03:10,716 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:03:40,728 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:04:10,632 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:04:10,716 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:04:40,712 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:05:10,631 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:05:10,706 basehttp 18503 6194622464 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 16:05:19,228 basehttp 18503 6194622464 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +INFO 2025-09-03 16:05:19,259 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:05:55,027 basehttp 18503 6194622464 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +INFO 2025-09-03 16:05:55,077 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:05:57,467 basehttp 18503 6194622464 "GET /en/patients/insurance-info/ HTTP/1.1" 200 138485 +INFO 2025-09-03 16:05:57,510 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:05:59,351 basehttp 18503 6194622464 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +INFO 2025-09-03 16:05:59,383 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:06:08,880 basehttp 18503 6194622464 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14969 +INFO 2025-09-03 16:06:29,412 basehttp 18503 6194622464 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 53709 +INFO 2025-09-03 16:06:59,398 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:06:59,408 basehttp 18503 6211448832 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 80703 +INFO 2025-09-03 16:07:29,402 basehttp 18503 6211448832 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 77457 +INFO 2025-09-03 16:07:59,392 basehttp 18503 6211448832 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:07:59,401 basehttp 18503 6194622464 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 75736 +INFO 2025-09-03 16:08:01,231 basehttp 18503 6194622464 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +INFO 2025-09-03 16:08:01,274 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:08:09,008 log 18503 6194622464 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:08:09,008 basehttp 18503 6194622464 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:08:16,956 basehttp 18503 6194622464 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 13231 +INFO 2025-09-03 16:08:30,438 basehttp 18503 6194622464 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 37289 +WARNING 2025-09-03 16:08:30,453 log 18503 6194622464 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:08:30,453 basehttp 18503 6194622464 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:08:30,571 basehttp 18503 6211448832 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +INFO 2025-09-03 16:08:30,572 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:08:30,577 log 18503 6245101568 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +ERROR 2025-09-03 16:08:30,579 basehttp 18503 6245101568 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63351 +INFO 2025-09-03 16:08:30,579 basehttp 18503 6228275200 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +INFO 2025-09-03 16:08:30,641 basehttp 18503 6228275200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:08:36,166 basehttp 18503 6228275200 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 37289 +INFO 2025-09-03 16:08:36,178 basehttp 18503 6194622464 "GET /static/css/custom.css HTTP/1.1" 200 2063 +WARNING 2025-09-03 16:08:36,184 log 18503 6211448832 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-03 16:08:36,184 basehttp 18503 6228275200 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +WARNING 2025-09-03 16:08:36,185 basehttp 18503 6211448832 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:08:36,189 basehttp 18503 6194622464 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 16:08:36,193 basehttp 18503 6228275200 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-03 16:08:36,194 basehttp 18503 6278754304 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 16:08:36,195 basehttp 18503 6261927936 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 16:08:36,195 basehttp 18503 6245101568 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 16:08:36,197 basehttp 18503 6194622464 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-03 16:08:36,202 basehttp 18503 6211448832 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 16:08:36,500 basehttp 18503 6211448832 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 16:08:36,524 basehttp 18503 6211448832 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 16:08:36,525 basehttp 18503 6194622464 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 16:08:36,525 basehttp 18503 6278754304 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 16:08:36,525 basehttp 18503 6261927936 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 16:08:36,525 basehttp 18503 6245101568 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 16:08:36,528 basehttp 18503 6228275200 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 16:08:36,528 basehttp 18503 6278754304 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 16:08:36,528 basehttp 18503 6261927936 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 16:08:36,529 basehttp 18503 6194622464 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 16:08:36,530 basehttp 18503 6245101568 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 16:08:36,532 basehttp 18503 6228275200 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 16:08:36,533 basehttp 18503 6228275200 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 16:08:36,536 basehttp 18503 6211448832 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 16:08:36,536 basehttp 18503 6228275200 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 16:08:36,537 basehttp 18503 6211448832 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 16:08:36,538 basehttp 18503 6211448832 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 16:08:36,538 basehttp 18503 6228275200 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 16:08:36,543 basehttp 18503 6228275200 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 16:08:36,543 basehttp 18503 6211448832 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 16:08:36,544 basehttp 18503 6228275200 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 16:08:36,545 basehttp 18503 6211448832 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 16:08:36,546 basehttp 18503 6211448832 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 16:08:36,546 basehttp 18503 6228275200 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-03 16:08:36,560 basehttp 18503 6278754304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:08:36,564 log 18503 6245101568 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 16:08:36,565 basehttp 18503 6261927936 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +ERROR 2025-09-03 16:08:36,566 basehttp 18503 6245101568 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63616 +INFO 2025-09-03 16:08:36,566 basehttp 18503 6194622464 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +INFO 2025-09-03 16:08:36,660 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:08:36,665 log 18503 6194622464 Not Found: /favicon.ico +WARNING 2025-09-03 16:08:36,665 basehttp 18503 6194622464 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-03 16:08:41,490 basehttp 18503 6194622464 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 37289 +WARNING 2025-09-03 16:08:41,529 log 18503 6194622464 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:08:41,529 basehttp 18503 6194622464 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:08:41,610 basehttp 18503 6194622464 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:08:41,619 log 18503 6278754304 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 16:08:41,619 basehttp 18503 6245101568 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +ERROR 2025-09-03 16:08:41,619 basehttp 18503 6278754304 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63351 +INFO 2025-09-03 16:08:41,619 basehttp 18503 6261927936 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +INFO 2025-09-03 16:08:41,670 basehttp 18503 6278754304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:09:11,398 log 18503 6278754304 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_primary_insurance' not found. 'check_primary_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 16:09:11,399 basehttp 18503 6278754304 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 184443 +WARNING 2025-09-03 16:09:11,418 log 18503 6278754304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:09:11,418 basehttp 18503 6278754304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:09:14,207 log 18503 6261927936 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-03 16:09:14,208 basehttp 18503 6278754304 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 76823 +WARNING 2025-09-03 16:09:14,208 basehttp 18503 6261927936 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:09:14,222 log 18503 6278754304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:09:14,222 basehttp 18503 6278754304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:09:41,603 basehttp 18503 6278754304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:09:41,708 basehttp 18503 6261927936 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:09:41,710 basehttp 18503 6278754304 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 56822 +INFO 2025-09-03 16:10:11,709 basehttp 18503 6278754304 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 67960 +INFO 2025-09-03 16:10:15,315 basehttp 18503 6278754304 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 36837 +WARNING 2025-09-03 16:10:15,337 log 18503 6278754304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:10:15,338 basehttp 18503 6278754304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:10:15,406 basehttp 18503 6278754304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:10:15,412 log 18503 6245101568 Internal Server Error: /en/patients/appointments/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: patient_appointment_list() got an unexpected keyword argument 'patient_id' +INFO 2025-09-03 16:10:15,412 basehttp 18503 6261927936 "GET /en/patients/emergency-contacts/6/ HTTP/1.1" 200 145 +ERROR 2025-09-03 16:10:15,412 basehttp 18503 6245101568 "GET /en/patients/appointments/6/ HTTP/1.1" 500 63351 +INFO 2025-09-03 16:11:15,392 basehttp 18503 6245101568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:11:22,561 autoreload 18503 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 16:11:23,045 autoreload 32187 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-03 16:11:23,942 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:11:23,942 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:11:23,950 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:11:23,950 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:11:28,119 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'patient_form' not found. 'patient_form' is not a valid view function or pattern name. +ERROR 2025-09-03 16:11:28,120 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 186338 +WARNING 2025-09-03 16:11:28,136 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:11:28,136 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:11:28,160 log 32187 6156185600 Not Found: /favicon.ico +WARNING 2025-09-03 16:11:28,161 basehttp 32187 6156185600 "GET /favicon.ico HTTP/1.1" 404 2557 +ERROR 2025-09-03 16:12:20,760 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'patient_confirm_delete' not found. 'patient_confirm_delete' is not a valid view function or pattern name. +ERROR 2025-09-03 16:12:20,761 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 185824 +WARNING 2025-09-03 16:12:20,778 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:12:20,778 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:12:39,356 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'appointment_form' not found. 'appointment_form' is not a valid view function or pattern name. +ERROR 2025-09-03 16:12:39,357 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 186030 +WARNING 2025-09-03 16:12:39,374 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:12:39,375 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:13:32,585 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'emergency_contact_form' not found. 'emergency_contact_form' is not a valid view function or pattern name. +ERROR 2025-09-03 16:13:32,586 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 185456 +WARNING 2025-09-03 16:13:32,599 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:13:32,599 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:14:03,433 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'emergency_contact_list' not found. 'emergency_contact_list' is not a valid view function or pattern name. +ERROR 2025-09-03 16:14:03,434 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 202148 +WARNING 2025-09-03 16:14:03,447 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:14:03,447 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:14:49,929 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'insurance_form' not found. 'insurance_form' is not a valid view function or pattern name. +ERROR 2025-09-03 16:14:49,933 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 185231 +WARNING 2025-09-03 16:14:49,948 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:14:49,948 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:15:13,280 log 32187 6156185600 Internal Server Error: /en/patients/patientprofile/6/details/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'patient_note_form' not found. 'patient_note_form' is not a valid view function or pattern name. +ERROR 2025-09-03 16:15:13,281 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 500 184334 +WARNING 2025-09-03 16:15:13,296 log 32187 6156185600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:15:13,296 basehttp 32187 6156185600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:15:45,800 basehttp 32187 6156185600 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 32405 +INFO 2025-09-03 16:15:45,812 basehttp 32187 13170143232 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-03 16:15:45,814 basehttp 32187 6156185600 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-03 16:15:45,815 basehttp 32187 13220622336 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 16:15:45,817 basehttp 32187 6156185600 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +WARNING 2025-09-03 16:15:45,823 log 32187 13170143232 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:15:45,824 basehttp 32187 13170143232 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:15:45,825 basehttp 32187 6156185600 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-03 16:15:45,828 basehttp 32187 13203795968 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 16:15:45,830 basehttp 32187 13186969600 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 16:15:45,832 basehttp 32187 6173011968 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 16:15:45,832 basehttp 32187 13220622336 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 16:15:46,240 basehttp 32187 13220622336 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 16:15:46,272 basehttp 32187 13220622336 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 16:15:46,273 basehttp 32187 13186969600 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 16:15:46,273 basehttp 32187 13203795968 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 16:15:46,273 basehttp 32187 6156185600 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 16:15:46,274 basehttp 32187 6173011968 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 16:15:46,276 basehttp 32187 13170143232 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 16:15:46,276 basehttp 32187 6156185600 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 16:15:46,277 basehttp 32187 13203795968 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 16:15:46,277 basehttp 32187 13186969600 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 16:15:46,279 basehttp 32187 13170143232 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 16:15:46,281 basehttp 32187 13220622336 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 16:15:46,281 basehttp 32187 6156185600 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 16:15:46,281 basehttp 32187 13203795968 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 16:15:46,281 basehttp 32187 13186969600 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 16:15:46,281 basehttp 32187 13170143232 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 16:15:46,286 basehttp 32187 13203795968 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 16:15:46,286 basehttp 32187 6156185600 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 16:15:46,288 basehttp 32187 13220622336 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 16:15:46,288 basehttp 32187 13186969600 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 16:15:46,289 basehttp 32187 13170143232 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 16:15:46,290 basehttp 32187 6173011968 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:15:46,291 basehttp 32187 13203795968 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 16:15:46,291 basehttp 32187 6156185600 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-03 16:15:46,291 basehttp 32187 13220622336 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 16:15:54,969 basehttp 32187 13220622336 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36164 +WARNING 2025-09-03 16:15:54,985 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:15:54,985 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:15:55,068 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:16:03,997 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:04,001 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:16:04,009 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:04,009 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:16:33,533 basehttp 32187 13220622336 "GET /en/patients/patientprofile/6/details/ HTTP/1.1" 200 32411 +WARNING 2025-09-03 16:16:33,548 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:33,548 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:16:33,601 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:16:46,578 basehttp 32187 13220622336 "GET /en/appointments/create/?patient=6 HTTP/1.1" 200 36516 +WARNING 2025-09-03 16:16:46,597 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:46,597 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:16:46,648 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:16:54,094 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:54,094 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:16:54,105 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:54,105 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:16:56,001 basehttp 32187 13220622336 "GET /en/emr/encounters/create/?patient=6 HTTP/1.1" 200 56248 +WARNING 2025-09-03 16:16:56,020 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:16:56,020 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:16:56,076 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:17:01,130 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:01,130 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:17:01,140 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:01,140 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:17:02,281 basehttp 32187 13220622336 "GET /en/laboratory/orders/create/?patient=6 HTTP/1.1" 200 36955 +WARNING 2025-09-03 16:17:02,300 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:02,300 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:17:02,349 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:17:05,833 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:05,833 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:17:05,846 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:05,846 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:17:15,810 basehttp 32187 13220622336 "GET /en/pharmacy/prescriptions/create/?patient=6 HTTP/1.1" 200 71387 +WARNING 2025-09-03 16:17:15,828 log 32187 13220622336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:15,828 basehttp 32187 13220622336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:17:15,887 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:17:40,575 basehttp 32187 13220622336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:17:40,576 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:40,577 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:17:40,585 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:40,585 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:17:41,306 basehttp 32187 13203795968 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36140 +WARNING 2025-09-03 16:17:41,325 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:41,325 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:17:42,785 log 32187 13203795968 Internal Server Error: /en/patients/insurance-info/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'bulk_verify_insurance' not found. 'bulk_verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 16:17:42,786 basehttp 32187 13203795968 "GET /en/patients/insurance-info/ HTTP/1.1" 500 232307 +WARNING 2025-09-03 16:17:42,801 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:42,802 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:17:45,963 log 32187 13203795968 Internal Server Error: /en/patients/insurance-info/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'bulk_verify_insurance' not found. 'bulk_verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 16:17:45,964 basehttp 32187 13203795968 "GET /en/patients/insurance-info/ HTTP/1.1" 500 232575 +WARNING 2025-09-03 16:17:45,979 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:45,979 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:17:47,344 log 32187 13203795968 Internal Server Error: /en/patients/insurance-info/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'bulk_verify_insurance' not found. 'bulk_verify_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 16:17:47,345 basehttp 32187 13203795968 "GET /en/patients/insurance-info/ HTTP/1.1" 500 232575 +WARNING 2025-09-03 16:17:47,359 log 32187 13203795968 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:17:47,360 basehttp 32187 13203795968 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:18:24,507 basehttp 32187 13203795968 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140257 +INFO 2025-09-03 16:18:24,517 basehttp 32187 6173011968 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 16:18:24,517 basehttp 32187 13220622336 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 16:18:24,518 basehttp 32187 13203795968 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 16:18:24,518 basehttp 32187 6156185600 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +WARNING 2025-09-03 16:18:24,521 log 32187 13170143232 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:18:24,521 basehttp 32187 13170143232 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:18:24,522 basehttp 32187 13203795968 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 16:18:24,523 basehttp 32187 6156185600 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 16:18:24,589 basehttp 32187 6156185600 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:19:24,598 basehttp 32187 6156185600 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:20:24,610 basehttp 32187 6156185600 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:20:34,189 autoreload 32187 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:20:34,626 autoreload 36329 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:21:00,691 autoreload 36329 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:21:01,020 autoreload 36566 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:21:24,682 basehttp 36566 6162264064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:21:38,632 autoreload 36566 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:21:38,968 autoreload 36879 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:22:24,642 basehttp 36879 6168653824 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:22:53,857 autoreload 36879 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:22:54,180 autoreload 37429 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:23:20,287 autoreload 37429 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:23:20,625 autoreload 37587 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:23:24,649 basehttp 37587 6124466176 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:23:24,679 basehttp 37587 6141292544 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140257 +WARNING 2025-09-03 16:23:24,697 log 37587 6141292544 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:23:24,698 basehttp 37587 6141292544 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:23:24,765 basehttp 37587 6141292544 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:24:24,764 basehttp 37587 6141292544 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:25:03,528 autoreload 37587 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:25:03,868 autoreload 38363 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:25:13,997 autoreload 38498 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:25:16,694 basehttp 38498 6129905664 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140382 +WARNING 2025-09-03 16:25:16,705 log 38498 6129905664 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:25:16,705 basehttp 38498 6129905664 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:25:16,763 basehttp 38498 6129905664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:25:50,626 autoreload 38498 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 16:25:50,959 autoreload 38804 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:25:59,047 autoreload 38860 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:26:01,318 basehttp 38860 6133968896 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140382 +WARNING 2025-09-03 16:26:01,336 log 38860 6133968896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:26:01,336 basehttp 38860 6133968896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:26:01,398 basehttp 38860 6133968896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 16:26:36,376 log 38860 6133968896 Internal Server Error: /en/patients/insurance-info/update/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_primary_insurance' not found. 'check_primary_insurance' is not a valid view function or pattern name. +ERROR 2025-09-03 16:26:36,378 basehttp 38860 6133968896 "GET /en/patients/insurance-info/update/5/ HTTP/1.1" 500 186941 +WARNING 2025-09-03 16:26:36,396 log 38860 6133968896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:26:36,396 basehttp 38860 6133968896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:31:19,383 autoreload 38860 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 16:31:19,832 autoreload 41272 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:31:39,778 autoreload 41272 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 16:31:40,203 autoreload 41441 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 16:31:44,101 log 41441 6125826048 Internal Server Error: /en/patients/insurance-info/update/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'validate_policy_number' not found. 'validate_policy_number' is not a valid view function or pattern name. +ERROR 2025-09-03 16:31:44,103 basehttp 41441 6125826048 "GET /en/patients/insurance-info/update/5/ HTTP/1.1" 500 187353 +WARNING 2025-09-03 16:31:44,129 log 41441 6125826048 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:31:44,129 basehttp 41441 6125826048 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:37:35,837 autoreload 41441 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 16:37:36,280 autoreload 44059 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:37:53,160 autoreload 44059 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 16:37:53,557 autoreload 44228 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 16:37:55,892 log 44228 6170112000 Internal Server Error: /en/patients/insurance-info/update/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'save_insurance_draft' not found. 'save_insurance_draft' is not a valid view function or pattern name. +ERROR 2025-09-03 16:37:55,894 basehttp 44228 6170112000 "GET /en/patients/insurance-info/update/5/ HTTP/1.1" 500 186681 +WARNING 2025-09-03 16:37:55,909 log 44228 6170112000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:37:55,909 basehttp 44228 6170112000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:39:57,209 autoreload 44228 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 16:39:57,655 autoreload 45179 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:40:50,907 autoreload 45179 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 16:40:51,217 autoreload 45579 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 16:40:54,116 log 45579 6170324992 Internal Server Error: /en/patients/insurance-info/update/5/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'verify_with_provider' not found. 'verify_with_provider' is not a valid view function or pattern name. +ERROR 2025-09-03 16:40:54,118 basehttp 45579 6170324992 "GET /en/patients/insurance-info/update/5/ HTTP/1.1" 500 187475 +WARNING 2025-09-03 16:40:54,133 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:40:54,133 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:41:40,831 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:41:40,831 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:41:41,803 basehttp 45579 6170324992 "GET /en/ HTTP/1.1" 200 49744 +WARNING 2025-09-03 16:41:41,816 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:41:41,816 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:41:41,851 basehttp 45579 12918534144 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-03 16:41:41,852 basehttp 45579 12901707776 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 16:41:41,852 basehttp 45579 6170324992 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2095 +WARNING 2025-09-03 16:41:44,203 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:41:44,204 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:41:44,214 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:41:44,214 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:41:47,781 basehttp 45579 6170324992 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36145 +WARNING 2025-09-03 16:41:47,796 log 45579 6170324992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:41:47,796 basehttp 45579 6170324992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:41:47,846 basehttp 45579 6170324992 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:41:57,002 basehttp 45579 6170324992 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 14940 +INFO 2025-09-03 16:42:01,973 basehttp 45579 6170324992 "POST /en/patients/check-eligibility/5/ HTTP/1.1" 200 13229 +INFO 2025-09-03 16:42:17,873 basehttp 45579 6170324992 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 59419 +INFO 2025-09-03 16:42:47,876 basehttp 45579 6170324992 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:42:47,879 basehttp 45579 12901707776 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 54197 +INFO 2025-09-03 16:43:17,872 basehttp 45579 12901707776 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 80252 +INFO 2025-09-03 16:43:47,875 basehttp 45579 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:43:47,879 basehttp 45579 6170324992 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 68006 +INFO 2025-09-03 16:44:17,869 basehttp 45579 6170324992 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 76773 +INFO 2025-09-03 16:44:48,720 basehttp 45579 6170324992 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:44:48,724 basehttp 45579 12901707776 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 48154 +ERROR 2025-09-03 16:45:00,443 log 45579 12901707776 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'verify_with_provider' not found. 'verify_with_provider' is not a valid view function or pattern name. +ERROR 2025-09-03 16:45:00,445 basehttp 45579 12901707776 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 184832 +WARNING 2025-09-03 16:45:00,462 log 45579 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:45:00,462 basehttp 45579 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:48:18,872 autoreload 45579 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 16:48:19,254 autoreload 48837 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 16:48:54,720 autoreload 48837 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 16:48:55,075 autoreload 49152 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 16:49:14,429 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:49:14,432 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188253 +WARNING 2025-09-03 16:49:14,446 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:49:14,447 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:49:17,242 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:49:17,243 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188253 +WARNING 2025-09-03 16:49:17,254 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:49:17,254 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:49:52,486 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:49:52,487 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188316 +WARNING 2025-09-03 16:49:52,501 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:49:52,501 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:49:53,861 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:49:53,862 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188316 +WARNING 2025-09-03 16:49:53,874 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:49:53,874 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:50:01,019 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:50:01,021 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188309 +WARNING 2025-09-03 16:50:01,033 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:50:01,033 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-03 16:50:26,006 log 49152 6134444032 Internal Server Error: /en/patients/insurance-info/create/6/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_eligibility' with arguments '('',)' not found. 1 pattern(s) tried: ['en/patients/check\\-eligibility/(?P[0-9]+)/\\Z'] +ERROR 2025-09-03 16:50:26,007 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 500 188204 +WARNING 2025-09-03 16:50:26,020 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:50:26,020 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:50:40,293 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/6/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 16:50:40,306 basehttp 49152 6134444032 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 16:50:40,306 basehttp 49152 6168096768 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +WARNING 2025-09-03 16:50:40,309 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:50:40,309 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:50:40,397 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:51:07,727 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:51:07,728 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:51:07,729 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:51:07,729 basehttp 49152 6168096768 - Broken pipe from ('127.0.0.1', 55010) +INFO 2025-09-03 16:51:07,731 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 55815 +WARNING 2025-09-03 16:51:07,739 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:51:07,739 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:51:17,835 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 47772 +INFO 2025-09-03 16:51:47,829 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 66565 +INFO 2025-09-03 16:52:07,700 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:52:17,816 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 72881 +INFO 2025-09-03 16:52:24,683 basehttp 49152 6151270400 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36145 +WARNING 2025-09-03 16:52:24,700 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:52:24,700 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:52:24,805 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:52:54,829 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 59504 +INFO 2025-09-03 16:53:24,813 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:53:24,816 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 78147 +INFO 2025-09-03 16:53:54,809 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 52726 +INFO 2025-09-03 16:54:24,790 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:54:24,796 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 53055 +INFO 2025-09-03 16:54:36,983 basehttp 49152 6151270400 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36147 +WARNING 2025-09-03 16:54:37,001 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:54:37,001 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:54:37,057 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:55:04,254 basehttp 49152 6151270400 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36147 +INFO 2025-09-03 16:55:04,269 basehttp 49152 13304360960 "GET /static/css/custom.css HTTP/1.1" 200 2063 +WARNING 2025-09-03 16:55:04,272 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:55:04,273 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:55:04,277 basehttp 49152 6134444032 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-03 16:55:04,278 basehttp 49152 13304360960 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 16:55:04,281 basehttp 49152 6151270400 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-03 16:55:04,282 basehttp 49152 13338013696 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 16:55:04,284 basehttp 49152 13321187328 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 16:55:04,284 basehttp 49152 6134444032 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-03 16:55:04,286 basehttp 49152 6168096768 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 16:55:04,293 basehttp 49152 13304360960 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 16:55:04,580 basehttp 49152 13304360960 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 16:55:04,609 basehttp 49152 13338013696 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 16:55:04,609 basehttp 49152 13304360960 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 16:55:04,609 basehttp 49152 13321187328 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 16:55:04,611 basehttp 49152 6168096768 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 16:55:04,612 basehttp 49152 6134444032 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 16:55:04,613 basehttp 49152 6151270400 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 16:55:04,615 basehttp 49152 13321187328 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 16:55:04,615 basehttp 49152 13304360960 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 16:55:04,616 basehttp 49152 6168096768 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 16:55:04,618 basehttp 49152 13321187328 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 16:55:04,623 basehttp 49152 6134444032 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 16:55:04,632 basehttp 49152 6168096768 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 16:55:04,633 basehttp 49152 13304360960 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 16:55:04,634 basehttp 49152 13321187328 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 16:55:04,635 basehttp 49152 6134444032 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 16:55:04,636 basehttp 49152 13338013696 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 16:55:04,637 basehttp 49152 6168096768 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 16:55:04,639 basehttp 49152 13338013696 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 16:55:04,639 basehttp 49152 13321187328 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 16:55:04,640 basehttp 49152 6134444032 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 16:55:04,640 basehttp 49152 6168096768 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 16:55:04,641 basehttp 49152 13304360960 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 16:55:04,641 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:55:04,642 basehttp 49152 13321187328 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +WARNING 2025-09-03 16:55:04,754 log 49152 13321187328 Not Found: /favicon.ico +WARNING 2025-09-03 16:55:04,755 basehttp 49152 13321187328 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-03 16:55:34,655 basehttp 49152 13321187328 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 67000 +INFO 2025-09-03 16:56:04,093 basehttp 49152 13321187328 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36171 +WARNING 2025-09-03 16:56:04,108 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:56:04,108 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:56:04,193 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:56:06,146 basehttp 49152 13321187328 "GET /en/patients/patientprofile/7/details/ HTTP/1.1" 200 32118 +WARNING 2025-09-03 16:56:06,163 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:56:06,163 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:56:06,212 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:56:09,434 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:56:09,434 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:56:09,444 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:56:09,445 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:56:34,209 basehttp 49152 13321187328 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 74922 +INFO 2025-09-03 16:56:54,553 basehttp 49152 13321187328 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36177 +WARNING 2025-09-03 16:56:54,569 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:56:54,569 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:56:54,619 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:57:01,942 basehttp 49152 13321187328 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140382 +INFO 2025-09-03 16:57:01,957 basehttp 49152 13304360960 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 16:57:01,957 basehttp 49152 6134444032 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 16:57:01,958 basehttp 49152 6151270400 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 16:57:01,959 basehttp 49152 6168096768 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +WARNING 2025-09-03 16:57:01,962 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:57:01,962 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:57:01,964 basehttp 49152 6168096768 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 16:57:01,964 basehttp 49152 13321187328 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 16:57:02,028 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 16:57:06,244 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:57:06,244 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 16:57:06,254 log 49152 13321187328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:57:06,254 basehttp 49152 13321187328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:57:24,637 basehttp 49152 13321187328 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 70641 +INFO 2025-09-03 16:57:54,637 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:57:54,644 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 79948 +INFO 2025-09-03 16:58:24,636 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 75853 +INFO 2025-09-03 16:58:54,637 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:58:54,642 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 66186 +INFO 2025-09-03 16:59:15,464 basehttp 49152 6151270400 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36096 +WARNING 2025-09-03 16:59:15,478 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 16:59:15,479 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 16:59:15,529 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 16:59:45,556 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 76535 +INFO 2025-09-03 17:00:15,536 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:00:15,543 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 65714 +INFO 2025-09-03 17:00:45,547 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/6/ HTTP/1.1" 200 69964 +INFO 2025-09-03 17:00:55,925 basehttp 49152 6134444032 "GET /en/patients/insurance-info/6/ HTTP/1.1" 200 36096 +WARNING 2025-09-03 17:00:55,942 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:00:55,942 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:00:55,996 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:00:58,630 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/7/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 17:00:58,645 basehttp 49152 6151270400 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 17:00:58,649 basehttp 49152 6151270400 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +WARNING 2025-09-03 17:00:58,650 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:00:58,651 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:00:58,702 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 17:01:05,029 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:05,030 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:01:05,040 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:05,040 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:01:09,456 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:09,456 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:01:09,457 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:01:09,462 basehttp 49152 6151270400 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 56817 +WARNING 2025-09-03 17:01:09,482 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:09,482 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:01:13,278 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:13,278 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:01:16,730 basehttp 49152 6134444032 "GET /en/patients/insurance-info/16/ HTTP/1.1" 200 36125 +WARNING 2025-09-03 17:01:16,747 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:01:16,747 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:01:16,793 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:01:46,831 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/16/ HTTP/1.1" 200 73282 +INFO 2025-09-03 17:02:13,096 basehttp 49152 6134444032 "GET /en/patients/insurance-info/16/ HTTP/1.1" 200 36125 +WARNING 2025-09-03 17:02:13,112 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:02:13,112 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:02:13,165 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:02:15,207 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 17:02:15,212 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:02:15,212 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:02:15,225 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:02:15,225 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:02:15,910 basehttp 49152 6151270400 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140798 +WARNING 2025-09-03 17:02:15,922 log 49152 6151270400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:02:15,923 basehttp 49152 6151270400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:02:15,991 basehttp 49152 6151270400 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:02:47,046 basehttp 49152 6151270400 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140812 +INFO 2025-09-03 17:02:47,055 basehttp 49152 6168096768 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-03 17:02:47,058 basehttp 49152 13321187328 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-03 17:02:47,060 basehttp 49152 13304360960 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-03 17:02:47,064 basehttp 49152 6151270400 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +WARNING 2025-09-03 17:02:47,069 log 49152 13304360960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-03 17:02:47,070 basehttp 49152 13321187328 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-03 17:02:47,070 basehttp 49152 6151270400 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +WARNING 2025-09-03 17:02:47,071 basehttp 49152 13304360960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:02:47,077 basehttp 49152 6168096768 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-03 17:02:47,078 basehttp 49152 13338013696 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-03 17:02:47,081 basehttp 49152 6134444032 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-03 17:02:47,081 basehttp 49152 6168096768 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-03 17:02:47,082 basehttp 49152 13338013696 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-03 17:02:47,084 basehttp 49152 6151270400 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-03 17:02:47,084 basehttp 49152 6168096768 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-03 17:02:47,086 basehttp 49152 13304360960 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-03 17:02:47,086 basehttp 49152 13321187328 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-03 17:02:47,392 basehttp 49152 13321187328 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-03 17:02:47,430 basehttp 49152 13304360960 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-03 17:02:47,431 basehttp 49152 13321187328 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-03 17:02:47,432 basehttp 49152 13338013696 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-03 17:02:47,433 basehttp 49152 6151270400 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-03 17:02:47,433 basehttp 49152 6168096768 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-03 17:02:47,436 basehttp 49152 13338013696 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-03 17:02:47,436 basehttp 49152 6151270400 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-03 17:02:47,437 basehttp 49152 6168096768 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-03 17:02:47,438 basehttp 49152 6134444032 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-03 17:02:47,441 basehttp 49152 6151270400 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-03 17:02:47,442 basehttp 49152 13304360960 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-03 17:02:47,444 basehttp 49152 13338013696 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-03 17:02:47,444 basehttp 49152 6134444032 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-03 17:02:47,444 basehttp 49152 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:02:47,445 basehttp 49152 6168096768 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-03 17:02:47,447 basehttp 49152 6151270400 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-03 17:02:47,449 basehttp 49152 6168096768 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-03 17:02:47,449 basehttp 49152 13304360960 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-03 17:02:47,449 basehttp 49152 6134444032 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-03 17:02:47,451 basehttp 49152 13338013696 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-03 17:02:47,451 basehttp 49152 13321187328 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-03 17:02:47,451 basehttp 49152 6151270400 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-03 17:02:47,452 basehttp 49152 6134444032 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-03 17:02:47,452 basehttp 49152 6168096768 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +WARNING 2025-09-03 17:02:47,628 log 49152 6168096768 Not Found: /favicon.ico +WARNING 2025-09-03 17:02:47,628 basehttp 49152 6168096768 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-03 17:03:47,447 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:04:17,897 basehttp 49152 6168096768 "GET /en/patients/insurance-info/ HTTP/1.1" 200 140797 +WARNING 2025-09-03 17:04:17,911 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:04:17,911 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:04:18,008 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:04:55,377 basehttp 49152 6168096768 "GET /en/patients/insurance-info/ HTTP/1.1" 200 139304 +WARNING 2025-09-03 17:04:55,388 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:04:55,388 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:04:55,460 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:05:14,041 basehttp 49152 6168096768 "GET /en/patients/insurance-info/7/ HTTP/1.1" 200 36205 +WARNING 2025-09-03 17:05:14,059 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:05:14,060 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:05:14,109 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:05:26,798 basehttp 49152 6168096768 "GET /en/patients/patientprofile/8/details/ HTTP/1.1" 200 32128 +WARNING 2025-09-03 17:05:26,813 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:05:26,813 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:05:26,881 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 17:05:30,014 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:05:30,014 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:05:30,027 log 49152 6168096768 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:05:30,027 basehttp 49152 6168096768 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:05:44,142 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 64179 +INFO 2025-09-03 17:06:14,133 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:06:14,136 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 53775 +INFO 2025-09-03 17:06:44,132 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 48203 +INFO 2025-09-03 17:07:14,133 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:07:14,137 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 47322 +INFO 2025-09-03 17:07:44,131 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 69502 +INFO 2025-09-03 17:08:14,122 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:08:14,124 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 47890 +INFO 2025-09-03 17:08:44,128 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 53756 +INFO 2025-09-03 17:09:14,125 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 63952 +INFO 2025-09-03 17:09:14,126 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:09:44,129 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 53497 +INFO 2025-09-03 17:10:14,136 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 67836 +INFO 2025-09-03 17:10:14,136 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:10:14,149 basehttp 49152 6168096768 "GET /static/css/saudiriyalsymbol.woff2 HTTP/1.1" 200 720 +INFO 2025-09-03 17:10:44,127 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 67747 +INFO 2025-09-03 17:11:14,130 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 57845 +INFO 2025-09-03 17:11:14,132 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:11:44,125 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 71568 +INFO 2025-09-03 17:12:14,127 basehttp 49152 6134444032 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 60615 +INFO 2025-09-03 17:12:14,128 basehttp 49152 6168096768 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:12:44,123 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 55851 +INFO 2025-09-03 17:13:14,125 basehttp 49152 6168096768 "GET /en/patients/insurance-claims-history/7/ HTTP/1.1" 200 80533 +INFO 2025-09-03 17:13:14,132 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:13:34,753 basehttp 49152 6134444032 "GET /en/patients/insurance-info/create/8/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 17:13:34,772 basehttp 49152 6168096768 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 17:13:34,772 basehttp 49152 6151270400 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +WARNING 2025-09-03 17:13:34,775 log 49152 6134444032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:13:34,775 basehttp 49152 6134444032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:13:34,825 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:14:35,606 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:15:36,606 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:16:37,605 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:17:38,611 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:18:39,610 basehttp 49152 6134444032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:19:28,002 autoreload 49152 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 17:19:28,467 autoreload 62657 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:19:40,731 basehttp 62657 6170357760 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:20:42,683 basehttp 62657 6170357760 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:22:40,677 basehttp 62657 6170357760 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:24:40,666 basehttp 62657 6170357760 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:25:28,605 autoreload 62657 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:25:29,020 autoreload 65265 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:42:35,024 autoreload 73355 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:42:38,307 basehttp 73355 6158807040 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:42:39,925 basehttp 73355 6158807040 "GET /en/patients/insurance-info/create/8/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 17:42:39,936 basehttp 73355 6175633408 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +WARNING 2025-09-03 17:42:39,937 basehttp 73355 6158807040 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 17:42:40,017 log 73355 6158807040 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:42:40,017 basehttp 73355 6158807040 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:42:40,026 basehttp 73355 6158807040 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 17:42:40,976 log 73355 6158807040 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:42:40,976 basehttp 73355 6158807040 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-03 17:42:43,803 log 73355 6158807040 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:42:43,804 basehttp 73355 6158807040 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:42:45,630 basehttp 73355 6158807040 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36078 +WARNING 2025-09-03 17:42:45,648 log 73355 6158807040 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:42:45,648 basehttp 73355 6158807040 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:42:45,697 basehttp 73355 6158807040 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:43:15,725 basehttp 73355 6158807040 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:43:34,578 basehttp 73355 6158807040 "GET /en/admin/appointments/waitingqueue/11/change/ HTTP/1.1" 200 137846 +INFO 2025-09-03 17:43:34,598 basehttp 73355 6341865472 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2810 +INFO 2025-09-03 17:43:34,598 basehttp 73355 6325039104 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2808 +INFO 2025-09-03 17:43:34,598 basehttp 73355 6358691840 "GET /static/admin/css/forms.css HTTP/1.1" 200 8525 +INFO 2025-09-03 17:43:34,598 basehttp 73355 6375518208 "GET /static/admin/js/theme.js HTTP/1.1" 200 1653 +INFO 2025-09-03 17:43:34,599 basehttp 73355 6158807040 "GET /static/admin/css/base.css HTTP/1.1" 200 22120 +INFO 2025-09-03 17:43:34,601 basehttp 73355 6375518208 "GET /static/admin/js/jquery.init.js HTTP/1.1" 200 347 +INFO 2025-09-03 17:43:34,602 basehttp 73355 6358691840 "GET /static/admin/js/core.js HTTP/1.1" 200 6208 +INFO 2025-09-03 17:43:34,602 basehttp 73355 6341865472 "GET /static/admin/css/responsive.css HTTP/1.1" 200 16565 +INFO 2025-09-03 17:43:34,602 basehttp 73355 6158807040 "GET /static/admin/js/inlines.js HTTP/1.1" 200 15628 +INFO 2025-09-03 17:43:34,605 basehttp 73355 6158807040 "GET /static/admin/js/actions.js HTTP/1.1" 200 8076 +INFO 2025-09-03 17:43:34,605 basehttp 73355 6358691840 "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 200 9777 +INFO 2025-09-03 17:43:34,606 basehttp 73355 6341865472 "GET /static/admin/js/SelectBox.js HTTP/1.1" 200 4530 +INFO 2025-09-03 17:43:34,606 basehttp 73355 6392344576 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:43:34,606 basehttp 73355 6375518208 "GET /static/admin/css/widgets.css HTTP/1.1" 200 11991 +INFO 2025-09-03 17:43:34,607 basehttp 73355 6358691840 "GET /static/admin/js/urlify.js HTTP/1.1" 200 7887 +INFO 2025-09-03 17:43:34,608 basehttp 73355 6375518208 "GET /static/admin/js/prepopulate_init.js HTTP/1.1" 200 586 +INFO 2025-09-03 17:43:34,608 basehttp 73355 6158807040 "GET /static/admin/js/SelectFilter2.js HTTP/1.1" 200 15845 +INFO 2025-09-03 17:43:34,608 basehttp 73355 6392344576 "GET /static/admin/js/prepopulate.js HTTP/1.1" 200 1531 +INFO 2025-09-03 17:43:34,610 basehttp 73355 6325039104 "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 285314 +INFO 2025-09-03 17:43:34,611 basehttp 73355 6325039104 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063 +INFO 2025-09-03 17:43:34,611 basehttp 73355 6341865472 "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 325171 +INFO 2025-09-03 17:43:34,616 basehttp 73355 6325039104 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 +INFO 2025-09-03 17:43:34,617 basehttp 73355 6341865472 "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380 +INFO 2025-09-03 17:43:34,622 basehttp 73355 6325039104 "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392 +INFO 2025-09-03 17:43:34,622 basehttp 73355 6158807040 "GET /static/admin/js/change_form.js HTTP/1.1" 200 606 +INFO 2025-09-03 17:43:34,623 basehttp 73355 6341865472 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-09-03 17:43:34,623 basehttp 73355 6392344576 "GET /static/admin/img/icon-unknown.svg HTTP/1.1" 200 655 +INFO 2025-09-03 17:43:34,645 basehttp 73355 6392344576 "GET /static/admin/img/search.svg HTTP/1.1" 200 458 +INFO 2025-09-03 17:43:34,646 basehttp 73355 6341865472 "GET /static/admin/img/selector-icons.svg HTTP/1.1" 200 3291 +INFO 2025-09-03 17:43:43,096 basehttp 73355 6341865472 "GET /en/admin/patients/ HTTP/1.1" 200 8946 +INFO 2025-09-03 17:43:43,106 basehttp 73355 6341865472 "GET /static/admin/css/dashboard.css HTTP/1.1" 200 441 +INFO 2025-09-03 17:43:46,692 basehttp 73355 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:43:46,694 basehttp 73355 6392344576 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:44:08,575 autoreload 73355 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:44:08,961 autoreload 74058 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:44:52,470 autoreload 74058 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:44:52,770 autoreload 74382 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:44:57,973 autoreload 74382 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:44:58,251 autoreload 74393 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:45:00,591 basehttp 74393 6200373248 "GET /en/admin/appointments/waitingqueue/11/change/ HTTP/1.1" 200 137403 +INFO 2025-09-03 17:45:00,606 basehttp 74393 6200373248 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:45:16,675 basehttp 74393 6200373248 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:45:18,271 autoreload 74393 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:45:18,639 autoreload 74557 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:45:47,732 basehttp 74557 6203928576 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:46:09,294 autoreload 74557 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:46:09,623 autoreload 74955 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:46:47,384 autoreload 74955 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:46:47,690 autoreload 75294 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:48:47,599 autoreload 75294 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:48:47,884 autoreload 76148 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:49:33,106 autoreload 76148 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 17:49:33,422 autoreload 76541 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 17:49:36,642 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 17:49:39,096 basehttp 76541 6158381056 "GET /en/admin/appointments/waitingqueue/11/change/ HTTP/1.1" 200 139309 +INFO 2025-09-03 17:49:39,108 basehttp 76541 6158381056 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:49:46,776 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:49:47,501 basehttp 76541 6158381056 "GET /en/admin/patients/claimdocument/ HTTP/1.1" 200 70243 +INFO 2025-09-03 17:49:47,511 basehttp 76541 6158381056 "GET /static/admin/css/changelists.css HTTP/1.1" 200 6878 +INFO 2025-09-03 17:49:47,512 basehttp 76541 6158381056 "GET /static/admin/js/filters.js HTTP/1.1" 200 978 +INFO 2025-09-03 17:49:47,515 basehttp 76541 6175207424 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:49:47,524 basehttp 76541 6175207424 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331 +INFO 2025-09-03 17:49:51,781 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:49:53,978 basehttp 76541 6158381056 "GET /en/admin/patients/claimstatushistory/ HTTP/1.1" 200 128819 +INFO 2025-09-03 17:49:53,995 basehttp 76541 6158381056 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:49:54,004 basehttp 76541 6158381056 "GET /static/admin/img/sorting-icons.svg HTTP/1.1" 200 1097 +INFO 2025-09-03 17:49:58,461 basehttp 76541 6158381056 "GET /en/admin/patients/claimstatushistory/976/change/ HTTP/1.1" 200 92157 +INFO 2025-09-03 17:49:58,475 basehttp 76541 6158381056 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:50:02,952 basehttp 76541 6158381056 "GET /en/admin/patients/claimstatushistory/ HTTP/1.1" 200 128819 +INFO 2025-09-03 17:50:14,492 basehttp 76541 6158381056 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36078 +WARNING 2025-09-03 17:50:14,549 log 76541 6158381056 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 17:50:14,549 basehttp 76541 6158381056 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 17:50:14,589 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:50:44,613 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:51:14,612 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:51:14,617 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:51:37,031 basehttp 76541 13035925504 "GET /en/admin/patients/claimstatushistory/976/change/ HTTP/1.1" 200 92157 +INFO 2025-09-03 17:51:37,050 basehttp 76541 13035925504 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:51:44,781 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:51:47,241 basehttp 76541 13035925504 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 147251 +INFO 2025-09-03 17:51:47,254 basehttp 76541 13035925504 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +ERROR 2025-09-03 17:51:50,385 log 76541 13035925504 Internal Server Error: /en/admin/patients/insuranceclaim/200/change/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 719, in wrapper + return self.admin_site.admin_view(view)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 192, in _view_wrapper + result = _process_exception(request, e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 190, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/sites.py", line 246, in inner + return view(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1987, in change_view + return self.changeform_view(request, object_id, form_url, extra_context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 192, in _view_wrapper + result = _process_exception(request, e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 190, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1840, in changeform_view + return self._changeform_view(request, object_id, form_url, extra_context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1916, in _changeform_view + formsets, inline_instances = self._create_formsets( + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 2358, in _create_formsets + for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 938, in get_formsets_with_inlines + yield inline.get_formset(request, obj), inline + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 2535, in get_formset + return inlineformset_factory(self.parent_model, self.model, **defaults) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 1343, in inlineformset_factory + FormSet = modelformset_factory(model, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 1051, in modelformset_factory + form = modelform_factory( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 654, in modelform_factory + return type(form)(class_name, (form,), form_class_attrs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 334, in __new__ + raise FieldError(message) +django.core.exceptions.FieldError: Unknown field(s) (status) specified for ClaimStatusHistory +ERROR 2025-09-03 17:51:50,387 basehttp 76541 13035925504 "GET /en/admin/patients/insuranceclaim/200/change/ HTTP/1.1" 500 171484 +INFO 2025-09-03 17:51:55,161 basehttp 76541 13035925504 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 147251 +INFO 2025-09-03 17:52:14,793 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:52:14,796 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:52:19,252 basehttp 76541 6158381056 "GET /en/admin/patients/claimstatushistory/ HTTP/1.1" 200 128819 +INFO 2025-09-03 17:52:19,268 basehttp 76541 6158381056 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:52:27,817 basehttp 76541 6158381056 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 147251 +INFO 2025-09-03 17:52:27,830 basehttp 76541 6158381056 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 17:52:44,786 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 17:53:15,787 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:53:40,787 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:54:16,783 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:54:40,774 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:55:17,783 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:55:40,783 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 17:56:18,777 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:56:40,822 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:57:41,969 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:57:41,970 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:58:41,957 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 17:59:41,974 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 17:59:41,980 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11740 +INFO 2025-09-03 18:00:41,962 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:01:41,963 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:01:41,965 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:02:41,962 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:03:41,965 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:03:41,968 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:04:41,965 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:05:41,977 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:05:41,979 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:06:41,964 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:07:41,980 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:07:41,982 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:10:46,963 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:11:46,911 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:11:46,915 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:12:46,902 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:13:46,911 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:13:46,914 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:14:46,905 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:15:46,906 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:15:46,909 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:16:46,902 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:17:46,912 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:17:46,914 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:18:46,902 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:19:46,906 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:19:46,907 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:20:46,899 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:21:46,904 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:21:46,905 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:22:46,897 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:23:46,909 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:23:46,911 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:24:46,895 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:25:46,919 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:25:46,922 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:26:46,918 basehttp 76541 13035925504 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:26:46,921 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:27:46,893 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:28:46,897 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:28:46,900 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:29:46,913 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:29:46,916 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:30:00,276 basehttp 76541 13035925504 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:30:02,198 basehttp 76541 6158381056 "GET /en/patients/insurance-info/5/ HTTP/1.1" 200 36078 +WARNING 2025-09-03 18:30:02,214 log 76541 6158381056 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-03 18:30:02,214 basehttp 76541 6158381056 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-03 18:30:02,296 basehttp 76541 6158381056 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 18:30:15,372 log 76541 6158381056 Internal Server Error: /en/admin/patients/insuranceclaim/189/change/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 719, in wrapper + return self.admin_site.admin_view(view)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 192, in _view_wrapper + result = _process_exception(request, e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 190, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/sites.py", line 246, in inner + return view(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1987, in change_view + return self.changeform_view(request, object_id, form_url, extra_context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 192, in _view_wrapper + result = _process_exception(request, e) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 190, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1840, in changeform_view + return self._changeform_view(request, object_id, form_url, extra_context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1916, in _changeform_view + formsets, inline_instances = self._create_formsets( + ^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 2358, in _create_formsets + for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 938, in get_formsets_with_inlines + yield inline.get_formset(request, obj), inline + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 2535, in get_formset + return inlineformset_factory(self.parent_model, self.model, **defaults) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 1343, in inlineformset_factory + FormSet = modelformset_factory(model, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 1051, in modelformset_factory + form = modelform_factory( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 654, in modelform_factory + return type(form)(class_name, (form,), form_class_attrs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 334, in __new__ + raise FieldError(message) +django.core.exceptions.FieldError: Unknown field(s) (status) specified for ClaimStatusHistory +ERROR 2025-09-03 18:30:15,373 basehttp 76541 6158381056 "GET /en/admin/patients/insuranceclaim/189/change/ HTTP/1.1" 500 171496 +INFO 2025-09-03 18:30:32,879 basehttp 76541 6158381056 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:30:36,031 autoreload 76541 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/admin.py changed, reloading. +INFO 2025-09-03 18:30:36,554 autoreload 94585 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 18:30:38,940 basehttp 94585 6161477632 "GET /en/admin/patients/insuranceclaim/189/change/ HTTP/1.1" 200 127811 +INFO 2025-09-03 18:30:38,956 basehttp 94585 12901707776 "GET /static/admin/js/calendar.js HTTP/1.1" 200 9141 +INFO 2025-09-03 18:30:38,956 basehttp 94585 12918534144 "GET /static/admin/js/admin/DateTimeShortcuts.js HTTP/1.1" 200 19319 +INFO 2025-09-03 18:30:38,958 basehttp 94585 6161477632 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 18:30:38,986 basehttp 94585 6161477632 "GET /static/admin/img/icon-calendar.svg HTTP/1.1" 200 1086 +INFO 2025-09-03 18:30:38,986 basehttp 94585 12918534144 "GET /static/admin/img/icon-clock.svg HTTP/1.1" 200 677 +INFO 2025-09-03 18:30:57,913 basehttp 94585 12918534144 "POST /en/admin/patients/insuranceclaim/189/change/ HTTP/1.1" 302 0 +INFO 2025-09-03 18:30:57,963 basehttp 94585 12918534144 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 143077 +INFO 2025-09-03 18:30:57,978 basehttp 94585 12918534144 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 18:30:57,989 basehttp 94585 12918534144 "GET /static/admin/img/icon-yes.svg HTTP/1.1" 200 436 +INFO 2025-09-03 18:31:02,904 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:31:02,908 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/5/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:31:08,427 basehttp 94585 6161477632 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 142820 +INFO 2025-09-03 18:31:08,442 basehttp 94585 6161477632 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 18:31:11,359 basehttp 94585 6161477632 "GET /en/admin/patients/insuranceclaim/200/change/ HTTP/1.1" 200 127231 +INFO 2025-09-03 18:31:11,371 basehttp 94585 6161477632 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-03 18:31:23,527 basehttp 94585 6161477632 "GET /en/patients/ HTTP/1.1" 200 139705 +INFO 2025-09-03 18:31:23,603 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:31:23,607 basehttp 94585 12918534144 "GET /en/patients/patient-stats/ HTTP/1.1" 200 12305 +INFO 2025-09-03 18:31:38,843 basehttp 94585 12918534144 "GET /en/patients/patientprofile/33/details/ HTTP/1.1" 200 32204 +INFO 2025-09-03 18:31:38,877 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:31:51,463 basehttp 94585 12918534144 "GET /en/patients/insurance-info/33/ HTTP/1.1" 200 36211 +INFO 2025-09-03 18:31:51,496 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:32:21,526 basehttp 94585 12918534144 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:32:51,369 basehttp 94585 12918534144 "GET /en/admin/patients/insuranceclaim/ HTTP/1.1" 200 142820 +INFO 2025-09-03 18:32:51,902 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:32:51,904 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11739 +INFO 2025-09-03 18:44:07,355 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:44:43,359 basehttp 94585 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:44:43,361 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11737 +INFO 2025-09-03 18:45:13,345 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11736 +INFO 2025-09-03 18:45:45,799 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 11738 +INFO 2025-09-03 18:45:46,161 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:46:15,796 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 63828 +INFO 2025-09-03 18:46:45,796 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 48547 +INFO 2025-09-03 18:46:46,166 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:47:15,797 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 73160 +INFO 2025-09-03 18:47:45,796 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 79944 +INFO 2025-09-03 18:47:46,177 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:48:07,562 basehttp 94585 6161477632 "POST /en/patients/check-eligibility/33/ HTTP/1.1" 200 14083 +INFO 2025-09-03 18:48:15,774 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 67510 +INFO 2025-09-03 18:48:16,762 basehttp 94585 6161477632 "POST /en/patients/check-eligibility/33/ HTTP/1.1" 200 14126 +INFO 2025-09-03 18:48:45,772 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 60687 +INFO 2025-09-03 18:48:46,158 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:48:49,705 basehttp 94585 6161477632 "GET /en/patients/insurance-info/33/ HTTP/1.1" 200 36211 +INFO 2025-09-03 18:48:49,755 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:48:56,275 basehttp 94585 6161477632 "GET /en/patients/insurance-info/create/39/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 18:48:56,286 basehttp 94585 6161477632 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 18:48:56,286 basehttp 94585 12901707776 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +INFO 2025-09-03 18:48:56,312 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:49:19,778 basehttp 94585 6161477632 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 71922 +INFO 2025-09-03 18:49:49,407 basehttp 94585 6161477632 "GET /en/patients/insurance-info/create/39/ HTTP/1.1" 200 40576 +WARNING 2025-09-03 18:49:49,416 basehttp 94585 6161477632 "GET /static/assets/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 404 2146 +WARNING 2025-09-03 18:49:49,417 basehttp 94585 12901707776 "GET /static/assets/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 404 2140 +INFO 2025-09-03 18:49:49,441 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:49:59,072 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:49:59,078 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 79934 +INFO 2025-09-03 18:50:19,776 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 78751 +INFO 2025-09-03 18:50:49,777 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 72058 +INFO 2025-09-03 18:51:08,449 basehttp 94585 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:51:19,775 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 48438 +INFO 2025-09-03 18:51:49,776 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 48202 +INFO 2025-09-03 18:52:08,450 basehttp 94585 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:52:19,777 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 48214 +INFO 2025-09-03 18:52:49,777 basehttp 94585 12901707776 "GET /en/patients/insurance-claims-history/33/ HTTP/1.1" 200 71321 +INFO 2025-09-03 18:53:08,454 basehttp 94585 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:53:22,874 basehttp 94585 12901707776 "GET /en/appointments/create/?patient=33 HTTP/1.1" 200 36516 +INFO 2025-09-03 18:53:22,909 basehttp 94585 12901707776 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:53:46,131 basehttp 94585 12901707776 "GET / HTTP/1.1" 302 0 +INFO 2025-09-03 18:53:46,152 basehttp 94585 6161477632 "GET /en/ HTTP/1.1" 200 49782 +INFO 2025-09-03 18:53:46,198 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:53:46,210 basehttp 94585 12918534144 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 18:53:46,210 basehttp 94585 12935360512 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-03 18:53:46,212 basehttp 94585 12901707776 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 18:54:08,922 basehttp 94585 12901707776 "GET /en/patients/insurance-info HTTP/1.1" 301 0 +INFO 2025-09-03 18:54:08,950 basehttp 94585 12918534144 "GET /en/patients/insurance-info/ HTTP/1.1" 200 139304 +INFO 2025-09-03 18:54:08,997 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:54:45,149 basehttp 94585 12918534144 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 18:54:46,207 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:54:46,207 basehttp 94585 12935360512 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 18:54:49,704 basehttp 94585 12918534144 "GET /en/inpatients/ HTTP/1.1" 200 41779 +INFO 2025-09-03 18:54:49,750 basehttp 94585 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:54:49,751 basehttp 94585 12935360512 "GET /en/inpatients/stats/ HTTP/1.1" 200 3000 +INFO 2025-09-03 18:54:49,771 basehttp 94585 6161477632 "GET /en/inpatients/bed-grid/ HTTP/1.1" 200 611361 +INFO 2025-09-03 18:54:52,415 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:54:52,504 basehttp 94585 6161477632 "GET /static/plugins/dropzone/dist/min/dropzone.min.js HTTP/1.1" 200 114702 +INFO 2025-09-03 18:54:52,518 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:54:52,631 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:55:11,030 basehttp 94585 6161477632 "GET /en/inpatients/admissions/create/ HTTP/1.1" 200 51245 +INFO 2025-09-03 18:55:11,065 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:55:22,658 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:55:52,533 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:55:52,642 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:56:22,656 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:56:52,530 basehttp 94585 6161477632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 18:56:52,643 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:57:22,660 basehttp 94585 6161477632 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 18:59:09,915 autoreload 2903 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 18:59:10,192 basehttp 2903 6189297664 "GET /en/inpatients/discharge/335/ HTTP/1.1" 200 40578 +INFO 2025-09-03 18:59:10,240 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:00:10,252 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:00:18,422 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:00:18,494 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:00:22,657 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:00:29,500 basehttp 2903 6189297664 "GET /en/inpatients/discharge/335/ HTTP/1.1" 200 40578 +INFO 2025-09-03 19:00:29,544 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:01:29,557 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:01:38,479 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:01:38,546 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:01:42,535 basehttp 2903 6189297664 "GET /en/inpatients/beds/1758/ HTTP/1.1" 200 33490 +INFO 2025-09-03 19:01:42,570 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:02:41,566 basehttp 2903 6189297664 "GET /en/emr HTTP/1.1" 301 0 +INFO 2025-09-03 19:02:41,595 basehttp 2903 6206124032 "GET /en/emr/ HTTP/1.1" 200 71709 +INFO 2025-09-03 19:02:41,643 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:02:41,649 basehttp 2903 6189297664 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 19:02:49,802 basehttp 2903 6189297664 "GET /en/emr/encounters/ HTTP/1.1" 200 148284 +INFO 2025-09-03 19:02:49,839 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:02:59,829 basehttp 2903 6189297664 "GET /en/emr/vital-signs/ HTTP/1.1" 200 91448 +INFO 2025-09-03 19:02:59,865 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:03:11,719 basehttp 2903 6189297664 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 19:03:32,317 basehttp 2903 6189297664 "GET /en/emr/problems/ HTTP/1.1" 200 104971 +INFO 2025-09-03 19:03:32,349 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:03:40,131 basehttp 2903 6189297664 "GET /en/emr/notes/ HTTP/1.1" 200 98610 +INFO 2025-09-03 19:03:40,167 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:03:52,866 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:03:52,875 basehttp 2903 6206124032 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 19:04:22,874 basehttp 2903 6206124032 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 19:04:28,095 basehttp 2903 6206124032 "GET /en/emr/encounters/981/ HTTP/1.1" 200 31615 +INFO 2025-09-03 19:04:28,130 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 19:04:43,810 log 2903 6206124032 Bad Request: /en/emr/encounter/981/vitals/add/ +WARNING 2025-09-03 19:04:43,810 basehttp 2903 6206124032 "GET /en/emr/encounter/981/vitals/add/ HTTP/1.1" 400 28 +INFO 2025-09-03 19:04:52,864 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:04:52,871 basehttp 2903 6189297664 "GET /en/emr/stats/ HTTP/1.1" 200 2966 +INFO 2025-09-03 19:05:00,165 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:05:04,148 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:05:34,159 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:05:56,315 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:05:56,409 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:05:56,538 basehttp 2903 6189297664 "GET /en/inpatients/beds/ HTTP/1.1" 200 2109937 +INFO 2025-09-03 19:05:59,622 basehttp 2903 6189297664 "GET /en/inpatients/transfers/ HTTP/1.1" 200 87537 +INFO 2025-09-03 19:05:59,653 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +WARNING 2025-09-03 19:06:25,986 log 2903 6189297664 Not Found: /en/inpatients/transfers/34 +WARNING 2025-09-03 19:06:25,986 basehttp 2903 6189297664 "GET /en/inpatients/transfers/34 HTTP/1.1" 404 40274 +INFO 2025-09-03 19:06:31,799 basehttp 2903 6189297664 "GET /en/inpatients/transfer/85/approve/ HTTP/1.1" 200 9418 +INFO 2025-09-03 19:06:59,666 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:07:59,670 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:08:14,924 basehttp 2903 6206124032 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:08:14,928 basehttp 2903 6189297664 "GET /en/inpatients/stats/ HTTP/1.1" 200 3000 +INFO 2025-09-03 19:08:14,954 basehttp 2903 6222950400 "GET /en/inpatients/bed-grid/ HTTP/1.1" 200 611361 +INFO 2025-09-03 19:08:14,985 basehttp 2903 6189297664 "GET /en/inpatients/bed-grid/ HTTP/1.1" 200 611361 +INFO 2025-09-03 19:08:21,210 basehttp 2903 6189297664 "GET /en/inpatients/wards/ HTTP/1.1" 200 48071 +INFO 2025-09-03 19:08:21,241 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:09:21,248 basehttp 2903 6189297664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:09:27,274 autoreload 2903 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-03 19:09:27,609 autoreload 7374 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 19:10:21,316 basehttp 7374 6169440256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:11:22,190 basehttp 7374 6169440256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:11:34,286 basehttp 7374 6169440256 "GET /en/patients/ HTTP/1.1" 200 139705 +INFO 2025-09-03 19:11:34,340 basehttp 7374 6169440256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:11:34,344 basehttp 7374 12901707776 "GET /en/patients/patient-stats/ HTTP/1.1" 200 12305 +WARNING 2025-09-03 19:11:40,756 log 7374 12901707776 Not Found: /en/patients/consent +WARNING 2025-09-03 19:11:40,757 basehttp 7374 12901707776 "GET /en/patients/consent HTTP/1.1" 404 48373 +INFO 2025-09-03 19:11:48,192 basehttp 7374 12901707776 "GET /en/patients/consents HTTP/1.1" 301 0 +ERROR 2025-09-03 19:11:48,239 log 7374 6169440256 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_detail' not found. 'consent_form_detail' is not a valid view function or pattern name. +ERROR 2025-09-03 19:11:48,242 basehttp 7374 6169440256 "GET /en/patients/consents/ HTTP/1.1" 500 250956 +INFO 2025-09-03 19:13:39,862 autoreload 7374 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 19:13:40,213 autoreload 9245 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 19:13:42,689 log 9245 6171701248 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_detail' not found. 'consent_form_detail' is not a valid view function or pattern name. +ERROR 2025-09-03 19:13:42,692 basehttp 9245 6171701248 "GET /en/patients/consents/ HTTP/1.1" 500 251093 +INFO 2025-09-03 19:13:57,051 autoreload 9245 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 19:13:57,378 autoreload 9409 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 19:13:58,270 log 9409 6168571904 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_update' not found. 'consent_form_update' is not a valid view function or pattern name. +ERROR 2025-09-03 19:13:58,272 basehttp 9409 6168571904 "GET /en/patients/consents/ HTTP/1.1" 500 255228 +INFO 2025-09-03 19:15:54,828 autoreload 9409 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-03 19:15:55,205 autoreload 10261 8466948288 Watching for file changes with StatReloader +INFO 2025-09-03 19:18:55,272 autoreload 10261 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-03 19:18:55,563 autoreload 11582 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-03 19:18:59,062 log 11582 6192689152 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_delete' not found. 'consent_form_delete' is not a valid view function or pattern name. +ERROR 2025-09-03 19:18:59,065 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 500 254626 +ERROR 2025-09-03 19:19:35,793 log 11582 6192689152 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_create' not found. 'consent_form_create' is not a valid view function or pattern name. +ERROR 2025-09-03 19:19:35,794 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 500 229052 +ERROR 2025-09-03 19:20:33,015 log 11582 6192689152 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_preview' not found. 'consent_form_preview' is not a valid view function or pattern name. +ERROR 2025-09-03 19:20:33,016 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 500 231510 +ERROR 2025-09-03 19:20:45,890 log 11582 6192689152 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_activate' not found. 'consent_form_activate' is not a valid view function or pattern name. +ERROR 2025-09-03 19:20:45,891 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 500 232392 +INFO 2025-09-03 19:21:32,662 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-03 19:21:32,717 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 19:21:37,026 log 11582 6192689152 Internal Server Error: /en/patients/consent-forms/detail/74/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_list' not found. 'consent_form_list' is not a valid view function or pattern name. +ERROR 2025-09-03 19:21:37,037 basehttp 11582 6192689152 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 500 169670 +ERROR 2025-09-03 19:22:05,825 log 11582 6192689152 Internal Server Error: /en/patients/consent-forms/detail/74/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_delete' not found. 'consent_form_delete' is not a valid view function or pattern name. +ERROR 2025-09-03 19:22:05,826 basehttp 11582 6192689152 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 500 169871 +ERROR 2025-09-03 19:22:18,813 log 11582 6192689152 Internal Server Error: /en/patients/consent-forms/detail/74/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_preview' not found. 'consent_form_preview' is not a valid view function or pattern name. +ERROR 2025-09-03 19:22:18,814 basehttp 11582 6192689152 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 500 169323 +INFO 2025-09-03 19:22:51,459 basehttp 11582 6192689152 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 200 22785 +INFO 2025-09-03 19:22:51,492 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:22:59,452 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-03 19:22:59,453 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:22:59,496 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 19:23:02,645 log 11582 6209515520 Internal Server Error: /en/patients/consent-forms/update/74/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'consent_form_list' not found. 'consent_form_list' is not a valid view function or pattern name. +ERROR 2025-09-03 19:23:02,646 basehttp 11582 6209515520 "GET /en/patients/consent-forms/update/74/ HTTP/1.1" 500 184500 +ERROR 2025-09-03 19:23:22,031 log 11582 6209515520 Internal Server Error: /en/patients/consent-forms/update/74/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'save_consent_form_draft' not found. 'save_consent_form_draft' is not a valid view function or pattern name. +ERROR 2025-09-03 19:23:22,032 basehttp 11582 6209515520 "GET /en/patients/consent-forms/update/74/ HTTP/1.1" 500 181623 +INFO 2025-09-03 19:23:49,627 basehttp 11582 6209515520 "GET /en/patients/consent-forms/update/74/ HTTP/1.1" 200 33258 +WARNING 2025-09-03 19:23:49,635 basehttp 11582 6192689152 "GET /static/assets/plugins/summernote/dist/summernote-lite.min.js HTTP/1.1" 404 2086 +INFO 2025-09-03 19:23:49,636 basehttp 11582 6209515520 "GET /static/plugins/summernote/dist/summernote-lite.min.css HTTP/1.1" 200 30684 +INFO 2025-09-03 19:23:49,656 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:23:57,660 basehttp 11582 6209515520 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-03 19:23:57,694 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:24:02,926 basehttp 11582 6209515520 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 200 22785 +INFO 2025-09-03 19:24:02,956 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:24:07,429 basehttp 11582 6209515520 "GET /en/patients/consent-forms/update/74/ HTTP/1.1" 200 33258 +WARNING 2025-09-03 19:24:07,439 basehttp 11582 6209515520 "GET /static/assets/plugins/summernote/dist/summernote-lite.min.js HTTP/1.1" 404 2086 +INFO 2025-09-03 19:24:07,464 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:24:35,546 basehttp 11582 6192689152 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-03 19:24:35,582 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:25:36,951 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:26:34,224 basehttp 11582 6192689152 "GET / HTTP/1.1" 302 0 +INFO 2025-09-03 19:26:34,242 basehttp 11582 6209515520 "GET /en/ HTTP/1.1" 200 49794 +INFO 2025-09-03 19:26:34,296 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:26:34,302 basehttp 11582 6243168256 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-03 19:26:34,303 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:26:34,305 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:27:04,289 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:27:34,312 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:27:34,314 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:27:34,314 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:28:04,294 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:28:34,297 basehttp 11582 6243168256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:28:34,298 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:28:34,301 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:29:05,186 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:29:35,211 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:29:35,211 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:29:35,213 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:30:36,196 basehttp 11582 6243168256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:30:36,197 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:30:37,180 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:31:37,196 basehttp 11582 6243168256 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:31:37,196 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:31:41,187 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:32:38,200 basehttp 11582 6243168256 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:32:38,201 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:32:41,188 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:33:41,204 basehttp 11582 6243168256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:33:41,206 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:33:41,208 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:34:41,168 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:35:41,196 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:35:41,197 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:35:41,198 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:36:41,166 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:37:41,167 basehttp 11582 6243168256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:37:41,170 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:37:41,172 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:38:41,174 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:39:41,187 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:39:41,190 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:39:41,192 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:40:41,167 basehttp 11582 6243168256 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:41:41,189 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:41:41,192 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:41:41,194 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:42:41,180 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:42:41,180 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:42:41,181 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:43:41,180 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:44:41,192 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:44:41,195 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:44:41,196 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:45:41,186 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:46:41,187 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:46:41,188 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:46:41,190 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:47:41,181 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:47:41,181 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:47:41,182 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:48:41,086 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:49:41,108 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:49:41,110 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:49:41,111 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:50:36,988 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:50:41,102 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:50:41,104 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:50:51,458 basehttp 11582 6192689152 "GET /en/operating-theatre/ HTTP/1.1" 200 34120 +INFO 2025-09-03 19:50:51,522 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:50:51,523 basehttp 11582 6209515520 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-03 19:51:00,069 basehttp 11582 6209515520 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 23266 +INFO 2025-09-03 19:51:00,099 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:03,256 basehttp 11582 6209515520 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 30821 +INFO 2025-09-03 19:51:03,296 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:03,297 basehttp 11582 6192689152 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-03 19:51:06,182 basehttp 11582 6192689152 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 28835 +INFO 2025-09-03 19:51:06,212 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:11,214 basehttp 11582 6192689152 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 26947 +INFO 2025-09-03 19:51:11,248 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:14,272 basehttp 11582 6192689152 "GET /en/operating-theatre/equipment/ HTTP/1.1" 200 29350 +INFO 2025-09-03 19:51:14,303 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:18,634 basehttp 11582 6192689152 "GET /en/operating-theatre/templates/ HTTP/1.1" 200 41476 +WARNING 2025-09-03 19:51:18,647 basehttp 11582 6243168256 "GET /static/assets/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 404 2122 +WARNING 2025-09-03 19:51:18,647 basehttp 11582 6192689152 "GET /static/assets/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 404 2128 +WARNING 2025-09-03 19:51:18,647 basehttp 11582 6226341888 "GET /static/assets/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2098 +WARNING 2025-09-03 19:51:18,648 basehttp 11582 6209515520 "GET /static/assets/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 404 2161 +WARNING 2025-09-03 19:51:18,650 basehttp 11582 6243168256 "GET /static/assets/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 404 2155 +WARNING 2025-09-03 19:51:18,650 basehttp 11582 6259994624 "GET /static/assets/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 404 2143 +INFO 2025-09-03 19:51:18,670 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:30,594 basehttp 11582 6192689152 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-03 19:51:44,752 basehttp 11582 6192689152 "GET /en/hr HTTP/1.1" 301 0 +INFO 2025-09-03 19:51:44,787 basehttp 11582 6192689152 "GET /en/hr/ HTTP/1.1" 200 42461 +INFO 2025-09-03 19:51:44,830 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:53,634 basehttp 11582 6192689152 "GET /en/hr/employees/ HTTP/1.1" 200 130557 +INFO 2025-09-03 19:51:53,668 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:51:57,058 basehttp 11582 6192689152 "GET /en/hr/employees/56/ HTTP/1.1" 200 34527 +INFO 2025-09-03 19:51:57,088 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:52:00,460 basehttp 11582 6192689152 "GET /en/hr/departments/ HTTP/1.1" 200 125487 +WARNING 2025-09-03 19:52:00,471 basehttp 11582 6226341888 "GET /static/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2077 +INFO 2025-09-03 19:52:00,471 basehttp 11582 6192689152 "GET /static/plugins/datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css HTTP/1.1" 200 8136 +INFO 2025-09-03 19:52:00,471 basehttp 11582 6209515520 "GET /static/plugins/select2/dist/css/select2.min.css HTTP/1.1" 200 14966 +INFO 2025-09-03 19:52:00,475 basehttp 11582 6209515520 "GET /static/plugins/datatables.net-buttons-bs5/js/buttons.bootstrap5.min.js HTTP/1.1" 200 1627 +INFO 2025-09-03 19:52:00,475 basehttp 11582 6243168256 "GET /static/plugins/datatables.net-buttons/js/buttons.print.min.js HTTP/1.1" 200 3073 +INFO 2025-09-03 19:52:00,477 basehttp 11582 6226341888 "GET /static/plugins/datatables.net-buttons/js/buttons.html5.min.js HTTP/1.1" 200 26043 +INFO 2025-09-03 19:52:00,477 basehttp 11582 6192689152 "GET /static/plugins/datatables.net-buttons/js/dataTables.buttons.min.js HTTP/1.1" 200 27926 +INFO 2025-09-03 19:52:00,481 basehttp 11582 6259994624 "GET /static/plugins/jszip/dist/jszip.min.js HTTP/1.1" 200 97630 +INFO 2025-09-03 19:52:00,481 basehttp 11582 6243168256 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +INFO 2025-09-03 19:52:00,487 basehttp 11582 6209515520 "GET /static/plugins/pdfmake/build/vfs_fonts.js HTTP/1.1" 200 828866 +INFO 2025-09-03 19:52:00,491 basehttp 11582 6276820992 "GET /static/plugins/pdfmake/build/pdfmake.min.js HTTP/1.1" 200 1400771 +INFO 2025-09-03 19:52:00,514 basehttp 11582 6276820992 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:52:02,181 basehttp 11582 6276820992 "GET /en/hr/departments/12/ HTTP/1.1" 200 35183 +WARNING 2025-09-03 19:52:02,197 basehttp 11582 6276820992 "GET /static/plugins/chart.js/dist/Chart.min.css HTTP/1.1" 404 2032 +WARNING 2025-09-03 19:52:02,199 basehttp 11582 6209515520 "GET /static/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2077 +WARNING 2025-09-03 19:52:02,199 basehttp 11582 6243168256 "GET /static/plugins/chart.js/dist/Chart.min.js HTTP/1.1" 404 2029 +INFO 2025-09-03 19:52:02,223 basehttp 11582 6259994624 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:52:38,024 basehttp 11582 6259994624 "GET /en/hr/schedules/ HTTP/1.1" 200 121816 +WARNING 2025-09-03 19:52:38,033 basehttp 11582 6259994624 "GET /static/plugins/fullcalendar/main.min.css HTTP/1.1" 404 2026 +WARNING 2025-09-03 19:52:38,035 basehttp 11582 6226341888 "GET /static/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2077 +WARNING 2025-09-03 19:52:38,035 basehttp 11582 6192689152 "GET /static/plugins/fullcalendar/main.min.js HTTP/1.1" 404 2023 +INFO 2025-09-03 19:52:38,065 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:52:44,066 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:52:44,070 basehttp 11582 6209515520 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-03 19:53:03,433 basehttp 11582 6209515520 "GET /en/laboratory/ HTTP/1.1" 200 51764 +INFO 2025-09-03 19:53:03,484 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 19:53:03,510 log 11582 6192689152 Internal Server Error: /en/laboratory/htmx/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/laboratory/views.py", line 946, in laboratory_stats + 'results_pending': LabResult.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: abnormal_flag, analyzed_by, analyzed_by_id, analyzed_datetime, analyzer, created_at, critical_called, critical_called_datetime, critical_called_to, id, is_critical, order, order_id, pathologist_comments, qc_notes, qc_passed, quality_controls, reference_range, reported_datetime, result_id, result_type, result_unit, result_value, specimen, specimen_id, status, technician_comments, test, test_id, updated_at, verified, verified_by, verified_by_id, verified_datetime +ERROR 2025-09-03 19:53:03,511 basehttp 11582 6192689152 "GET /en/laboratory/htmx/stats/ HTTP/1.1" 500 124523 +INFO 2025-09-03 19:53:17,469 basehttp 11582 6192689152 "GET /en/laboratory/tests/ HTTP/1.1" 200 89448 +INFO 2025-09-03 19:53:17,502 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:53:30,656 basehttp 11582 6192689152 "GET /en/laboratory/tests/4/ HTTP/1.1" 200 58641 +INFO 2025-09-03 19:53:30,686 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +ERROR 2025-09-03 19:53:47,130 log 11582 6192689152 Internal Server Error: /en/laboratory/htmx/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/laboratory/views.py", line 946, in laboratory_stats + 'results_pending': LabResult.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: abnormal_flag, analyzed_by, analyzed_by_id, analyzed_datetime, analyzer, created_at, critical_called, critical_called_datetime, critical_called_to, id, is_critical, order, order_id, pathologist_comments, qc_notes, qc_passed, quality_controls, reference_range, reported_datetime, result_id, result_type, result_unit, result_value, specimen, specimen_id, status, technician_comments, test, test_id, updated_at, verified, verified_by, verified_by_id, verified_datetime +ERROR 2025-09-03 19:53:47,131 basehttp 11582 6192689152 "GET /en/laboratory/htmx/stats/ HTTP/1.1" 500 124249 +INFO 2025-09-03 19:53:57,391 basehttp 11582 6192689152 "GET /en/laboratory/specimens/ HTTP/1.1" 200 138400 +INFO 2025-09-03 19:53:57,433 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:54:03,491 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:54:04,173 basehttp 11582 6192689152 "GET /en/laboratory/results/create/ HTTP/1.1" 200 308216 +INFO 2025-09-03 19:54:04,216 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:54:07,572 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:54:07,576 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:54:07,576 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:54:38,082 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:55:08,104 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:55:08,105 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:55:08,107 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:55:39,081 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:56:09,102 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:56:09,104 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:56:09,104 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:56:40,079 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:57:10,087 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:57:10,087 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:57:41,071 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:58:11,090 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:58:11,090 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:58:41,079 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 19:59:12,088 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 19:59:12,088 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 19:59:41,080 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:00:41,099 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:00:41,101 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:00:41,103 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:01:41,099 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:01:41,100 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:01:41,101 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:02:41,080 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:02:41,082 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:03:41,089 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:03:41,091 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:04:41,076 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:04:41,078 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:05:41,085 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:05:41,087 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:06:41,097 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:06:41,098 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:06:41,100 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:07:41,069 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:07:41,073 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:07:41,073 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:08:41,095 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:08:41,096 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:08:41,097 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:09:41,065 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:10:41,076 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:10:41,084 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:10:41,087 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:11:41,073 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:12:41,068 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:12:41,072 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:12:41,072 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:13:41,087 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:13:41,089 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:13:41,090 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:14:41,063 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:15:41,086 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:15:41,086 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:15:41,088 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:16:41,071 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:16:41,074 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:17:41,064 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:17:41,065 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:18:41,083 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:18:41,085 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:18:41,086 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:19:41,152 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:20:41,179 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:20:41,181 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:20:41,183 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:21:41,148 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:22:41,175 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:22:41,176 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:22:41,178 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:23:41,164 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:23:41,166 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:24:41,150 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:24:41,153 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:25:41,174 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:25:41,175 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:25:41,177 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:26:41,168 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:26:41,170 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:27:41,164 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:27:41,165 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:28:41,162 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:28:41,166 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:29:41,148 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:29:41,149 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:30:41,166 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:30:41,166 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:30:41,169 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:31:41,166 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:31:41,168 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:32:41,168 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:32:41,169 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:32:41,172 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:33:41,200 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:33:41,202 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:33:41,202 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:34:41,162 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:35:41,190 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:35:41,190 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:35:41,193 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:36:41,161 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:37:41,186 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:37:41,187 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:37:41,189 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:38:41,164 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:39:41,183 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:39:41,183 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:39:41,186 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:40:41,187 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 20:40:41,187 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 20:40:41,188 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 20:41:41,166 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 21:17:02,169 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 21:17:02,171 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 21:17:02,172 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 21:18:02,032 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 21:19:02,050 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 21:19:02,053 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 21:19:02,054 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 21:20:02,031 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 21:21:02,043 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 21:21:02,047 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 21:21:02,049 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 22:16:50,501 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 22:16:50,504 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3804 +INFO 2025-09-03 22:16:50,504 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:14:29,942 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:19:45,808 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:19:45,812 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:19:45,816 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:22:14,425 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:22:14,425 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:22:14,426 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:39:49,283 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:41:02,876 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:41:02,877 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:41:02,877 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:42:02,871 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:42:02,873 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:42:02,875 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:43:02,870 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:43:02,870 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:43:02,873 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:44:02,846 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:45:02,871 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:45:02,872 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:45:02,874 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:46:02,870 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:46:02,872 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:46:02,873 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:47:02,844 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:48:02,866 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:48:02,867 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:48:02,868 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:49:02,853 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:49:02,856 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:50:02,844 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:50:02,846 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:51:02,867 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:51:02,867 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:51:02,869 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:52:02,846 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:53:02,866 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:53:02,868 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:53:02,869 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:54:02,852 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:55:02,947 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:55:02,948 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:55:02,949 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:56:02,945 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:56:02,945 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:56:02,947 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:57:02,947 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:57:02,949 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:57:02,951 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:58:02,924 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-03 23:59:02,941 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-03 23:59:02,942 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-03 23:59:02,944 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:00:02,952 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:00:02,952 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:00:02,955 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:01:02,932 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:02:02,944 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:02:02,946 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:02:02,948 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:03:02,939 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:03:02,939 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:03:02,940 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:04:02,941 basehttp 11582 6192689152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:04:02,943 basehttp 11582 6226341888 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:04:02,945 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:05:02,915 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:06:02,933 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:06:02,935 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:06:02,936 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:07:02,927 basehttp 11582 6209515520 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:07:02,928 basehttp 11582 6192689152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:07:02,928 basehttp 11582 6226341888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:08:02,938 basehttp 11582 6192689152 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:08:02,938 basehttp 11582 6226341888 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:08:02,955 basehttp 11582 6209515520 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:09:02,917 basehttp 11582 6209515520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:09:52,883 autoreload 11582 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-04 00:09:53,377 autoreload 65489 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 00:09:54,753 basehttp 65489 6129217536 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 00:09:54,783 basehttp 65489 6162870272 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2096 +INFO 2025-09-04 00:09:54,787 basehttp 65489 6146043904 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:10:00,044 basehttp 65489 6146043904 "GET /en/patients/ HTTP/1.1" 200 139704 +INFO 2025-09-04 00:10:00,100 basehttp 65489 6146043904 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:10:00,103 basehttp 65489 6162870272 "GET /en/patients/patient-stats/ HTTP/1.1" 200 12305 +INFO 2025-09-04 00:10:01,380 basehttp 65489 6162870272 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-04 00:10:01,448 basehttp 65489 6162870272 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:10:06,323 basehttp 65489 6162870272 "GET /en/patients/consent-forms/detail/74/ HTTP/1.1" 200 22785 +INFO 2025-09-04 00:10:06,361 basehttp 65489 6162870272 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:10:31,489 basehttp 65489 6162870272 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-04 00:10:31,525 basehttp 65489 6162870272 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:11:01,573 basehttp 65489 6162870272 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-04 00:11:01,613 basehttp 65489 6162870272 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:11:31,653 basehttp 65489 6162870272 "GET /en/patients/consents/ HTTP/1.1" 200 174578 +INFO 2025-09-04 00:11:31,693 basehttp 65489 6162870272 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:11:46,123 autoreload 65489 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/urls.py changed, reloading. +INFO 2025-09-04 00:11:46,484 autoreload 66339 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 00:11:47,402 log 66339 6169538560 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 2281, in get_context_data + recent_consents = ConsentForm.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: consent_id, created_at, created_by, created_by_id, effective_date, expiry_date, guardian_name, guardian_relationship, guardian_signature, guardian_signed_at, id, notes, patient, patient_id, patient_ip_address, patient_signature, patient_signed_at, provider_name, provider_signature, provider_signed_at, revocation_reason, revoked_at, revoked_by, revoked_by_id, status, template, template_id, updated_at, witness_name, witness_signature, witness_signed_at, witness_title +ERROR 2025-09-04 00:11:47,404 basehttp 66339 6169538560 "GET /en/patients/consents/ HTTP/1.1" 500 144089 +INFO 2025-09-04 00:12:25,991 autoreload 66339 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-04 00:12:26,323 autoreload 66663 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 00:12:26,682 log 66663 6156791808 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 2289, in get_context_data + expiring_consents = ConsentForm.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: consent_id, created_at, created_by, created_by_id, effective_date, expiry_date, guardian_name, guardian_relationship, guardian_signature, guardian_signed_at, id, notes, patient, patient_id, patient_ip_address, patient_signature, patient_signed_at, provider_name, provider_signature, provider_signed_at, revocation_reason, revoked_at, revoked_by, revoked_by_id, status, template, template_id, updated_at, witness_name, witness_signature, witness_signed_at, witness_title +ERROR 2025-09-04 00:12:26,683 basehttp 66663 6156791808 "GET /en/patients/consents/ HTTP/1.1" 500 147283 +ERROR 2025-09-04 00:12:28,105 log 66663 6156791808 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 2289, in get_context_data + expiring_consents = ConsentForm.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: consent_id, created_at, created_by, created_by_id, effective_date, expiry_date, guardian_name, guardian_relationship, guardian_signature, guardian_signed_at, id, notes, patient, patient_id, patient_ip_address, patient_signature, patient_signed_at, provider_name, provider_signature, provider_signed_at, revocation_reason, revoked_at, revoked_by, revoked_by_id, status, template, template_id, updated_at, witness_name, witness_signature, witness_signed_at, witness_title +ERROR 2025-09-04 00:12:28,106 basehttp 66663 6156791808 "GET /en/patients/consents/ HTTP/1.1" 500 147283 +INFO 2025-09-04 00:14:18,173 autoreload 66663 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-04 00:14:18,523 autoreload 67443 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 00:14:19,136 log 67443 6157856768 Internal Server Error: /en/patients/consents/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py", line 2329, in get_context_data + template_form = ConsentTemplateForm( + ^^^^^^^^^^^^^^^^^^^^ +TypeError: BaseModelForm.__init__() got an unexpected keyword argument 'user' +ERROR 2025-09-04 00:14:19,137 basehttp 67443 6157856768 "GET /en/patients/consents/ HTTP/1.1" 500 93772 +INFO 2025-09-04 00:16:59,730 autoreload 67443 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/forms.py changed, reloading. +INFO 2025-09-04 00:17:00,087 autoreload 68695 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 00:17:08,598 autoreload 68695 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/forms.py changed, reloading. +INFO 2025-09-04 00:17:08,913 autoreload 68711 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 00:17:10,199 basehttp 68711 6202159104 "GET /en/patients/consents/ HTTP/1.1" 200 21814 +INFO 2025-09-04 00:17:10,245 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:18:10,259 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:19:10,259 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:20:10,263 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:21:10,265 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:22:01,535 basehttp 68711 6202159104 "GET /en/patients/consents/ HTTP/1.1" 200 38105 +INFO 2025-09-04 00:22:01,574 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 00:22:12,404 log 68711 6202159104 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:22:12,404 basehttp 68711 6202159104 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:23:01,584 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:24:01,577 basehttp 68711 6202159104 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:24:18,324 autoreload 68711 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/views.py changed, reloading. +INFO 2025-09-04 00:24:18,770 autoreload 71901 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 00:24:20,101 log 71901 6191804416 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:24:20,101 basehttp 71901 6191804416 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 00:24:20,117 log 71901 6191804416 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:24:20,117 basehttp 71901 6191804416 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:24:25,682 basehttp 71901 6191804416 "GET /en/patients/consents/ HTTP/1.1" 200 145701 +WARNING 2025-09-04 00:24:25,694 log 71901 6191804416 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:24:25,694 basehttp 71901 6191804416 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:24:25,777 basehttp 71901 6191804416 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-04 00:24:25,779 basehttp 71901 6259109888 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-04 00:24:25,783 basehttp 71901 6191804416 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-04 00:24:25,787 basehttp 71901 6275936256 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-04 00:24:25,790 basehttp 71901 6225457152 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-04 00:24:25,791 basehttp 71901 6191804416 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-04 00:24:25,792 basehttp 71901 6242283520 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-04 00:24:25,795 basehttp 71901 6208630784 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-04 00:24:25,796 basehttp 71901 6259109888 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-04 00:24:25,939 basehttp 71901 6259109888 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-04 00:24:26,001 basehttp 71901 6191804416 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-04 00:24:26,001 basehttp 71901 6208630784 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-04 00:24:26,001 basehttp 71901 6225457152 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-04 00:24:26,002 basehttp 71901 6259109888 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-04 00:24:26,002 basehttp 71901 6242283520 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-04 00:24:26,004 basehttp 71901 6275936256 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-04 00:24:26,009 basehttp 71901 6275936256 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-04 00:24:26,009 basehttp 71901 6242283520 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-04 00:24:26,009 basehttp 71901 6259109888 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-04 00:24:26,010 basehttp 71901 6208630784 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-04 00:24:26,010 basehttp 71901 6191804416 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-04 00:24:26,013 basehttp 71901 6275936256 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-04 00:24:26,014 basehttp 71901 6191804416 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-04 00:24:26,014 basehttp 71901 6259109888 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-04 00:24:26,014 basehttp 71901 6208630784 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-04 00:24:26,015 basehttp 71901 6242283520 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-04 00:24:26,016 basehttp 71901 6259109888 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-04 00:24:26,016 basehttp 71901 6225457152 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-04 00:24:26,019 basehttp 71901 6242283520 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-04 00:24:26,020 basehttp 71901 6259109888 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-04 00:24:26,020 basehttp 71901 6191804416 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-04 00:24:26,021 basehttp 71901 6225457152 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-04 00:24:26,021 basehttp 71901 6208630784 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-04 00:24:26,023 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 00:24:26,157 log 71901 6275936256 Not Found: /favicon.ico +WARNING 2025-09-04 00:24:26,157 basehttp 71901 6275936256 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-04 00:24:57,168 basehttp 71901 6275936256 "GET /en/patients/consents/ HTTP/1.1" 200 145701 +WARNING 2025-09-04 00:24:57,189 log 71901 6275936256 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:24:57,189 basehttp 71901 6275936256 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:24:57,282 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:25:57,856 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:26:58,847 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:27:59,838 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:29:00,843 basehttp 71901 6275936256 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:30:01,841 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:31:02,844 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:32:04,843 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:34:02,835 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:36:02,836 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:37:35,238 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:37:42,915 basehttp 71901 6191804416 "GET /en/operating-theatre/ HTTP/1.1" 200 34120 +WARNING 2025-09-04 00:37:42,931 log 71901 6191804416 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:37:42,931 basehttp 71901 6191804416 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:37:43,026 basehttp 71901 6191804416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:37:43,029 basehttp 71901 6208630784 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 00:37:48,371 basehttp 71901 6208630784 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 26947 +WARNING 2025-09-04 00:37:48,388 log 71901 6208630784 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:37:48,388 basehttp 71901 6208630784 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:37:48,471 basehttp 71901 6208630784 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:38:48,844 basehttp 71901 6208630784 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:39:49,827 basehttp 71901 6208630784 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:40:48,313 basehttp 71901 6208630784 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 200 44739 +INFO 2025-09-04 00:40:48,325 basehttp 71901 6191804416 "GET /static/plugins/select2/dist/css/select2.min.css HTTP/1.1" 200 14966 +INFO 2025-09-04 00:40:48,329 basehttp 71901 6242283520 "GET /static/plugins/bootstrap-timepicker/css/bootstrap-timepicker.min.css HTTP/1.1" 200 3034 +INFO 2025-09-04 00:40:48,330 basehttp 71901 6259109888 "GET /static/plugins/summernote/dist/summernote-lite.min.css HTTP/1.1" 200 30684 +INFO 2025-09-04 00:40:48,331 basehttp 71901 6225457152 "GET /static/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.css HTTP/1.1" 200 17192 +WARNING 2025-09-04 00:40:48,334 log 71901 6208630784 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-04 00:40:48,335 basehttp 71901 6191804416 "GET /static/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.js HTTP/1.1" 200 58136 +INFO 2025-09-04 00:40:48,336 basehttp 71901 6275936256 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +WARNING 2025-09-04 00:40:48,336 basehttp 71901 6208630784 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:40:48,337 basehttp 71901 6208630784 - Broken pipe from ('127.0.0.1', 53927) +INFO 2025-09-04 00:40:48,337 basehttp 71901 6225457152 "GET /static/plugins/bootstrap-timepicker/js/bootstrap-timepicker.min.js HTTP/1.1" 200 18685 +INFO 2025-09-04 00:40:48,337 basehttp 71901 6259109888 "GET /static/plugins/summernote/dist/summernote-lite.min.js HTTP/1.1" 200 186367 +INFO 2025-09-04 00:40:48,383 basehttp 71901 6259109888 "GET /static/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.css.map HTTP/1.1" 200 18548 +INFO 2025-09-04 00:40:48,398 basehttp 71901 6259109888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:40:48,426 basehttp 71901 6259109888 "GET /static/plugins/summernote/dist/font/summernote.woff2 HTTP/1.1" 200 6932 +INFO 2025-09-04 00:41:48,401 basehttp 71901 6259109888 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 00:42:13,154 log 71901 6259109888 Internal Server Error: /en/operating-theatre/notes/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_preview' not found. 'surgical_note_preview' is not a valid view function or pattern name. +ERROR 2025-09-04 00:42:13,156 basehttp 71901 6259109888 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 500 172869 +WARNING 2025-09-04 00:42:13,173 log 71901 6259109888 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:42:13,173 basehttp 71901 6259109888 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 00:42:13,200 log 71901 6259109888 Not Found: /favicon.ico +WARNING 2025-09-04 00:42:13,200 basehttp 71901 6259109888 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-04 00:46:58,048 autoreload 71901 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 00:46:58,509 autoreload 81991 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 00:52:24,070 autoreload 81991 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 00:52:24,454 autoreload 84396 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 00:53:17,674 autoreload 84396 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 00:53:18,023 autoreload 84802 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 00:54:35,395 log 84802 6341865472 Internal Server Error: /en/operating-theatre/notes/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_preview' not found. 'surgical_note_preview' is not a valid view function or pattern name. +ERROR 2025-09-04 00:54:35,398 basehttp 84802 6341865472 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 500 172741 +WARNING 2025-09-04 00:54:35,414 log 84802 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:54:35,414 basehttp 84802 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 00:54:38,712 log 84802 6341865472 Internal Server Error: /en/operating-theatre/notes/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_preview' not found. 'surgical_note_preview' is not a valid view function or pattern name. +ERROR 2025-09-04 00:54:38,713 basehttp 84802 6341865472 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 500 172741 +WARNING 2025-09-04 00:54:38,724 log 84802 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:54:38,725 basehttp 84802 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:55:00,298 autoreload 84802 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 00:55:00,611 autoreload 85575 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 00:55:01,044 log 85575 6161133568 Internal Server Error: /en/operating-theatre/notes/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_preview' with no arguments not found. 1 pattern(s) tried: ['en/operating\\-theatre/notes/(?P[0-9]+)/preview/\\Z'] +ERROR 2025-09-04 00:55:01,045 basehttp 85575 6161133568 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 500 174741 +WARNING 2025-09-04 00:55:01,062 log 85575 6161133568 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:55:01,063 basehttp 85575 6161133568 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 00:55:52,411 log 85575 6161133568 Internal Server Error: /en/operating-theatre/notes/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_preview' with arguments '('',)' not found. 1 pattern(s) tried: ['en/operating\\-theatre/notes/(?P[0-9]+)/preview/\\Z'] +ERROR 2025-09-04 00:55:52,412 basehttp 85575 6161133568 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 500 176314 +WARNING 2025-09-04 00:55:52,425 log 85575 6161133568 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:55:52,425 basehttp 85575 6161133568 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:57:05,199 basehttp 85575 6161133568 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 200 50023 +INFO 2025-09-04 00:57:05,210 basehttp 85575 6211612672 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-04 00:57:05,211 basehttp 85575 6245265408 "GET /static/plugins/select2/dist/css/select2.min.css HTTP/1.1" 200 14966 +WARNING 2025-09-04 00:57:05,213 log 85575 6161133568 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 00:57:05,214 basehttp 85575 6161133568 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 00:57:05,216 basehttp 85575 6245265408 "GET /static/plugins/bootstrap-timepicker/css/bootstrap-timepicker.min.css HTTP/1.1" 200 3034 +INFO 2025-09-04 00:57:05,216 basehttp 85575 6211612672 "GET /static/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 200 15733 +INFO 2025-09-04 00:57:05,219 basehttp 85575 6177959936 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-04 00:57:05,219 basehttp 85575 6211612672 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-04 00:57:05,223 basehttp 85575 6228439040 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-04 00:57:05,225 basehttp 85575 6245265408 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-04 00:57:05,225 basehttp 85575 6194786304 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-04 00:57:05,231 basehttp 85575 6177959936 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-04 00:57:05,231 basehttp 85575 6228439040 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +INFO 2025-09-04 00:57:05,232 basehttp 85575 6161133568 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-04 00:57:05,234 basehttp 85575 6245265408 "GET /static/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 200 33871 +INFO 2025-09-04 00:57:05,234 basehttp 85575 6194786304 "GET /static/plugins/bootstrap-timepicker/js/bootstrap-timepicker.min.js HTTP/1.1" 200 18685 +INFO 2025-09-04 00:57:05,238 basehttp 85575 6211612672 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-04 00:57:05,526 basehttp 85575 6211612672 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-04 00:57:05,623 basehttp 85575 6194786304 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-04 00:57:05,624 basehttp 85575 6228439040 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-04 00:57:05,624 basehttp 85575 6211612672 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-04 00:57:05,625 basehttp 85575 6245265408 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-04 00:57:05,627 basehttp 85575 6161133568 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-04 00:57:05,629 basehttp 85575 6177959936 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-04 00:57:05,631 basehttp 85575 6177959936 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-04 00:57:05,633 basehttp 85575 6194786304 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-04 00:57:05,634 basehttp 85575 6228439040 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-04 00:57:05,635 basehttp 85575 6161133568 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-04 00:57:05,638 basehttp 85575 6194786304 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-04 00:57:05,638 basehttp 85575 6228439040 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-04 00:57:05,639 basehttp 85575 6177959936 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-04 00:57:05,641 basehttp 85575 6161133568 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-04 00:57:05,643 basehttp 85575 6211612672 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-04 00:57:05,645 basehttp 85575 6194786304 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-04 00:57:05,645 basehttp 85575 6228439040 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-04 00:57:05,647 basehttp 85575 6245265408 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:57:05,647 basehttp 85575 6177959936 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-04 00:57:05,647 basehttp 85575 6161133568 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-04 00:57:05,648 basehttp 85575 6194786304 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-04 00:57:05,648 basehttp 85575 6211612672 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-04 00:57:05,648 basehttp 85575 6228439040 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-04 00:57:05,649 basehttp 85575 6177959936 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-04 00:58:05,642 basehttp 85575 6211612672 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 00:59:05,633 basehttp 85575 6211612672 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:00:05,636 basehttp 85575 6161133568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:01:05,649 basehttp 85575 6161133568 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:01:17,970 autoreload 85575 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 01:01:18,423 autoreload 88294 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 01:01:20,763 basehttp 88294 6341865472 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 26947 +WARNING 2025-09-04 01:01:20,779 log 88294 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:01:20,779 basehttp 88294 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 01:01:20,866 basehttp 88294 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:02:20,887 basehttp 88294 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:03:20,879 basehttp 88294 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:03:50,196 autoreload 88294 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 01:03:50,631 autoreload 89468 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 01:04:20,958 basehttp 89468 6168309760 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:04:23,072 autoreload 89468 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 01:04:23,428 autoreload 89706 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 01:04:25,356 log 89706 6194196480 Internal Server Error: /en/operating-theatre/notes/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_stats' not found. 'surgical_note_stats' is not a valid view function or pattern name. +ERROR 2025-09-04 01:04:25,358 basehttp 89706 6194196480 "GET /en/operating-theatre/notes/ HTTP/1.1" 500 167071 +WARNING 2025-09-04 01:04:25,373 log 89706 6194196480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:04:25,373 basehttp 89706 6194196480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 01:06:24,585 log 89706 6194196480 Internal Server Error: /en/operating-theatre/notes/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_export' not found. 'surgical_note_export' is not a valid view function or pattern name. +ERROR 2025-09-04 01:06:24,586 basehttp 89706 6194196480 "GET /en/operating-theatre/notes/ HTTP/1.1" 500 167755 +WARNING 2025-09-04 01:06:24,598 log 89706 6194196480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:06:24,598 basehttp 89706 6194196480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 01:07:04,215 basehttp 89706 6194196480 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 30495 +INFO 2025-09-04 01:07:04,236 basehttp 89706 6227849216 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-04 01:07:04,238 basehttp 89706 6261501952 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-04 01:07:04,239 basehttp 89706 6211022848 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-04 01:07:04,239 basehttp 89706 6278328320 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-04 01:07:04,240 basehttp 89706 6227849216 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +WARNING 2025-09-04 01:07:04,241 log 89706 6194196480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:07:04,242 basehttp 89706 6194196480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 01:07:04,242 basehttp 89706 6244675584 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-04 01:07:04,299 basehttp 89706 6244675584 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:08:00,983 autoreload 89706 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 01:08:01,350 autoreload 91337 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 01:08:02,052 log 91337 6123565056 Internal Server Error: /en/operating-theatre/notes/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 199, in render + len_values = len(values) + ^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 366, in __len__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'template'. Choices are: surgical_case, surgeon, template_used +ERROR 2025-09-04 01:08:02,054 basehttp 91337 6123565056 "GET /en/operating-theatre/notes/ HTTP/1.1" 500 222330 +WARNING 2025-09-04 01:08:02,071 log 91337 6123565056 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:08:02,071 basehttp 91337 6123565056 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 01:08:27,573 autoreload 91337 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 01:08:27,960 autoreload 91512 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 01:08:28,719 basehttp 91512 6129971200 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 30495 +WARNING 2025-09-04 01:08:28,734 log 91512 6129971200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 01:08:28,734 basehttp 91512 6129971200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 01:08:28,792 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:08:47,821 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 70486 +INFO 2025-09-04 01:08:47,832 basehttp 91512 13052751872 "GET /static/admin/js/theme.js HTTP/1.1" 200 1653 +INFO 2025-09-04 01:08:47,832 basehttp 91512 6146797568 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2808 +INFO 2025-09-04 01:08:47,832 basehttp 91512 6163623936 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2810 +INFO 2025-09-04 01:08:47,833 basehttp 91512 6129971200 "GET /static/admin/css/base.css HTTP/1.1" 200 22120 +INFO 2025-09-04 01:08:47,834 basehttp 91512 13035925504 "GET /static/admin/css/changelists.css HTTP/1.1" 200 6878 +INFO 2025-09-04 01:08:47,835 basehttp 91512 6129971200 "GET /static/admin/js/core.js HTTP/1.1" 200 6208 +INFO 2025-09-04 01:08:47,835 basehttp 91512 13052751872 "GET /static/admin/css/responsive.css HTTP/1.1" 200 16565 +INFO 2025-09-04 01:08:47,836 basehttp 91512 6163623936 "GET /static/admin/js/jquery.init.js HTTP/1.1" 200 347 +INFO 2025-09-04 01:08:47,836 basehttp 91512 13035925504 "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 200 9777 +INFO 2025-09-04 01:08:47,837 basehttp 91512 13052751872 "GET /static/admin/js/urlify.js HTTP/1.1" 200 7887 +INFO 2025-09-04 01:08:47,838 basehttp 91512 6129971200 "GET /static/admin/js/actions.js HTTP/1.1" 200 8076 +INFO 2025-09-04 01:08:47,838 basehttp 91512 6163623936 "GET /static/admin/js/prepopulate.js HTTP/1.1" 200 1531 +INFO 2025-09-04 01:08:47,840 basehttp 91512 13052751872 "GET /static/admin/img/search.svg HTTP/1.1" 200 458 +INFO 2025-09-04 01:08:47,842 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:08:47,843 basehttp 91512 6146797568 "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 285314 +INFO 2025-09-04 01:08:47,845 basehttp 91512 6146797568 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063 +INFO 2025-09-04 01:08:47,845 basehttp 91512 13035925504 "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 325171 +INFO 2025-09-04 01:08:47,847 basehttp 91512 13035925504 "GET /static/admin/js/filters.js HTTP/1.1" 200 978 +INFO 2025-09-04 01:08:47,853 basehttp 91512 13035925504 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 +INFO 2025-09-04 01:08:47,853 basehttp 91512 6146797568 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331 +INFO 2025-09-04 01:08:47,853 basehttp 91512 13069578240 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-09-04 01:09:29,755 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:09:33,102 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 70486 +INFO 2025-09-04 01:09:33,117 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:09:34,516 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 70486 +INFO 2025-09-04 01:09:34,534 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:09:38,639 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/surgicalnotetemplate/ HTTP/1.1" 200 69932 +INFO 2025-09-04 01:09:38,653 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:10:20,149 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/surgicalcase/ HTTP/1.1" 200 71253 +INFO 2025-09-04 01:10:20,167 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:10:26,224 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/equipmentusage/ HTTP/1.1" 200 70584 +INFO 2025-09-04 01:10:26,238 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:10:30,488 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/orblock/ HTTP/1.1" 200 72726 +INFO 2025-09-04 01:10:30,504 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:10:30,741 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:10:32,982 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/orblock/ HTTP/1.1" 200 72726 +INFO 2025-09-04 01:10:32,994 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:10:34,074 basehttp 91512 13069578240 "GET /en/admin/operating_theatre/orblock/ HTTP/1.1" 200 72726 +INFO 2025-09-04 01:10:34,090 basehttp 91512 13069578240 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 01:11:31,747 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:12:32,736 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:13:33,740 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:14:34,744 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:15:36,741 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:17:02,739 basehttp 91512 13069578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:19:51,376 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:21:51,353 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:24:03,829 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:26:16,737 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:28:53,050 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:31:30,688 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:33:30,690 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:35:30,687 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:37:30,682 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:39:30,681 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:41:30,685 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:43:30,685 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:45:30,672 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:47:30,672 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:49:30,702 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:51:30,698 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:53:30,698 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:55:30,685 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:57:30,691 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 01:59:30,697 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:01:30,683 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:03:30,686 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:05:30,677 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:07:30,675 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:09:30,673 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:11:30,679 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:13:30,668 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:15:30,665 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:17:11,749 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:17:17,405 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 82700 +INFO 2025-09-04 02:17:17,416 basehttp 91512 6146797568 "GET /static/admin/img/icon-yes.svg HTTP/1.1" 200 436 +INFO 2025-09-04 02:17:17,420 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:17:17,435 basehttp 91512 6129971200 "GET /static/admin/img/sorting-icons.svg HTTP/1.1" 200 1097 +INFO 2025-09-04 02:17:25,040 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 69435 +INFO 2025-09-04 02:17:25,052 basehttp 91512 6129971200 "GET /static/admin/js/cancel.js HTTP/1.1" 200 884 +INFO 2025-09-04 02:17:26,323 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 302 0 +INFO 2025-09-04 02:17:26,338 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71858 +INFO 2025-09-04 02:17:26,353 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:18:12,655 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:19:00,743 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 90051 +INFO 2025-09-04 02:19:00,749 basehttp 91512 6146797568 "GET /static/admin/img/icon-no.svg HTTP/1.1" 200 560 +INFO 2025-09-04 02:19:00,754 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:10,638 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/orblock/ HTTP/1.1" 200 72726 +INFO 2025-09-04 02:19:10,654 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:13,417 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/equipmentusage/ HTTP/1.1" 200 70584 +INFO 2025-09-04 02:19:13,432 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:14,668 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:19:17,581 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 90051 +INFO 2025-09-04 02:19:17,597 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:22,575 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71545 +INFO 2025-09-04 02:19:23,966 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 302 0 +INFO 2025-09-04 02:19:23,988 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71858 +INFO 2025-09-04 02:19:24,003 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:34,650 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 90016 +INFO 2025-09-04 02:19:34,662 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:19:44,336 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalcase/ HTTP/1.1" 200 71253 +INFO 2025-09-04 02:19:44,350 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:20:30,672 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:22:30,683 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:24:30,678 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:24:57,230 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 90016 +INFO 2025-09-04 02:24:57,246 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:25:01,265 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71507 +INFO 2025-09-04 02:25:02,511 basehttp 91512 6129971200 "POST /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 302 0 +INFO 2025-09-04 02:25:02,530 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71858 +INFO 2025-09-04 02:25:02,546 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:25:31,677 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:26:29,896 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71712 +INFO 2025-09-04 02:26:29,908 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:26:33,655 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:26:35,623 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/equipmentusage/ HTTP/1.1" 200 70584 +INFO 2025-09-04 02:26:35,637 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:28:30,666 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:30:30,669 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:30:46,058 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/equipmentusage/ HTTP/1.1" 200 70584 +INFO 2025-09-04 02:30:46,070 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:30:49,088 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/operatingroom/ HTTP/1.1" 200 71712 +INFO 2025-09-04 02:30:49,105 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:30:52,718 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/orblock/ HTTP/1.1" 200 72726 +INFO 2025-09-04 02:30:52,730 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:30:56,439 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 70486 +INFO 2025-09-04 02:30:56,454 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:31:02,371 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalcase/ HTTP/1.1" 200 71253 +INFO 2025-09-04 02:31:02,386 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:31:44,856 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalcase/ HTTP/1.1" 200 71253 +INFO 2025-09-04 02:31:44,869 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:32:30,662 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:34:30,664 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:36:30,687 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:37:34,257 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalcase/ HTTP/1.1" 200 106253 +INFO 2025-09-04 02:37:34,269 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:37:39,806 basehttp 91512 6129971200 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 98848 +INFO 2025-09-04 02:37:39,823 basehttp 91512 6129971200 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 02:37:41,531 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 02:37:42,904 log 91512 6129971200 Internal Server Error: /en/operating-theatre/notes/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_edit' not found. 'surgical_note_edit' is not a valid view function or pattern name. +ERROR 2025-09-04 02:37:42,906 basehttp 91512 6129971200 "GET /en/operating-theatre/notes/ HTTP/1.1" 500 252427 +WARNING 2025-09-04 02:37:42,923 log 91512 6129971200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:37:42,923 basehttp 91512 6129971200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:40:59,270 log 91512 6129971200 Internal Server Error: /en/operating-theatre/notes/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_delete' not found. 'surgical_note_delete' is not a valid view function or pattern name. +ERROR 2025-09-04 02:40:59,276 basehttp 91512 6129971200 "GET /en/operating-theatre/notes/ HTTP/1.1" 500 252500 +WARNING 2025-09-04 02:40:59,287 log 91512 6129971200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:40:59,287 basehttp 91512 6129971200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:41:20,524 basehttp 91512 6129971200 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 101059 +WARNING 2025-09-04 02:41:20,538 log 91512 6129971200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:41:20,538 basehttp 91512 6129971200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:41:20,613 basehttp 91512 6129971200 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 02:41:25,264 log 91512 6129971200 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 112, in get + self.object = self.get_object() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 31, in get_object + queryset = self.get_queryset() + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 913, in get_queryset + return SurgicalNote.objects.filter(tenant=self.request.user.tenant) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: blood_transfusion, closure, complications, condition, created_at, disposition, drains, estimated_blood_loss, findings, follow_up, id, implants, indication, note_id, planned_procedure, postop_instructions, postoperative_diagnosis, preoperative_diagnosis, procedure_performed, signed_datetime, specimens, status, surgeon, surgeon_id, surgical_approach, surgical_case, surgical_case_id, technique, template_used, template_used_id, updated_at +ERROR 2025-09-04 02:41:25,267 basehttp 91512 6129971200 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 141071 +WARNING 2025-09-04 02:41:25,282 log 91512 6129971200 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:41:25,282 basehttp 91512 6129971200 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:42:22,085 autoreload 91512 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:42:22,545 autoreload 32597 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:42:23,430 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'operative_note_list' not found. 'operative_note_list' is not a valid view function or pattern name. +ERROR 2025-09-04 02:42:23,433 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 174923 +WARNING 2025-09-04 02:42:23,443 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:42:23,443 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:42:25,079 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'operative_note_list' not found. 'operative_note_list' is not a valid view function or pattern name. +ERROR 2025-09-04 02:42:25,081 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 174923 +WARNING 2025-09-04 02:42:25,093 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:42:25,093 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:43:15,341 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'operative_note_pdf' not found. 'operative_note_pdf' is not a valid view function or pattern name. +ERROR 2025-09-04 02:43:15,343 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 174302 +WARNING 2025-09-04 02:43:15,355 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:43:15,355 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:43:43,587 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'operative_note_sign' not found. 'operative_note_sign' is not a valid view function or pattern name. +ERROR 2025-09-04 02:43:43,588 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 170508 +WARNING 2025-09-04 02:43:43,602 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:43:43,602 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:44:06,012 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'sign_note' with arguments '('',)' not found. 1 pattern(s) tried: ['en/operating\\-theatre/notes/(?P[0-9]+)/sign/\\Z'] +ERROR 2025-09-04 02:44:06,014 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 173672 +WARNING 2025-09-04 02:44:06,025 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:44:06,025 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:44:37,291 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'sign_note' with arguments '('',)' not found. 1 pattern(s) tried: ['en/operating\\-theatre/notes/(?P[0-9]+)/sign/\\Z'] +ERROR 2025-09-04 02:44:37,293 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 173707 +WARNING 2025-09-04 02:44:37,310 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:44:37,310 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:44:44,869 log 32597 6162427904 Internal Server Error: /en/operating-theatre/notes/19/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'sign_note' with arguments '('',)' not found. 1 pattern(s) tried: ['en/operating\\-theatre/notes/(?P[0-9]+)/sign/\\Z'] +ERROR 2025-09-04 02:44:44,870 basehttp 32597 6162427904 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 500 173672 +WARNING 2025-09-04 02:44:44,880 log 32597 6162427904 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:44:44,880 basehttp 32597 6162427904 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:46:10,898 autoreload 32597 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:46:11,372 autoreload 34330 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 02:46:11,776 basehttp 34330 6129905664 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 200 28371 +WARNING 2025-09-04 02:46:11,796 log 34330 6129905664 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:46:11,797 basehttp 34330 6129905664 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:46:11,857 basehttp 34330 6129905664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 02:46:29,865 log 34330 6146732032 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:46:29,865 basehttp 34330 6146732032 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:46:29,867 basehttp 34330 6129905664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 02:46:29,875 log 34330 6129905664 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:46:29,875 basehttp 34330 6129905664 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:47:29,851 basehttp 34330 6129905664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:48:29,852 basehttp 34330 6129905664 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:48:41,169 autoreload 34330 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:48:41,509 autoreload 35426 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 02:48:41,992 basehttp 35426 6126612480 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 101059 +WARNING 2025-09-04 02:48:42,008 log 35426 6126612480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:48:42,008 basehttp 35426 6126612480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:48:42,102 basehttp 35426 6126612480 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:48:48,001 basehttp 35426 6126612480 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 101059 +INFO 2025-09-04 02:48:48,014 basehttp 35426 6160265216 "GET /static/css/custom.css HTTP/1.1" 200 2063 +INFO 2025-09-04 02:48:48,014 basehttp 35426 6177091584 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-04 02:48:48,015 basehttp 35426 6193917952 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +WARNING 2025-09-04 02:48:48,019 log 35426 6210744320 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:48:48,020 basehttp 35426 6210744320 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:48:48,023 basehttp 35426 6193917952 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-04 02:48:48,025 basehttp 35426 6126612480 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-04 02:48:48,030 basehttp 35426 6210744320 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-04 02:48:48,034 basehttp 35426 6160265216 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-04 02:48:48,038 basehttp 35426 6160265216 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-04 02:48:48,038 basehttp 35426 6126612480 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-04 02:48:48,041 basehttp 35426 6177091584 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-04 02:48:48,041 basehttp 35426 6143438848 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-04 02:48:48,045 basehttp 35426 6126612480 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-04 02:48:48,047 basehttp 35426 6210744320 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-04 02:48:48,051 basehttp 35426 6193917952 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-04 02:48:48,054 basehttp 35426 6160265216 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-04 02:48:48,233 basehttp 35426 6160265216 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-04 02:48:48,307 basehttp 35426 6193917952 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-04 02:48:48,307 basehttp 35426 6210744320 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-04 02:48:48,307 basehttp 35426 6160265216 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-04 02:48:48,308 basehttp 35426 6126612480 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-04 02:48:48,308 basehttp 35426 6143438848 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-04 02:48:48,312 basehttp 35426 6177091584 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-04 02:48:48,325 basehttp 35426 6177091584 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-04 02:48:48,326 basehttp 35426 6143438848 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-04 02:48:48,326 basehttp 35426 6126612480 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-04 02:48:48,326 basehttp 35426 6160265216 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-04 02:48:48,328 basehttp 35426 6210744320 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-04 02:48:48,330 basehttp 35426 6160265216 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-04 02:48:48,330 basehttp 35426 6177091584 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-04 02:48:48,330 basehttp 35426 6126612480 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-04 02:48:48,331 basehttp 35426 6210744320 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-04 02:48:48,334 basehttp 35426 6193917952 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-04 02:48:48,335 basehttp 35426 6160265216 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-04 02:48:48,338 basehttp 35426 6177091584 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-04 02:48:48,339 basehttp 35426 6126612480 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-04 02:48:48,339 basehttp 35426 6210744320 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-04 02:48:48,340 basehttp 35426 6193917952 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-04 02:48:48,340 basehttp 35426 6160265216 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-04 02:48:48,341 basehttp 35426 6177091584 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +INFO 2025-09-04 02:48:48,342 basehttp 35426 6143438848 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 02:48:48,492 log 35426 6143438848 Not Found: /favicon.ico +WARNING 2025-09-04 02:48:48,492 basehttp 35426 6143438848 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-04 02:48:54,647 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/create/ HTTP/1.1" 200 50023 +INFO 2025-09-04 02:48:54,659 basehttp 35426 6160265216 "GET /static/plugins/bootstrap-timepicker/css/bootstrap-timepicker.min.css HTTP/1.1" 200 3034 +INFO 2025-09-04 02:48:54,660 basehttp 35426 6177091584 "GET /static/plugins/select2/dist/css/select2.min.css HTTP/1.1" 200 14966 +INFO 2025-09-04 02:48:54,660 basehttp 35426 6193917952 "GET /static/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 200 15733 +INFO 2025-09-04 02:48:54,661 basehttp 35426 6210744320 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +INFO 2025-09-04 02:48:54,662 basehttp 35426 6126612480 "GET /static/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 200 33871 +WARNING 2025-09-04 02:48:54,667 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-04 02:48:54,667 basehttp 35426 6126612480 "GET /static/plugins/bootstrap-timepicker/js/bootstrap-timepicker.min.js HTTP/1.1" 200 18685 +WARNING 2025-09-04 02:48:54,668 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 02:48:57,258 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:48:57,258 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:48:57,948 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 101059 +WARNING 2025-09-04 02:48:57,963 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:48:57,963 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:48:58,021 basehttp 35426 6143438848 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 02:49:00,905 log 35426 6143438848 Internal Server Error: /en/operating-theatre/notes/39/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_edit' not found. 'surgical_note_edit' is not a valid view function or pattern name. +ERROR 2025-09-04 02:49:00,907 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/39/ HTTP/1.1" 500 192026 +WARNING 2025-09-04 02:49:00,927 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:49:00,928 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:50:07,907 log 35426 6143438848 Internal Server Error: /en/operating-theatre/notes/39/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_export' not found. 'surgical_note_export' is not a valid view function or pattern name. +ERROR 2025-09-04 02:50:07,909 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/39/ HTTP/1.1" 500 172107 +WARNING 2025-09-04 02:50:07,921 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:50:07,921 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:50:22,671 log 35426 6143438848 Internal Server Error: /en/operating-theatre/notes/39/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_sign' not found. 'surgical_note_sign' is not a valid view function or pattern name. +ERROR 2025-09-04 02:50:22,672 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/39/ HTTP/1.1" 500 172307 +WARNING 2025-09-04 02:50:22,683 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:50:22,683 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:50:40,623 log 35426 6143438848 Internal Server Error: /en/operating-theatre/notes/39/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_note_amend' not found. 'surgical_note_amend' is not a valid view function or pattern name. +ERROR 2025-09-04 02:50:40,625 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/39/ HTTP/1.1" 500 172437 +WARNING 2025-09-04 02:50:40,638 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:50:40,638 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:51:46,884 basehttp 35426 6143438848 "GET /en/operating-theatre/notes/39/ HTTP/1.1" 200 31796 +WARNING 2025-09-04 02:51:46,901 log 35426 6143438848 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:51:46,901 basehttp 35426 6143438848 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:51:46,967 basehttp 35426 6143438848 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:51:59,040 basehttp 35426 6143438848 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 02:51:59,045 log 35426 6126612480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:51:59,045 basehttp 35426 6126612480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 02:51:59,068 log 35426 6126612480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:51:59,069 basehttp 35426 6126612480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:52:10,447 basehttp 35426 6126612480 "GET /en/operating-theatre/ HTTP/1.1" 200 43438 +WARNING 2025-09-04 02:52:10,467 log 35426 6126612480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:52:10,468 basehttp 35426 6126612480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:52:10,520 basehttp 35426 6126612480 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 02:52:12,210 basehttp 35426 6126612480 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 30344 +WARNING 2025-09-04 02:52:12,232 log 35426 6126612480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:52:12,232 basehttp 35426 6126612480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:52:12,285 basehttp 35426 6126612480 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:53:12,299 basehttp 35426 6126612480 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:53:50,881 autoreload 35426 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:53:51,296 autoreload 37791 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 02:54:12,377 basehttp 37791 6125563904 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 02:54:24,844 autoreload 37791 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:54:25,252 autoreload 38033 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 02:54:26,383 log 38033 6201716736 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:54:26,383 basehttp 38033 6201716736 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 02:54:26,392 log 38033 6201716736 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:54:26,393 basehttp 38033 6201716736 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 02:54:27,256 log 38033 6201716736 Internal Server Error: /en/operating-theatre/blocks/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 199, in render + len_values = len(values) + ^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 366, in __len__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'surgeon'. Choices are: operating_room, primary_surgeon, created_by +ERROR 2025-09-04 02:54:27,257 basehttp 38033 6201716736 "GET /en/operating-theatre/blocks/ HTTP/1.1" 500 216636 +WARNING 2025-09-04 02:54:27,274 log 38033 6201716736 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:54:27,274 basehttp 38033 6201716736 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:54:59,876 autoreload 38033 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:55:00,220 autoreload 38271 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:55:00,819 log 38271 6170423296 Internal Server Error: /en/operating-theatre/blocks/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'block_detail' not found. 'block_detail' is not a valid view function or pattern name. +ERROR 2025-09-04 02:55:00,820 basehttp 38271 6170423296 "GET /en/operating-theatre/blocks/ HTTP/1.1" 500 229236 +WARNING 2025-09-04 02:55:00,835 log 38271 6170423296 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:55:00,836 basehttp 38271 6170423296 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:55:29,240 basehttp 38271 6170423296 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 138849 +WARNING 2025-09-04 02:55:29,254 log 38271 6170423296 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:55:29,255 basehttp 38271 6170423296 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:55:29,333 basehttp 38271 6170423296 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 02:55:34,738 log 38271 6170423296 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 112, in get + self.object = self.get_object() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 31, in get_object + queryset = self.get_queryset() + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 573, in get_queryset + return ORBlock.objects.filter(tenant=self.request.user.tenant) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: allocated_minutes, assistant_surgeons, block_id, block_type, created_at, created_by, created_by_id, date, end_time, id, notes, operating_room, operating_room_id, primary_surgeon, primary_surgeon_id, service, special_equipment, special_setup, start_time, status, surgical_cases, updated_at, used_minutes +ERROR 2025-09-04 02:55:34,740 basehttp 38271 6170423296 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 139986 +WARNING 2025-09-04 02:55:34,757 log 38271 6170423296 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:55:34,758 basehttp 38271 6170423296 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:56:15,238 autoreload 38271 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:56:15,559 autoreload 38820 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:56:16,317 log 38820 6170079232 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 580, in get_context_data + context['scheduled_cases'] = SurgicalCase.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'operating_room' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_note, updated_at +ERROR 2025-09-04 02:56:16,319 basehttp 38820 6170079232 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 142005 +WARNING 2025-09-04 02:56:16,332 log 38820 6170079232 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:56:16,332 basehttp 38820 6170079232 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:57:15,065 autoreload 38820 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:57:15,411 autoreload 39286 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:57:16,057 log 39286 6134149120 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 580, in get_context_data + context['scheduled_cases'] = SurgicalCase.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'scheduled_start_time' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_note, updated_at +ERROR 2025-09-04 02:57:16,059 basehttp 39286 6134149120 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 141576 +WARNING 2025-09-04 02:57:16,073 log 39286 6134149120 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:57:16,073 basehttp 39286 6134149120 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:59:07,647 autoreload 39286 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:59:08,009 autoreload 40149 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:59:08,845 log 40149 6157332480 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 580, in get_context_data + context['scheduled_cases'] = SurgicalCase.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1563, in build_filter + self.check_related_objects(join_info.final_field, value, join_info.opts) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1372, in check_related_objects + self.check_query_object_type(value, opts, field) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1349, in check_query_object_type + raise ValueError( +ValueError: Cannot query "King Faisal Specialist Hospital - Abha": Must be "ORBlock" instance. +ERROR 2025-09-04 02:59:08,847 basehttp 40149 6157332480 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 138427 +WARNING 2025-09-04 02:59:08,861 log 40149 6157332480 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:59:08,861 basehttp 40149 6157332480 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:59:43,514 autoreload 40149 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:59:43,842 autoreload 40405 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:59:44,951 log 40405 6158036992 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 586, in get_context_data + ).select_related('patient', 'primary_surgeon').order_by('scheduled_start_time') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'scheduled_start_time' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_note, updated_at +ERROR 2025-09-04 02:59:44,953 basehttp 40405 6158036992 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 106294 +WARNING 2025-09-04 02:59:44,964 log 40405 6191689728 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:59:44,964 basehttp 40405 6191689728 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 02:59:57,514 autoreload 40405 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 02:59:57,880 autoreload 40489 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 02:59:58,949 log 40489 6132068352 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 596, in get_context_data + if case.estimated_duration_minutes: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'estimated_duration_minutes' +ERROR 2025-09-04 02:59:58,952 basehttp 40489 6132068352 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 87612 +WARNING 2025-09-04 02:59:58,963 log 40489 6132068352 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 02:59:58,964 basehttp 40489 6132068352 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:01:44,807 autoreload 40489 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:01:45,121 autoreload 41356 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:01:45,601 log 41356 6124957696 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'block_schedule_list' not found. 'block_schedule_list' is not a valid view function or pattern name. +ERROR 2025-09-04 03:01:45,602 basehttp 41356 6124957696 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 178004 +WARNING 2025-09-04 03:01:45,619 log 41356 6124957696 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:01:45,619 basehttp 41356 6124957696 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:02:26,566 log 41356 6124957696 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'block_schedule_list' not found. 'block_schedule_list' is not a valid view function or pattern name. +ERROR 2025-09-04 03:02:26,567 basehttp 41356 6124957696 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 178296 +WARNING 2025-09-04 03:02:26,582 log 41356 6124957696 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:02:26,582 basehttp 41356 6124957696 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:02:44,402 log 41356 6124957696 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'case_create' not found. 'case_create' is not a valid view function or pattern name. +ERROR 2025-09-04 03:02:44,404 basehttp 41356 6124957696 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 175561 +WARNING 2025-09-04 03:02:44,416 log 41356 6124957696 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:02:44,417 basehttp 41356 6124957696 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:11,974 basehttp 41356 6124957696 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:03:11,996 log 41356 6124957696 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:11,996 basehttp 41356 6124957696 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:12,108 basehttp 41356 6124957696 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:03:19,497 log 41356 6141784064 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:19,497 basehttp 41356 6141784064 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:19,499 basehttp 41356 6124957696 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:03:19,504 log 41356 6141784064 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:19,504 basehttp 41356 6141784064 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:24,522 basehttp 41356 6141784064 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:03:24,535 log 41356 6141784064 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:24,535 basehttp 41356 6141784064 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:24,614 basehttp 41356 6141784064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:03:50,959 autoreload 41356 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:03:51,292 autoreload 42333 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 03:03:52,512 log 42333 6157299712 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:52,513 basehttp 42333 6157299712 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:03:52,520 log 42333 6157299712 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:52,520 basehttp 42333 6157299712 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:54,542 basehttp 42333 6157299712 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:03:54,561 log 42333 6157299712 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:03:54,561 basehttp 42333 6157299712 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:03:54,649 basehttp 42333 6157299712 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:04:54,663 basehttp 42333 6157299712 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:05:54,701 basehttp 42333 6157299712 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:06:03,466 autoreload 42333 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:06:03,807 autoreload 43263 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:06:04,601 basehttp 43263 6198177792 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:06:04,620 log 43263 6198177792 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:06:04,620 basehttp 43263 6198177792 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:06:04,679 basehttp 43263 6198177792 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:07:04,687 basehttp 43263 6198177792 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:07:30,224 autoreload 43263 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:07:30,550 autoreload 43963 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:07:30,843 basehttp 43963 6204665856 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:07:30,854 log 43963 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:07:30,854 basehttp 43963 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:07:30,906 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:07:35,004 log 43963 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:07:35,006 basehttp 43963 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:07:35,006 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:07:35,015 log 43963 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:07:35,015 basehttp 43963 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:07:37,831 basehttp 43963 6204665856 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:07:37,852 log 43963 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:07:37,852 basehttp 43963 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:07:37,918 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:08:37,931 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:08:56,552 basehttp 43963 6204665856 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:08:56,568 log 43963 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:08:56,568 basehttp 43963 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:08:56,624 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:08:57,962 basehttp 43963 6204665856 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:08:57,978 log 43963 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:08:57,978 basehttp 43963 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:08:58,034 basehttp 43963 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:09:42,482 autoreload 43963 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:09:42,831 autoreload 44898 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:09:43,147 basehttp 44898 6193180672 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:09:43,164 log 44898 6193180672 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:09:43,164 basehttp 44898 6193180672 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:09:43,236 basehttp 44898 6193180672 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:10:03,892 autoreload 44898 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:10:04,215 autoreload 45064 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:10:04,598 basehttp 45064 6131118080 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:10:04,616 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:10:04,616 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:10:04,676 basehttp 45064 6131118080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:11:04,687 basehttp 45064 6131118080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:11:36,438 basehttp 45064 6131118080 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:11:36,457 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:36,457 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:11:36,511 basehttp 45064 6131118080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 03:11:41,628 log 45064 6131118080 Internal Server Error: /en/operating-theatre/blocks/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 199, in render + len_values = len(values) + ^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 366, in __len__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'surgical_cases'. Choices are: operating_room, primary_surgeon, created_by +ERROR 2025-09-04 03:11:41,630 basehttp 45064 6131118080 "GET /en/operating-theatre/blocks/ HTTP/1.1" 500 217284 +WARNING 2025-09-04 03:11:41,648 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:41,648 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:11:47,447 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:47,448 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:11:47,461 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:47,461 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:11:48,576 log 45064 6147944448 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:48,577 basehttp 45064 6147944448 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:11:48,577 basehttp 45064 6131118080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:11:48,587 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:48,587 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:11:49,714 log 45064 6131118080 Internal Server Error: /en/operating-theatre/blocks/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 199, in render + len_values = len(values) + ^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 366, in __len__ + self._fetch_all() + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1949, in _fetch_all + self._result_cache = list(self._iterable_class(self)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__ + results = compiler.execute_sql( + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1610, in execute_sql + sql, params = self.as_sql() + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql + extra_select, order_by, group_by = self.pre_sql_setup( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup + self.setup_query(with_col_aliases=with_col_aliases) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query + self.select, self.klass_info, self.annotation_col_map = self.get_select( + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 299, in get_select + related_klass_infos = self.get_related_selections(select, select_mask) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1396, in get_related_selections + raise FieldError( +django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'surgical_cases'. Choices are: operating_room, primary_surgeon, created_by +ERROR 2025-09-04 03:11:49,716 basehttp 45064 6131118080 "GET /en/operating-theatre/blocks/ HTTP/1.1" 500 217411 +WARNING 2025-09-04 03:11:49,729 log 45064 6131118080 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:11:49,729 basehttp 45064 6131118080 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:12:13,329 autoreload 45064 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:12:13,697 autoreload 46016 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:12:14,591 basehttp 46016 6341865472 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 138849 +WARNING 2025-09-04 03:12:14,610 log 46016 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:12:14,610 basehttp 46016 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:12:14,672 basehttp 46016 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:12:17,469 basehttp 46016 6341865472 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:12:17,492 log 46016 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:12:17,493 basehttp 46016 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:12:17,547 basehttp 46016 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:13:03,235 basehttp 46016 6341865472 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:13:03,251 log 46016 6341865472 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:13:03,252 basehttp 46016 6341865472 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:13:03,326 basehttp 46016 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:13:44,284 autoreload 46016 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:13:44,600 autoreload 46719 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 03:13:45,750 log 46719 6169964544 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:13:45,750 basehttp 46719 6169964544 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:13:45,757 log 46719 6169964544 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:13:45,757 basehttp 46719 6169964544 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:13:46,551 log 46719 6169964544 Internal Server Error: /en/operating-theatre/blocks/33/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 580, in get_context_data + context['scheduled_cases'] = SurgicalCase.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'operating_room' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_note, updated_at +ERROR 2025-09-04 03:13:46,553 basehttp 46719 6169964544 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 500 142068 +WARNING 2025-09-04 03:13:46,565 log 46719 6169964544 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:13:46,565 basehttp 46719 6169964544 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:14:56,664 autoreload 46719 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:14:57,035 autoreload 47259 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:14:58,258 basehttp 47259 6122254336 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:14:58,272 log 47259 6122254336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:14:58,272 basehttp 47259 6122254336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:14:58,345 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:15:36,237 basehttp 47259 6122254336 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:15:36,251 log 47259 6122254336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:15:36,251 basehttp 47259 6122254336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:15:36,312 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:16:09,999 basehttp 47259 6122254336 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:16:10,017 log 47259 6122254336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:16:10,017 basehttp 47259 6122254336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:16:10,087 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:17:10,082 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:17:52,091 basehttp 47259 6122254336 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:17:52,110 log 47259 6122254336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:17:52,110 basehttp 47259 6122254336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:17:52,168 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:18:42,597 basehttp 47259 6122254336 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 32167 +WARNING 2025-09-04 03:18:42,612 log 47259 6122254336 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:18:42,613 basehttp 47259 6122254336 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:18:42,681 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:19:42,743 basehttp 47259 6122254336 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:19:43,030 autoreload 47259 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:19:43,396 autoreload 49350 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:19:44,268 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28437 +WARNING 2025-09-04 03:19:44,286 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:19:44,287 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:19:44,346 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:20:44,361 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:21:44,326 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:22:43,387 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28781 +WARNING 2025-09-04 03:22:43,404 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:22:43,404 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:22:43,469 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:23:34,485 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28797 +WARNING 2025-09-04 03:23:34,504 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:23:34,504 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:23:34,567 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:23:56,832 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28813 +WARNING 2025-09-04 03:23:56,847 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:23:56,847 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:23:56,901 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:24:56,913 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:25:56,905 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:26:19,968 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28848 +WARNING 2025-09-04 03:26:19,985 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:26:19,985 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:26:20,042 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:26:44,891 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28814 +WARNING 2025-09-04 03:26:44,910 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:26:44,910 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:26:44,965 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:27:21,191 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28785 +WARNING 2025-09-04 03:27:21,207 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:27:21,208 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:27:21,262 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:28:21,276 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:29:21,278 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:30:05,823 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28880 +WARNING 2025-09-04 03:30:05,838 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:30:05,838 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:30:05,894 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:30:36,901 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 28880 +WARNING 2025-09-04 03:30:36,915 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:30:36,915 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:30:36,990 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 03:31:10,319 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:31:10,320 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:31:12,441 basehttp 49350 6164066304 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28881 +WARNING 2025-09-04 03:31:12,458 log 49350 6164066304 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:31:12,458 basehttp 49350 6164066304 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:31:12,512 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:32:12,590 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:33:12,517 basehttp 49350 6164066304 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:33:20,431 autoreload 49350 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:33:21,429 autoreload 55456 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 03:33:22,691 log 55456 6190788608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:33:22,692 basehttp 55456 6190788608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:33:22,708 log 55456 6190788608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:33:22,708 basehttp 55456 6190788608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:33:25,150 basehttp 55456 6190788608 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28881 +WARNING 2025-09-04 03:33:25,164 log 55456 6190788608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:33:25,164 basehttp 55456 6190788608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:33:25,220 basehttp 55456 6190788608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:33:52,781 basehttp 55456 6190788608 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:33:52,792 log 55456 6190788608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:33:52,792 basehttp 55456 6190788608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:33:52,842 basehttp 55456 6190788608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:34:01,934 basehttp 55456 6190788608 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:34:01,951 log 55456 6190788608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:34:01,951 basehttp 55456 6190788608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:34:02,025 basehttp 55456 6190788608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:35:02,025 basehttp 55456 6190788608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:36:02,024 basehttp 55456 6190788608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:36:25,438 autoreload 55456 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:36:25,878 autoreload 56792 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 03:36:26,604 log 56792 6164410368 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:36:26,604 basehttp 56792 6164410368 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 03:36:26,615 log 56792 6164410368 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:36:26,615 basehttp 56792 6164410368 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:36:28,631 log 56792 6164410368 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 587, in get_context_data + scheduled_cases = context['scheduled_cases'] + ~~~~~~~^^^^^^^^^^^^^^^^^^^ +KeyError: 'scheduled_cases' +ERROR 2025-09-04 03:36:28,632 basehttp 56792 6164410368 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 86909 +WARNING 2025-09-04 03:36:28,646 log 56792 6164410368 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:36:28,646 basehttp 56792 6164410368 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:36:46,908 autoreload 56792 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:36:47,270 autoreload 56958 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:36:47,939 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:36:47,953 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:36:47,953 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:36:48,026 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:37:33,978 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:37:33,994 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:37:33,995 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:37:34,053 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:37:40,820 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:37:40,837 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:37:40,837 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:37:40,908 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:38:37,780 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 28886 +WARNING 2025-09-04 03:38:37,796 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:38:37,796 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:38:37,850 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 03:39:12,884 log 56958 6194475008 Internal Server Error: /en/operating-theatre/blocks/38/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'case_detail' not found. 'case_detail' is not a valid view function or pattern name. +ERROR 2025-09-04 03:39:12,886 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 500 189943 +WARNING 2025-09-04 03:39:12,899 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:39:12,899 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:39:56,748 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 31083 +WARNING 2025-09-04 03:39:56,763 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:39:56,764 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:39:56,821 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:40:56,835 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 03:41:21,133 basehttp 56958 6194475008 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 31087 +WARNING 2025-09-04 03:41:21,152 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:41:21,152 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:41:21,209 basehttp 56958 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 03:41:28,717 log 56958 6194475008 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 112, in get + self.object = self.get_object() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 31, in get_object + queryset = self.get_queryset() + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 752, in get_queryset + return SurgicalCase.objects.filter(tenant=self.request.user.tenant) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_note, updated_at +ERROR 2025-09-04 03:41:28,719 basehttp 56958 6194475008 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 142750 +WARNING 2025-09-04 03:41:28,737 log 56958 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:41:28,738 basehttp 56958 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:41:51,401 autoreload 56958 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:41:51,770 autoreload 59245 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:41:52,284 log 59245 6165770240 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 112, in get + self.object = self.get_object() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 31, in get_object + queryset = self.get_queryset() + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 752, in get_queryset + return SurgicalCase.objects.filter(or_block__tenant=self.request.user.tenant) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1563, in build_filter + self.check_related_objects(join_info.final_field, value, join_info.opts) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1372, in check_related_objects + self.check_query_object_type(value, opts, field) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1349, in check_query_object_type + raise ValueError( +ValueError: Cannot query "King Faisal Specialist Hospital - Abha": Must be "ORBlock" instance. +ERROR 2025-09-04 03:41:52,286 basehttp 59245 6165770240 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 140014 +WARNING 2025-09-04 03:41:52,299 log 59245 6165770240 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:41:52,299 basehttp 59245 6165770240 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:42:40,689 autoreload 59245 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:42:41,061 autoreload 59644 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 03:43:11,157 autoreload 59644 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:43:11,504 autoreload 59880 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:43:12,056 log 59880 6127808512 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_notes.all().order_by('-created_at') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'surgical_notes'. Did you mean: 'surgical_note'? +ERROR 2025-09-04 03:43:12,059 basehttp 59880 6127808512 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86909 +WARNING 2025-09-04 03:43:12,074 log 59880 6127808512 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:43:12,074 basehttp 59880 6127808512 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:43:34,537 autoreload 59880 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:43:34,850 autoreload 60046 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:43:35,160 log 60046 6159052800 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.notes.all().order_by('-created_at') + ^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'notes' +ERROR 2025-09-04 03:43:35,161 basehttp 60046 6159052800 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86837 +WARNING 2025-09-04 03:43:35,176 log 60046 6159052800 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:43:35,177 basehttp 60046 6159052800 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:44:48,753 autoreload 60046 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:44:49,112 autoreload 60592 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:44:49,642 log 60592 6194278400 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_note.all().order_by('-created_at') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalNote' object has no attribute 'all' +ERROR 2025-09-04 03:44:49,643 basehttp 60592 6194278400 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86869 +WARNING 2025-09-04 03:44:49,658 log 60592 6194278400 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:44:49,659 basehttp 60592 6194278400 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:45:14,162 autoreload 60592 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:45:14,535 autoreload 60757 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:45:15,157 log 60757 6123122688 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_note.all.order_by('-created_at') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalNote' object has no attribute 'all' +ERROR 2025-09-04 03:45:15,158 basehttp 60757 6123122688 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86865 +WARNING 2025-09-04 03:45:15,173 log 60757 6123122688 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:45:15,173 basehttp 60757 6123122688 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:45:16,297 log 60757 6123122688 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_note.all.order_by('-created_at') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalNote' object has no attribute 'all' +ERROR 2025-09-04 03:45:16,297 basehttp 60757 6123122688 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86865 +WARNING 2025-09-04 03:45:16,314 log 60757 6123122688 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:45:16,314 basehttp 60757 6123122688 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:45:49,982 autoreload 60757 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:45:50,335 autoreload 61068 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:45:50,707 log 61068 6204911616 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_case_notes.all() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'surgical_case_notes' +ERROR 2025-09-04 03:45:50,710 basehttp 61068 6204911616 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86881 +WARNING 2025-09-04 03:45:50,723 log 61068 6204911616 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:45:50,723 basehttp 61068 6204911616 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:46:40,324 autoreload 61068 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/models.py changed, reloading. +INFO 2025-09-04 03:46:40,653 autoreload 61459 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:46:43,357 log 61459 6200651776 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 759, in get_context_data + context['surgical_notes'] = surgical_case.surgical_notes.all() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalNote' object has no attribute 'all' +ERROR 2025-09-04 03:46:43,358 basehttp 61459 6200651776 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 86805 +WARNING 2025-09-04 03:46:43,373 log 61459 6200651776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:46:43,373 basehttp 61459 6200651776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:46:52,348 autoreload 61459 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:46:52,680 autoreload 61552 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:46:53,922 log 61552 6205091840 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 762, in get_context_data + context['equipment_usage'] = EquipmentUsage.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: created_at, end_time, equipment_name, equipment_type, expiration_date, id, lot_number, manufacturer, model, notes, quantity_used, recorded_by, recorded_by_id, serial_number, start_time, sterilization_date, surgical_case, surgical_case_id, total_cost, unit_cost, unit_of_measure, updated_at, usage_id +ERROR 2025-09-04 03:46:53,924 basehttp 61552 6205091840 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 139960 +WARNING 2025-09-04 03:46:53,944 log 61552 6205091840 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:46:53,945 basehttp 61552 6205091840 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:46:54,703 log 61552 6205091840 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 762, in get_context_data + context['equipment_usage'] = EquipmentUsage.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: created_at, end_time, equipment_name, equipment_type, expiration_date, id, lot_number, manufacturer, model, notes, quantity_used, recorded_by, recorded_by_id, serial_number, start_time, sterilization_date, surgical_case, surgical_case_id, total_cost, unit_cost, unit_of_measure, updated_at, usage_id +ERROR 2025-09-04 03:46:54,704 basehttp 61552 6205091840 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 139960 +WARNING 2025-09-04 03:46:54,720 log 61552 6205091840 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:46:54,720 basehttp 61552 6205091840 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:48:47,606 autoreload 61552 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:48:47,949 autoreload 62412 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:48:48,863 log 62412 6163083264 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 768, in get_context_data + if surgical_case.actual_start_time and surgical_case.actual_end_time: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'actual_start_time'. Did you mean: 'actual_start'? +ERROR 2025-09-04 03:48:48,867 basehttp 62412 6163083264 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 87192 +WARNING 2025-09-04 03:48:48,879 log 62412 6163083264 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:48:48,879 basehttp 62412 6163083264 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:48:49,796 log 62412 6163083264 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 768, in get_context_data + if surgical_case.actual_start_time and surgical_case.actual_end_time: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'SurgicalCase' object has no attribute 'actual_start_time'. Did you mean: 'actual_start'? +ERROR 2025-09-04 03:48:49,799 basehttp 62412 6163083264 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 87192 +WARNING 2025-09-04 03:48:49,814 log 62412 6163083264 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:48:49,814 basehttp 62412 6163083264 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:49:19,199 autoreload 62412 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 03:49:19,563 autoreload 62649 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 03:49:20,314 log 62649 6131920896 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_case_start' not found. 'surgical_case_start' is not a valid view function or pattern name. +ERROR 2025-09-04 03:49:20,316 basehttp 62649 6131920896 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 178456 +WARNING 2025-09-04 03:49:20,330 log 62649 6131920896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:49:20,330 basehttp 62649 6131920896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:50:09,246 log 62649 6131920896 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_case_complete' not found. 'surgical_case_complete' is not a valid view function or pattern name. +ERROR 2025-09-04 03:50:09,248 basehttp 62649 6131920896 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 178744 +WARNING 2025-09-04 03:50:09,260 log 62649 6131920896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:50:09,260 basehttp 62649 6131920896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:50:26,440 log 62649 6131920896 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_case_cancel' not found. 'surgical_case_cancel' is not a valid view function or pattern name. +ERROR 2025-09-04 03:50:26,441 basehttp 62649 6131920896 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 178571 +WARNING 2025-09-04 03:50:26,453 log 62649 6131920896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:50:26,454 basehttp 62649 6131920896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 03:51:01,949 log 62649 6131920896 Internal Server Error: /en/operating-theatre/cases/36/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'surgical_case_export' not found. 'surgical_case_export' is not a valid view function or pattern name. +ERROR 2025-09-04 03:51:01,950 basehttp 62649 6131920896 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 500 179204 +WARNING 2025-09-04 03:51:01,963 log 62649 6131920896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:51:01,963 basehttp 62649 6131920896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:51:12,549 basehttp 62649 6131920896 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 200 31984 +WARNING 2025-09-04 03:51:12,565 basehttp 62649 6148747264 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 03:51:12,569 log 62649 6131920896 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 03:51:12,569 basehttp 62649 6131920896 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 03:51:12,635 basehttp 62649 6131920896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:02:11,434 autoreload 94389 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 06:02:15,650 basehttp 94389 6131380224 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 200 31984 +WARNING 2025-09-04 06:02:15,661 basehttp 94389 6131380224 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 06:02:15,749 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 06:02:16,046 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:02:16,046 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:03:15,748 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 06:03:50,313 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:03:50,313 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 06:03:56,011 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:03:56,011 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:03:58,012 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31116 +WARNING 2025-09-04 06:03:58,032 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:03:58,033 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:03:58,088 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:04:58,099 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:05:12,835 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31116 +WARNING 2025-09-04 06:05:12,845 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:05:12,845 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:05:12,914 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:05:28,540 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31117 +WARNING 2025-09-04 06:05:28,556 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:05:28,557 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:05:28,615 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:05:59,789 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31116 +WARNING 2025-09-04 06:05:59,801 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:05:59,801 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:05:59,866 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:06:49,969 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31117 +WARNING 2025-09-04 06:06:49,980 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:06:49,980 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:06:50,035 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:07:00,302 basehttp 94389 6148206592 "GET /en/operating-theatre/cases/38/ HTTP/1.1" 200 31980 +WARNING 2025-09-04 06:07:00,317 basehttp 94389 6131380224 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 06:07:00,320 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:07:00,320 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:07:00,358 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 06:07:02,817 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:07:02,817 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 06:07:02,829 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:07:02,829 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:07:50,408 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:08:51,407 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:09:52,418 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:10:52,427 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:11:40,698 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31295 +WARNING 2025-09-04 06:11:40,715 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:11:40,715 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:11:40,781 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:12:12,081 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31259 +WARNING 2025-09-04 06:12:12,095 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:12:12,096 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:12:12,153 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:13:12,158 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:13:58,142 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31728 +WARNING 2025-09-04 06:13:58,155 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:13:58,155 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:13:58,211 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:14:56,142 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31721 +WARNING 2025-09-04 06:14:56,156 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:14:56,156 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:14:56,212 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:15:36,344 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31217 +WARNING 2025-09-04 06:15:36,356 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:15:36,356 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:15:36,411 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:15:55,198 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31212 +WARNING 2025-09-04 06:15:55,210 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:15:55,210 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:15:55,265 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:16:55,280 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:17:55,294 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:18:16,018 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31139 +WARNING 2025-09-04 06:18:16,032 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:18:16,032 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:18:16,105 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:19:16,422 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:20:17,445 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:21:18,437 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:22:19,438 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:23:07,606 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31642 +WARNING 2025-09-04 06:23:07,620 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:23:07,620 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:23:07,718 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:23:34,104 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31652 +WARNING 2025-09-04 06:23:34,116 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:23:34,116 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:23:34,218 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:24:34,226 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:24:51,222 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31712 +WARNING 2025-09-04 06:24:51,236 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:24:51,236 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:24:51,289 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:25:29,216 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31727 +WARNING 2025-09-04 06:25:29,228 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:25:29,228 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:25:29,279 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:25:40,018 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31725 +WARNING 2025-09-04 06:25:40,029 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:25:40,029 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:25:40,083 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:25:49,752 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31728 +WARNING 2025-09-04 06:25:49,761 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:25:49,761 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:25:49,813 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:25:59,783 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31728 +WARNING 2025-09-04 06:25:59,795 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:25:59,795 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:25:59,867 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:27:00,435 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:27:41,456 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31724 +WARNING 2025-09-04 06:27:41,465 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:27:41,466 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:27:41,532 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:28:42,437 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:29:43,445 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:30:43,512 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:31:06,809 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31729 +WARNING 2025-09-04 06:31:06,820 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:31:06,820 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:31:06,888 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:31:15,099 basehttp 94389 6148206592 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31725 +WARNING 2025-09-04 06:31:15,109 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:31:15,109 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:31:15,161 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:32:03,531 basehttp 94389 6131380224 "GET /en/operating-theatre/cases/38/ HTTP/1.1" 200 31980 +WARNING 2025-09-04 06:32:03,543 basehttp 94389 6148206592 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 06:32:03,547 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:32:03,547 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:32:03,614 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:33:03,588 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:34:03,579 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:35:03,582 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:36:03,601 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:36:22,561 basehttp 94389 6131380224 "GET /en/operating-theatre/cases/38/ HTTP/1.1" 200 31980 +WARNING 2025-09-04 06:36:22,570 basehttp 94389 6131380224 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 06:36:22,575 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:36:22,575 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:36:22,615 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:36:24,801 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 06:36:24,802 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:36:24,802 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 06:36:24,810 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:36:24,810 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:36:26,066 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 31895 +WARNING 2025-09-04 06:36:26,081 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:36:26,081 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:36:26,143 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:37:26,150 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:38:26,149 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:39:26,155 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:39:39,859 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32557 +WARNING 2025-09-04 06:39:39,873 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:39:39,874 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:39:39,932 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:40:19,727 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32572 +WARNING 2025-09-04 06:40:19,742 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:40:19,742 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:40:19,806 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:40:59,533 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32582 +WARNING 2025-09-04 06:40:59,548 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:40:59,548 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:40:59,621 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:41:30,951 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32546 +WARNING 2025-09-04 06:41:30,969 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:41:30,969 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:41:31,041 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:42:31,032 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:42:32,228 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32769 +WARNING 2025-09-04 06:42:32,242 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:42:32,242 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:42:32,301 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:43:22,252 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 33001 +WARNING 2025-09-04 06:43:22,263 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:43:22,264 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:43:22,317 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:43:51,375 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32760 +WARNING 2025-09-04 06:43:51,389 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:43:51,389 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:43:51,449 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:44:51,464 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:45:41,015 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32760 +WARNING 2025-09-04 06:45:41,029 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:45:41,030 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:45:41,098 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:46:41,098 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:47:15,314 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32771 +WARNING 2025-09-04 06:47:15,331 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:47:15,331 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:47:15,390 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:47:42,479 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32793 +WARNING 2025-09-04 06:47:42,491 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:47:42,491 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:47:42,542 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:47:52,362 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32786 +WARNING 2025-09-04 06:47:52,373 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:47:52,373 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:47:52,426 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:48:52,431 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:49:06,540 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32808 +WARNING 2025-09-04 06:49:06,552 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:49:06,552 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:49:06,622 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:49:42,140 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32824 +WARNING 2025-09-04 06:49:42,150 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:49:42,151 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:49:42,202 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:49:58,067 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32824 +WARNING 2025-09-04 06:49:58,080 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:49:58,080 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:49:58,157 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:50:53,930 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32824 +WARNING 2025-09-04 06:50:53,945 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:50:53,945 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:50:54,002 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:51:54,015 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:52:27,376 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32826 +WARNING 2025-09-04 06:52:27,393 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:52:27,393 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:52:27,468 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:53:27,468 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:54:09,938 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32892 +WARNING 2025-09-04 06:54:09,952 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:54:09,952 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:54:10,010 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:54:39,354 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32878 +WARNING 2025-09-04 06:54:39,367 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:54:39,367 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:54:39,443 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:54:52,521 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32881 +WARNING 2025-09-04 06:54:52,535 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:54:52,535 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:54:52,594 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:55:12,738 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32886 +WARNING 2025-09-04 06:55:12,754 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:55:12,754 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:55:12,812 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:55:39,664 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32897 +WARNING 2025-09-04 06:55:39,683 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:55:39,683 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:55:39,741 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:56:39,744 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:56:47,930 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32892 +WARNING 2025-09-04 06:56:47,946 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:56:47,946 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:56:48,019 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:07,840 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/36/ HTTP/1.1" 200 32889 +WARNING 2025-09-04 06:57:07,850 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:07,850 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:07,903 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:37,401 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 138849 +WARNING 2025-09-04 06:57:37,413 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:37,413 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:37,488 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:39,512 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 138849 +WARNING 2025-09-04 06:57:39,528 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:39,528 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:39,585 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:42,637 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/?date= HTTP/1.1" 200 138861 +WARNING 2025-09-04 06:57:42,656 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:42,657 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:42,716 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:45,372 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/?date=2025-09-03 HTTP/1.1" 200 138881 +WARNING 2025-09-04 06:57:45,391 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:45,391 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:45,453 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:46,118 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/?date= HTTP/1.1" 200 138861 +WARNING 2025-09-04 06:57:46,139 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:46,139 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:46,193 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:48,815 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/?date=2025-09-05 HTTP/1.1" 200 138881 +WARNING 2025-09-04 06:57:48,836 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:48,836 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:48,895 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:57:58,778 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/?page=2&date=2025-09-05 HTTP/1.1" 200 95252 +WARNING 2025-09-04 06:57:58,827 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:57:58,827 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:57:58,856 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:58:00,940 basehttp 94389 6131380224 "GET /en/operating-theatre/blocks/12/ HTTP/1.1" 200 32878 +WARNING 2025-09-04 06:58:00,961 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 06:58:00,961 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 06:58:01,021 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 06:59:06,189 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:01:22,965 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:02:23,968 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:03:24,970 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:06:02,392 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:08:16,815 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:09:40,460 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:11:01,456 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:14:26,875 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:25:05,974 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:34:06,312 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:39:19,956 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:41:19,939 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:43:19,948 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:45:19,961 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:47:19,952 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:50:59,726 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:51:12,194 basehttp 94389 6131380224 "GET /en/operating-theatre/ HTTP/1.1" 200 49202 +WARNING 2025-09-04 07:51:12,214 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:51:12,214 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:51:12,315 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:51:12,319 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:51:42,315 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:52:12,337 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:52:12,339 basehttp 94389 6131380224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:52:42,328 basehttp 94389 6131380224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:53:12,345 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:53:12,347 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:53:42,326 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:54:10,009 basehttp 94389 6148206592 "GET /en/operating-theatre/ HTTP/1.1" 200 49003 +WARNING 2025-09-04 07:54:10,019 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:54:10,019 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:54:10,114 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:54:10,115 basehttp 94389 6131380224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:54:25,437 basehttp 94389 6131380224 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 62154 +WARNING 2025-09-04 07:54:25,453 log 94389 6131380224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:54:25,454 basehttp 94389 6131380224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:54:25,528 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:54:25,530 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +WARNING 2025-09-04 07:54:27,846 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:54:27,846 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 07:54:27,858 log 94389 6148206592 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:54:27,858 basehttp 94389 6148206592 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:54:40,107 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:55:10,109 basehttp 94389 6148206592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:55:10,112 basehttp 94389 6131380224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:55:40,112 basehttp 94389 6131380224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:56:10,112 basehttp 94389 6131380224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 07:56:10,115 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:56:40,126 basehttp 94389 6148206592 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 07:57:06,338 autoreload 94389 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 07:57:06,851 autoreload 33595 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 07:57:07,345 log 33595 6196916224 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2049, in resolve_ref + join_info = self.setup_joins( + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'or_block' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 07:57:07,347 basehttp 33595 6196916224 "GET /en/operating-theatre/ HTTP/1.1" 500 143744 +WARNING 2025-09-04 07:57:07,364 log 33595 6196916224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:57:07,364 basehttp 33595 6196916224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:58:03,112 autoreload 33595 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 07:58:03,492 autoreload 34009 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 07:58:04,185 log 34009 6171275264 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2049, in resolve_ref + join_info = self.setup_joins( + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 07:58:04,187 basehttp 34009 6171275264 "GET /en/operating-theatre/ HTTP/1.1" 500 142949 +WARNING 2025-09-04 07:58:04,199 log 34009 6171275264 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:58:04,199 basehttp 34009 6171275264 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 07:58:57,632 autoreload 34009 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 07:58:57,977 autoreload 34483 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 07:58:58,281 log 34483 6189674496 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query_utils.py", line 91, in resolve_expression + clause, joins = query._add_q( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 07:58:58,283 basehttp 34483 6189674496 "GET /en/operating-theatre/ HTTP/1.1" 500 150279 +WARNING 2025-09-04 07:58:58,298 log 34483 6189674496 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:58:58,298 basehttp 34483 6189674496 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 07:58:59,943 log 34483 6189674496 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query_utils.py", line 91, in resolve_expression + clause, joins = query._add_q( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 07:58:59,944 basehttp 34483 6189674496 "GET /en/operating-theatre/ HTTP/1.1" 500 150279 +WARNING 2025-09-04 07:58:59,957 log 34483 6189674496 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 07:58:59,957 basehttp 34483 6189674496 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:03:34,789 autoreload 34483 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:03:35,175 autoreload 36503 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:03:35,838 log 36503 6137884672 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2049, in resolve_ref + join_info = self.setup_joins( + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'or_block' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 08:03:35,840 basehttp 36503 6137884672 "GET /en/operating-theatre/ HTTP/1.1" 500 143992 +WARNING 2025-09-04 08:03:35,854 log 36503 6137884672 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:03:35,854 basehttp 36503 6137884672 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:03:43,726 autoreload 36503 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:03:44,071 autoreload 36596 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:03:44,817 log 36596 6127579136 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1923, in transform + return self.try_transform(wrapped, name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1458, in try_transform + raise FieldError( +django.core.exceptions.FieldError: Unsupported lookup 'surgical_cases' for BigAutoField or join on the field not permitted. + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2065, in resolve_ref + transform = join_info.transform_function(targets[0], final_alias) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1927, in transform + raise last_field_exception + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 08:03:44,819 basehttp 36596 6127579136 "GET /en/operating-theatre/ HTTP/1.1" 500 170505 +WARNING 2025-09-04 08:03:44,835 log 36596 6127579136 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:03:44,835 basehttp 36596 6127579136 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:04:13,300 autoreload 36596 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:04:13,636 autoreload 36836 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:04:13,959 log 36836 6166343680 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1923, in transform + return self.try_transform(wrapped, name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1458, in try_transform + raise FieldError( +django.core.exceptions.FieldError: Unsupported lookup 'surgical_cases' for BigAutoField or join on the field not permitted. + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2065, in resolve_ref + transform = join_info.transform_function(targets[0], final_alias) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1927, in transform + raise last_field_exception + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 08:04:13,961 basehttp 36836 6166343680 "GET /en/operating-theatre/ HTTP/1.1" 500 170775 +WARNING 2025-09-04 08:04:13,974 log 36836 6166343680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:04:13,974 basehttp 36836 6166343680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 08:04:15,190 log 36836 6166343680 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1923, in transform + return self.try_transform(wrapped, name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1458, in try_transform + raise FieldError( +django.core.exceptions.FieldError: Unsupported lookup 'surgical_cases' for BigAutoField or join on the field not permitted. + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 120, in get_context_data + ).annotate( + ^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1649, in annotate + return self._annotate(args, kwargs, select=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1701, in _annotate + clone.query.add_annotation( + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1218, in add_annotation + annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 176, in resolve_expression + result = super().resolve_expression(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/aggregates.py", line 63, in resolve_expression + c = super().resolve_expression(query, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 300, in resolve_expression + expr.resolve_expression(query, allow_joins, reuse, summarize, for_save) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/expressions.py", line 902, in resolve_expression + return query.resolve_ref(self.name, allow_joins, reuse, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2065, in resolve_ref + transform = join_info.transform_function(targets[0], final_alias) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1927, in transform + raise last_field_exception + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1900, in setup_joins + path, final_field, targets, rest = self.names_to_path( + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'surgical_cases' into field. Choices are: accepts_emergency, air_changes_per_hour, building, ceiling_height, cleaning_time, created_at, created_by, created_by_id, equipment_list, floor_number, has_c_arm, has_ct, has_mri, has_neuromonitoring, has_ultrasound, humidity_max, humidity_min, id, is_active, max_case_duration, or_blocks, positive_pressure, required_nurses, required_techs, room_id, room_name, room_number, room_size, room_type, special_features, status, supports_laparoscopic, supports_laser, supports_microscopy, supports_robotic, temperature_max, temperature_min, tenant, tenant_id, turnover_time, updated_at, wing +ERROR 2025-09-04 08:04:15,192 basehttp 36836 6166343680 "GET /en/operating-theatre/ HTTP/1.1" 500 170775 +WARNING 2025-09-04 08:04:15,204 log 36836 6166343680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:04:15,205 basehttp 36836 6166343680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:06:14,507 autoreload 36836 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:06:14,845 autoreload 37704 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:06:17,286 basehttp 37704 6196293632 "GET /en/operating-theatre/ HTTP/1.1" 200 73125 +WARNING 2025-09-04 08:06:17,306 log 37704 6196293632 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:06:17,306 basehttp 37704 6196293632 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:06:17,373 basehttp 37704 6196293632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:06:17,377 basehttp 37704 6213120000 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 08:06:33,087 basehttp 37704 6213120000 "GET /en/operating-theatre/cases/1/ HTTP/1.1" 200 32155 +WARNING 2025-09-04 08:06:33,102 basehttp 37704 6196293632 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:06:33,107 log 37704 6213120000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:06:33,107 basehttp 37704 6213120000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:06:33,159 basehttp 37704 6213120000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:06:37,581 log 37704 6213120000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:06:37,581 basehttp 37704 6213120000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:06:37,595 log 37704 6213120000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:06:37,595 basehttp 37704 6213120000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:06:47,377 basehttp 37704 6213120000 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 08:07:17,370 basehttp 37704 6213120000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:07:17,374 basehttp 37704 6196293632 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 08:07:47,373 basehttp 37704 6196293632 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 08:07:47,485 basehttp 37704 6196293632 "GET /en/operating-theatre/ HTTP/1.1" 200 73106 +WARNING 2025-09-04 08:07:47,496 log 37704 6196293632 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:07:47,496 basehttp 37704 6196293632 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:07:47,558 basehttp 37704 6196293632 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:07:47,567 basehttp 37704 6213120000 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +ERROR 2025-09-04 08:08:00,791 log 37704 6213120000 Internal Server Error: /en/operating-theatre/rooms/55/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 207, in get_context_data + context['todays_cases'] = operating_room.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'OperatingRoom' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:08:00,793 basehttp 37704 6213120000 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 500 86937 +WARNING 2025-09-04 08:08:00,807 log 37704 6213120000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:08:00,807 basehttp 37704 6213120000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:08:41,230 autoreload 37704 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:08:41,552 autoreload 38805 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:08:42,706 log 38805 6158233600 Internal Server Error: /en/operating-theatre/rooms/55/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 207, in get_context_data + context['todays_cases'] = operating_room.or_blocks.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'RelatedManager' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:08:42,709 basehttp 38805 6158233600 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 500 87118 +WARNING 2025-09-04 08:08:42,723 log 38805 6158233600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:08:42,723 basehttp 38805 6158233600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 08:08:43,566 log 38805 6158233600 Internal Server Error: /en/operating-theatre/rooms/55/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 113, in get + context = self.get_context_data(object=self.object) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 207, in get_context_data + context['todays_cases'] = operating_room.or_blocks.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'RelatedManager' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:08:43,568 basehttp 38805 6158233600 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 500 87118 +WARNING 2025-09-04 08:08:43,583 log 38805 6158233600 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:08:43,583 basehttp 38805 6158233600 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:09:35,682 autoreload 38805 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:09:36,002 autoreload 39202 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:10:08,520 autoreload 39202 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:10:08,845 autoreload 39437 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:10:09,855 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 42721 +WARNING 2025-09-04 08:10:09,875 log 39437 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:10:09,875 basehttp 39437 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:10:09,948 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:11:09,967 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:12:09,959 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:13:10,006 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:14:09,969 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:14:26,461 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 40248 +WARNING 2025-09-04 08:14:26,477 log 39437 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:14:26,477 basehttp 39437 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:14:26,548 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:15:05,352 basehttp 39437 6194475008 "POST /en/operating-theatre/rooms/55/update-status/ HTTP/1.1" 302 0 +INFO 2025-09-04 08:15:05,367 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 40248 +INFO 2025-09-04 08:15:26,548 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:16:24,756 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 40490 +WARNING 2025-09-04 08:16:24,769 log 39437 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:16:24,769 basehttp 39437 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:16:24,819 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:17:24,833 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:18:24,826 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:19:24,833 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:19:51,030 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 41700 +WARNING 2025-09-04 08:19:51,047 log 39437 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:19:51,047 basehttp 39437 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:19:51,113 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:20:01,738 basehttp 39437 6194475008 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 49286 +WARNING 2025-09-04 08:20:01,756 log 39437 6194475008 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:20:01,756 basehttp 39437 6194475008 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:20:01,813 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:21:01,829 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:22:01,827 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:23:01,827 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:24:01,843 basehttp 39437 6194475008 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:24:51,885 autoreload 39437 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:24:52,248 autoreload 45949 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:25:01,902 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:26:01,851 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:27:01,857 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:27:33,642 basehttp 45949 6123352064 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 43298 +WARNING 2025-09-04 08:27:33,657 log 45949 6123352064 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:27:33,657 basehttp 45949 6123352064 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:27:33,708 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:28:33,726 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:29:33,726 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:30:22,429 basehttp 45949 6123352064 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 33328 +WARNING 2025-09-04 08:30:22,445 log 45949 6123352064 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:30:22,445 basehttp 45949 6123352064 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:30:22,486 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:31:22,500 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:32:22,492 basehttp 45949 6123352064 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:32:32,780 autoreload 45949 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:32:33,156 autoreload 49377 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:33:08,644 autoreload 49377 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/forms.py changed, reloading. +INFO 2025-09-04 08:33:08,990 autoreload 49618 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:33:09,669 basehttp 49618 6162067456 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 43307 +WARNING 2025-09-04 08:33:09,686 log 49618 6162067456 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:33:09,686 basehttp 49618 6162067456 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:33:09,751 basehttp 49618 6162067456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:33:16,711 basehttp 49618 6162067456 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 43307 +INFO 2025-09-04 08:33:16,724 basehttp 49618 13052751872 "GET /static/css/custom.css HTTP/1.1" 200 2063 +WARNING 2025-09-04 08:33:16,726 log 49618 13069578240 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:33:16,727 basehttp 49618 13069578240 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:33:16,734 basehttp 49618 13052751872 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-04 08:33:16,734 basehttp 49618 6162067456 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-04 08:33:16,735 basehttp 49618 13069578240 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-04 08:33:16,740 basehttp 49618 13103230976 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-04 08:33:16,741 basehttp 49618 13035925504 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-04 08:33:16,742 basehttp 49618 13086404608 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-04 08:33:16,746 basehttp 49618 6162067456 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-04 08:33:16,753 basehttp 49618 13052751872 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-04 08:33:16,862 basehttp 49618 13052751872 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-04 08:33:16,924 basehttp 49618 13052751872 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-04 08:33:16,925 basehttp 49618 13086404608 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-04 08:33:16,925 basehttp 49618 13035925504 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-04 08:33:16,925 basehttp 49618 13103230976 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-04 08:33:16,926 basehttp 49618 6162067456 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-04 08:33:16,930 basehttp 49618 13103230976 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-04 08:33:16,932 basehttp 49618 13052751872 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-04 08:33:16,932 basehttp 49618 13069578240 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-04 08:33:16,932 basehttp 49618 13035925504 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-04 08:33:16,933 basehttp 49618 13086404608 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-04 08:33:16,934 basehttp 49618 13052751872 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-04 08:33:16,934 basehttp 49618 13035925504 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-04 08:33:16,934 basehttp 49618 13069578240 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-04 08:33:16,934 basehttp 49618 13086404608 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-04 08:33:16,935 basehttp 49618 13052751872 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-04 08:33:16,936 basehttp 49618 13052751872 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-04 08:33:16,938 basehttp 49618 6162067456 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-04 08:33:16,941 basehttp 49618 13052751872 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-04 08:33:16,942 basehttp 49618 13103230976 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:33:16,942 basehttp 49618 13035925504 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-04 08:33:16,943 basehttp 49618 13069578240 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-04 08:33:16,943 basehttp 49618 6162067456 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-04 08:33:16,943 basehttp 49618 13086404608 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-04 08:33:16,943 basehttp 49618 13052751872 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +WARNING 2025-09-04 08:33:17,082 log 49618 13052751872 Not Found: /favicon.ico +WARNING 2025-09-04 08:33:17,082 basehttp 49618 13052751872 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-04 08:34:16,945 basehttp 49618 13052751872 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:35:16,949 basehttp 49618 13052751872 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:35:32,489 autoreload 49618 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/forms.py changed, reloading. +INFO 2025-09-04 08:35:32,872 autoreload 50722 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:36:16,987 basehttp 50722 6132969472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:36:26,999 autoreload 50722 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:36:27,361 autoreload 51132 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:36:45,238 autoreload 51132 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/forms.py changed, reloading. +INFO 2025-09-04 08:36:45,560 autoreload 51293 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 08:36:46,826 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:36:46,826 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:36:46,849 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:36:46,850 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:36:48,491 basehttp 51293 12918534144 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 47164 +WARNING 2025-09-04 08:36:48,509 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:36:48,509 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:36:48,596 basehttp 51293 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:37:18,356 basehttp 51293 12918534144 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 42073 +WARNING 2025-09-04 08:37:18,373 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:37:18,373 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:37:29,682 basehttp 51293 12918534144 "GET /en/operating-theatre/ HTTP/1.1" 200 73106 +WARNING 2025-09-04 08:37:29,697 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:37:29,698 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:37:29,760 basehttp 51293 12918534144 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 08:37:33,224 basehttp 51293 12918534144 "GET /en/operating-theatre/cases/1/ HTTP/1.1" 200 32155 +WARNING 2025-09-04 08:37:33,236 basehttp 51293 12935360512 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:37:33,240 log 51293 12918534144 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:37:33,241 basehttp 51293 12918534144 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:37:33,292 basehttp 51293 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:38:33,305 basehttp 51293 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:39:33,306 basehttp 51293 12918534144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:40:01,173 autoreload 51293 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:40:01,515 autoreload 52766 8466948288 Watching for file changes with StatReloader +WARNING 2025-09-04 08:40:02,607 basehttp 52766 6139392000 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:40:02,609 log 52766 6122565632 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:40:02,610 basehttp 52766 6122565632 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:40:02,620 log 52766 6122565632 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:40:02,620 basehttp 52766 6122565632 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:40:04,118 basehttp 52766 6122565632 "GET /en/operating-theatre/cases/1/ HTTP/1.1" 200 32155 +WARNING 2025-09-04 08:40:04,132 basehttp 52766 6122565632 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:40:04,136 log 52766 6139392000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:40:04,136 basehttp 52766 6139392000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:40:04,180 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:40:59,307 log 52766 6122565632 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:40:59,308 basehttp 52766 6122565632 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:40:59,308 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:40:59,315 log 52766 6139392000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:40:59,315 basehttp 52766 6139392000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:41:01,531 basehttp 52766 6139392000 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 73908 +WARNING 2025-09-04 08:41:01,547 log 52766 6139392000 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:41:01,547 basehttp 52766 6139392000 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:41:01,608 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:42:01,612 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:43:01,637 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:44:01,632 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:45:01,634 basehttp 52766 6139392000 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:46:00,431 autoreload 52766 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:46:00,899 autoreload 55378 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:46:01,677 basehttp 55378 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:47:01,666 basehttp 55378 6341865472 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:47:12,586 autoreload 55378 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:47:12,936 autoreload 55921 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:47:36,824 autoreload 55921 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:47:37,130 autoreload 56099 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:48:03,188 autoreload 56099 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 08:48:03,516 autoreload 56343 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:48:26,523 autoreload 56343 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 08:48:26,840 autoreload 56506 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:48:50,023 log 56506 6203076608 Internal Server Error: /en/operating-theatre/cases/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'start_case' with arguments '(39,)' not found. 1 pattern(s) tried: ['en/operating\\-theatre/cases/(?P[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/start/\\Z'] +ERROR 2025-09-04 08:48:50,025 basehttp 56506 6203076608 "GET /en/operating-theatre/cases/ HTTP/1.1" 500 260632 +WARNING 2025-09-04 08:48:50,044 log 56506 6203076608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:48:50,044 basehttp 56506 6203076608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:49:22,079 autoreload 56506 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 08:49:22,411 autoreload 56904 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:49:24,346 basehttp 56904 6167031808 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 72955 +WARNING 2025-09-04 08:49:24,362 log 56904 6167031808 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:49:24,363 basehttp 56904 6167031808 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:49:24,399 basehttp 56904 6167031808 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:49:30,120 basehttp 56904 6167031808 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 72955 +INFO 2025-09-04 08:49:30,140 basehttp 56904 6200684544 "GET /static/css/custom.css HTTP/1.1" 200 2063 +WARNING 2025-09-04 08:49:30,143 log 56904 6217510912 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:49:30,143 basehttp 56904 6217510912 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:49:30,148 basehttp 56904 6167031808 "GET /static/css/vendor.min.css HTTP/1.1" 200 177466 +INFO 2025-09-04 08:49:30,151 basehttp 56904 6251163648 "GET /static/plugins/chart.js/dist/chart.js HTTP/1.1" 200 403805 +INFO 2025-09-04 08:49:30,152 basehttp 56904 6200684544 "GET /static/js/htmx.min.js HTTP/1.1" 200 50917 +INFO 2025-09-04 08:49:30,153 basehttp 56904 6183858176 "GET /static/css/default/app.min.css HTTP/1.1" 200 893480 +INFO 2025-09-04 08:49:30,153 basehttp 56904 6217510912 "GET /static/img/user/user-4.jpg HTTP/1.1" 200 5916 +INFO 2025-09-04 08:49:30,154 basehttp 56904 6234337280 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-09-04 08:49:30,161 basehttp 56904 6251163648 "GET /static/js/app.min.js HTTP/1.1" 200 110394 +INFO 2025-09-04 08:49:30,170 basehttp 56904 6167031808 "GET /static/js/vendor.min.js HTTP/1.1" 200 1091361 +INFO 2025-09-04 08:49:30,395 basehttp 56904 6167031808 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 1957526 +INFO 2025-09-04 08:49:30,428 basehttp 56904 6183858176 "GET /static/img/theme/apple.jpg HTTP/1.1" 200 28822 +INFO 2025-09-04 08:49:30,428 basehttp 56904 6251163648 "GET /static/img/theme/transparent.jpg HTTP/1.1" 200 32747 +INFO 2025-09-04 08:49:30,429 basehttp 56904 6217510912 "GET /static/img/theme/facebook.jpg HTTP/1.1" 200 27881 +INFO 2025-09-04 08:49:30,429 basehttp 56904 6167031808 "GET /static/img/theme/default.jpg HTTP/1.1" 200 26964 +INFO 2025-09-04 08:49:30,430 basehttp 56904 6234337280 "GET /static/img/theme/material.jpg HTTP/1.1" 200 28774 +INFO 2025-09-04 08:49:30,433 basehttp 56904 6200684544 "GET /static/img/theme/google.jpg HTTP/1.1" 200 86013 +INFO 2025-09-04 08:49:30,434 basehttp 56904 6234337280 "GET /static/img/version/angular10x.jpg HTTP/1.1" 200 24580 +INFO 2025-09-04 08:49:30,441 basehttp 56904 6167031808 "GET /static/img/version/ajax.jpg HTTP/1.1" 200 20223 +INFO 2025-09-04 08:49:30,442 basehttp 56904 6251163648 "GET /static/img/version/angular1x.jpg HTTP/1.1" 200 22869 +INFO 2025-09-04 08:49:30,442 basehttp 56904 6167031808 "GET /static/img/version/svelte.jpg HTTP/1.1" 200 25060 +INFO 2025-09-04 08:49:30,444 basehttp 56904 6234337280 "GET /static/img/version/laravel.jpg HTTP/1.1" 200 26040 +INFO 2025-09-04 08:49:30,444 basehttp 56904 6217510912 "GET /static/img/version/html.jpg HTTP/1.1" 200 17325 +INFO 2025-09-04 08:49:30,445 basehttp 56904 6183858176 "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 158220 +INFO 2025-09-04 08:49:30,463 basehttp 56904 6167031808 "GET /static/img/version/django.jpg HTTP/1.1" 200 20935 +INFO 2025-09-04 08:49:30,463 basehttp 56904 6217510912 "GET /static/img/version/nextjs.jpg HTTP/1.1" 200 20152 +INFO 2025-09-04 08:49:30,463 basehttp 56904 6251163648 "GET /static/img/version/vuejs.jpg HTTP/1.1" 200 22518 +INFO 2025-09-04 08:49:30,464 basehttp 56904 6234337280 "GET /static/img/version/reactjs.jpg HTTP/1.1" 200 26850 +INFO 2025-09-04 08:49:30,464 basehttp 56904 6183858176 "GET /static/img/version/dotnet.jpg HTTP/1.1" 200 24791 +INFO 2025-09-04 08:49:30,466 basehttp 56904 6200684544 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:49:30,468 basehttp 56904 6167031808 "GET /static/img/theme/forum.jpg HTTP/1.1" 200 28744 +INFO 2025-09-04 08:49:30,468 basehttp 56904 6217510912 "GET /static/img/theme/one-page-parallax.jpg HTTP/1.1" 200 22474 +INFO 2025-09-04 08:49:30,468 basehttp 56904 6234337280 "GET /static/img/theme/e-commerce.jpg HTTP/1.1" 200 37734 +INFO 2025-09-04 08:49:30,468 basehttp 56904 6251163648 "GET /static/img/theme/blog.jpg HTTP/1.1" 200 32334 +INFO 2025-09-04 08:49:30,468 basehttp 56904 6183858176 "GET /static/img/theme/corporate.jpg HTTP/1.1" 200 38911 +WARNING 2025-09-04 08:49:30,557 log 56904 6183858176 Not Found: /favicon.ico +WARNING 2025-09-04 08:49:30,558 basehttp 56904 6183858176 "GET /favicon.ico HTTP/1.1" 404 2557 +INFO 2025-09-04 08:49:40,367 basehttp 56904 6183858176 "GET /en/operating-theatre/cases/39/ HTTP/1.1" 200 32174 +WARNING 2025-09-04 08:49:40,385 basehttp 56904 6251163648 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:49:40,391 log 56904 6183858176 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:49:40,392 basehttp 56904 6183858176 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:49:40,472 basehttp 56904 6183858176 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:49:46,055 basehttp 56904 6183858176 "POST /en/operating-theatre/cases/39/start/ HTTP/1.1" 302 0 +INFO 2025-09-04 08:49:46,073 basehttp 56904 6183858176 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 73251 +WARNING 2025-09-04 08:49:56,649 log 56904 6183858176 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:49:56,650 basehttp 56904 6183858176 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:49:56,660 log 56904 6183858176 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:49:56,661 basehttp 56904 6183858176 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:50:30,455 basehttp 56904 6183858176 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:51:29,469 autoreload 56904 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:51:29,829 autoreload 57866 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:51:30,184 basehttp 57866 6160936960 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 72857 +WARNING 2025-09-04 08:51:30,197 log 57866 6160936960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:51:30,197 basehttp 57866 6160936960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:51:30,267 basehttp 57866 6160936960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:52:13,156 basehttp 57866 6160936960 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 62005 +WARNING 2025-09-04 08:52:13,170 log 57866 6160936960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:52:13,170 basehttp 57866 6160936960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:52:13,247 basehttp 57866 6160936960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:52:24,172 basehttp 57866 6160936960 "GET /en/operating-theatre/cases/39/ HTTP/1.1" 200 32013 +WARNING 2025-09-04 08:52:24,185 basehttp 57866 6160936960 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:52:24,188 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:52:24,188 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:52:24,240 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:52:59,714 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:52:59,714 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:52:59,725 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:52:59,725 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:53:13,233 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:54:13,237 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:54:36,315 basehttp 57866 6177763328 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 62005 +WARNING 2025-09-04 08:54:36,329 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:54:36,330 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:54:36,390 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:54:44,532 basehttp 57866 6177763328 "POST /en/operating-theatre/cases/39/complete/ HTTP/1.1" 302 0 +INFO 2025-09-04 08:54:44,550 basehttp 57866 6177763328 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60458 +WARNING 2025-09-04 08:54:44,564 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:54:44,565 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:54:44,639 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:54:50,751 basehttp 57866 6177763328 "POST /en/operating-theatre/cases/35/start/ HTTP/1.1" 302 0 +INFO 2025-09-04 08:54:50,772 basehttp 57866 6177763328 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60468 +WARNING 2025-09-04 08:54:50,787 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:54:50,787 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:54:50,841 basehttp 57866 6177763328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 08:54:56,146 log 57866 6177763328 Internal Server Error: /en/operating-theatre/cases/35/update/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 201, in get + self.object = self.get_object() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/detail.py", line 31, in get_object + queryset = self.get_queryset() + ^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 858, in get_queryset + return SurgicalCase.objects.filter(tenant=self.request.user.tenant) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: actual_end, actual_start, admission, admission_id, anesthesia_type, anesthesiologist, anesthesiologist_id, approach, assistant_surgeons, blood_products, case_id, case_number, case_type, circulating_nurse, circulating_nurse_id, clinical_notes, complications, created_at, created_by, created_by_id, diagnosis, diagnosis_codes, encounter, encounter_id, equipment_usage, estimated_blood_loss, estimated_duration, id, implants, or_block, or_block_id, patient, patient_id, patient_position, primary_procedure, primary_surgeon, primary_surgeon_id, procedure_codes, scheduled_start, scrub_nurse, scrub_nurse_id, secondary_procedures, special_equipment, status, surgical_notes, updated_at +ERROR 2025-09-04 08:54:56,148 basehttp 57866 6177763328 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 500 147719 +WARNING 2025-09-04 08:54:56,168 log 57866 6177763328 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:54:56,169 basehttp 57866 6177763328 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:55:37,665 autoreload 57866 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:55:38,146 autoreload 59735 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 08:55:39,610 log 59735 6198996992 Internal Server Error: /en/operating-theatre/cases/35/update/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 109, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 202, in get + return super().get(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 142, in get + return self.render_to_response(self.get_context_data()) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 72, in get_context_data + kwargs["form"] = self.get_form() + ^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 36, in get_form + form_class = self.get_form_class() + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py", line 864, in get_form_class + class RestrictedSurgicalCaseForm(SurgicalCaseForm): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/forms/models.py", line 334, in __new__ + raise FieldError(message) +django.core.exceptions.FieldError: Unknown field(s) (notes) specified for SurgicalCase +ERROR 2025-09-04 08:55:39,611 basehttp 59735 6198996992 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 500 109860 +WARNING 2025-09-04 08:55:39,626 log 59735 6198996992 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:55:39,626 basehttp 59735 6198996992 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:56:16,933 autoreload 59735 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 08:56:17,310 autoreload 60043 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 08:56:19,142 basehttp 60043 6136967168 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 200 36121 +INFO 2025-09-04 08:56:19,162 basehttp 60043 6136967168 "GET /static/plugins/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css HTTP/1.1" 200 15733 +INFO 2025-09-04 08:56:19,162 basehttp 60043 6170619904 "GET /static/plugins/bootstrap-timepicker/css/bootstrap-timepicker.min.css HTTP/1.1" 200 3034 +INFO 2025-09-04 08:56:19,163 basehttp 60043 13035925504 "GET /static/plugins/select2/dist/css/select2.min.css HTTP/1.1" 200 14966 +WARNING 2025-09-04 08:56:19,165 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +INFO 2025-09-04 08:56:19,165 basehttp 60043 13052751872 "GET /static/plugins/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js HTTP/1.1" 200 33871 +INFO 2025-09-04 08:56:19,165 basehttp 60043 13069578240 "GET /static/plugins/bootstrap-timepicker/js/bootstrap-timepicker.min.js HTTP/1.1" 200 18685 +WARNING 2025-09-04 08:56:19,166 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:56:19,166 basehttp 60043 6136967168 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +INFO 2025-09-04 08:56:19,214 basehttp 60043 6136967168 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:56:30,206 basehttp 60043 6136967168 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:56:30,207 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:30,207 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:56:30,217 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:30,217 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:56:30,873 basehttp 60043 6153793536 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60074 +WARNING 2025-09-04 08:56:30,885 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:30,885 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:56:31,791 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:31,791 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 08:56:32,606 log 60043 6153793536 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 890, in _resolve_lookup + raise TypeError +TypeError + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 320, in render + match = condition.eval(context) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 886, in eval + return self.value.resolve(context, ignore_failures=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 722, in resolve + obj = self.var.resolve(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 854, in resolve + value = self._resolve_lookup(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 901, in _resolve_lookup + current = getattr(current, bit) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/models.py", line 270, in current_case + return self.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^ +AttributeError: 'OperatingRoom' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:56:32,609 basehttp 60043 6153793536 "GET /en/operating-theatre/ HTTP/1.1" 500 259596 +WARNING 2025-09-04 08:56:32,628 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:32,629 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +ERROR 2025-09-04 08:56:34,397 log 60043 6153793536 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 890, in _resolve_lookup + raise TypeError +TypeError + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 320, in render + match = condition.eval(context) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 886, in eval + return self.value.resolve(context, ignore_failures=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 722, in resolve + obj = self.var.resolve(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 854, in resolve + value = self._resolve_lookup(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 901, in _resolve_lookup + current = getattr(current, bit) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/models.py", line 270, in current_case + return self.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^ +AttributeError: 'OperatingRoom' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:56:34,399 basehttp 60043 6153793536 "GET /en/operating-theatre/ HTTP/1.1" 500 259733 +WARNING 2025-09-04 08:56:34,415 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:56:34,415 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:26,333 basehttp 60043 6153793536 "GET /en/operating-theatre/blocks/12/ HTTP/1.1" 200 32878 +WARNING 2025-09-04 08:57:26,351 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:26,351 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:27,292 basehttp 60043 6153793536 "GET /en/operating-theatre/blocks/12/ HTTP/1.1" 200 32878 +WARNING 2025-09-04 08:57:27,309 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:27,309 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:27,374 basehttp 60043 6153793536 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 08:57:32,744 basehttp 60043 6153793536 "GET /en/operating-theatre/cases/13/ HTTP/1.1" 200 31982 +WARNING 2025-09-04 08:57:32,761 basehttp 60043 6136967168 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 08:57:32,766 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:32,766 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:32,839 basehttp 60043 6153793536 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 08:57:36,943 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:36,943 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 08:57:36,955 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:36,955 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:37,590 basehttp 60043 6153793536 "GET /en/operating-theatre/blocks/?page=2&date=2025-09-05 HTTP/1.1" 200 95252 +WARNING 2025-09-04 08:57:37,612 log 60043 6153793536 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:37,612 basehttp 60043 6153793536 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 08:57:44,203 basehttp 60043 6153793536 "GET /en/operating-theatre HTTP/1.1" 301 0 +ERROR 2025-09-04 08:57:44,279 log 60043 13069578240 Internal Server Error: /en/operating-theatre/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 890, in _resolve_lookup + raise TypeError +TypeError + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render + return nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 243, in render + nodelist.append(node.render_annotated(context)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 320, in render + match = condition.eval(context) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 886, in eval + return self.value.resolve(context, ignore_failures=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 722, in resolve + obj = self.var.resolve(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 854, in resolve + value = self._resolve_lookup(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 901, in _resolve_lookup + current = getattr(current, bit) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/models.py", line 270, in current_case + return self.surgical_cases.filter( + ^^^^^^^^^^^^^^^^^^^ +AttributeError: 'OperatingRoom' object has no attribute 'surgical_cases' +ERROR 2025-09-04 08:57:44,281 basehttp 60043 13069578240 "GET /en/operating-theatre/ HTTP/1.1" 500 259596 +WARNING 2025-09-04 08:57:44,301 log 60043 13069578240 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 08:57:44,301 basehttp 60043 13069578240 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:09:05,949 autoreload 60043 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/models.py changed, reloading. +INFO 2025-09-04 09:09:06,379 autoreload 65725 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 09:09:08,546 basehttp 65725 6198669312 "GET /en/operating-theatre/ HTTP/1.1" 200 73189 +WARNING 2025-09-04 09:09:08,567 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:09:08,567 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:09:08,647 basehttp 65725 6198669312 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:09:08,649 basehttp 65725 6215495680 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 09:09:22,877 basehttp 65725 6215495680 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60074 +WARNING 2025-09-04 09:09:22,892 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:09:22,892 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:09:22,950 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 09:09:25,731 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:09:25,731 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 09:09:25,742 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:09:25,761 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:09:30,687 basehttp 65725 6215495680 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60074 +WARNING 2025-09-04 09:09:30,702 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:09:30,702 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:09:30,742 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 09:10:09,357 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:10:09,357 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:10:09,359 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 09:10:09,375 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:10:09,375 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:11:09,344 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:12:09,351 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:13:09,346 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:14:08,633 basehttp 65725 6215495680 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 09:14:09,359 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:14:30,654 basehttp 65725 6215495680 "GET /en/operating-theatre/ HTTP/1.1" 200 59296 +WARNING 2025-09-04 09:14:30,667 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:14:30,667 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:14:30,721 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:14:30,739 basehttp 65725 6198669312 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 09:14:50,122 basehttp 65725 6198669312 "GET /en/operating-theatre/ HTTP/1.1" 200 59264 +WARNING 2025-09-04 09:14:50,136 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:14:50,136 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:14:50,204 basehttp 65725 6215495680 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 09:14:50,208 basehttp 65725 6198669312 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:15:15,654 basehttp 65725 6198669312 "GET /en/operating-theatre/cases/1/ HTTP/1.1" 200 32155 +WARNING 2025-09-04 09:15:15,669 basehttp 65725 6198669312 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +WARNING 2025-09-04 09:15:15,673 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:15,673 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:15:15,725 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 09:15:19,772 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:19,772 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 09:15:19,790 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:19,790 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:15:30,725 basehttp 65725 6215495680 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 62360 +WARNING 2025-09-04 09:15:30,745 log 65725 6215495680 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:30,745 basehttp 65725 6215495680 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:15:30,820 basehttp 65725 6215495680 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 09:15:30,823 basehttp 65725 6198669312 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +WARNING 2025-09-04 09:15:38,427 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:38,427 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 09:15:38,436 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:38,437 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:15:41,661 basehttp 65725 6198669312 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60043 +WARNING 2025-09-04 09:15:41,683 log 65725 6198669312 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 09:15:41,683 basehttp 65725 6198669312 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 09:15:41,743 basehttp 65725 6198669312 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:00:06,992 autoreload 70999 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 11:00:52,024 basehttp 70999 6136360960 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60043 +WARNING 2025-09-04 11:00:52,068 log 70999 6136360960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:00:52,068 basehttp 70999 6136360960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:00:52,130 basehttp 70999 6136360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:00:55,460 basehttp 70999 6136360960 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 200 36121 +WARNING 2025-09-04 11:00:55,479 log 70999 6136360960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:00:55,479 basehttp 70999 6136360960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:00:55,564 basehttp 70999 6136360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:01:55,574 basehttp 70999 6136360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:02:55,578 basehttp 70999 6136360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:03:55,581 basehttp 70999 6136360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 11:04:31,226 log 70999 6136360960 Internal Server Error: /en/operating-theatre/cases/35/update/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_room_availability' not found. 'check_room_availability' is not a valid view function or pattern name. +ERROR 2025-09-04 11:04:31,228 basehttp 70999 6136360960 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 500 175981 +WARNING 2025-09-04 11:04:31,240 log 70999 6136360960 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:04:31,241 basehttp 70999 6136360960 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:07:57,026 autoreload 70999 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 11:07:57,417 autoreload 74422 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 11:08:39,777 autoreload 74422 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 11:08:40,124 autoreload 74807 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 11:09:03,945 autoreload 74807 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 11:09:04,239 autoreload 74972 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 11:10:05,545 autoreload 74972 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 11:10:05,837 autoreload 75438 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 11:10:09,218 log 75438 6159708160 Internal Server Error: /en/operating-theatre/cases/35/update/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_room_availability' not found. 'check_room_availability' is not a valid view function or pattern name. +ERROR 2025-09-04 11:10:09,221 basehttp 75438 6159708160 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 500 175981 +WARNING 2025-09-04 11:10:09,236 log 75438 6159708160 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:10:09,236 basehttp 75438 6159708160 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:10:36,166 autoreload 75438 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/urls.py changed, reloading. +INFO 2025-09-04 11:10:36,517 autoreload 75683 8466948288 Watching for file changes with StatReloader +ERROR 2025-09-04 11:10:37,782 log 75683 6137622528 Internal Server Error: /en/operating-theatre/cases/35/update/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'room_schedule' not found. 'room_schedule' is not a valid view function or pattern name. +ERROR 2025-09-04 11:10:37,784 basehttp 75683 6137622528 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 500 176775 +WARNING 2025-09-04 11:10:37,801 log 75683 6137622528 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:10:37,801 basehttp 75683 6137622528 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:11:15,928 basehttp 75683 6137622528 "GET /en/operating-theatre/cases/35/update/ HTTP/1.1" 200 34126 +WARNING 2025-09-04 11:11:15,942 log 75683 6137622528 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 11:11:15,943 basehttp 75683 6137622528 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 11:11:16,008 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:12:56,454 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:14:15,428 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 11:18:03,578 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:14:04,454 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:14:53,177 basehttp 75683 6137622528 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 62360 +INFO 2025-09-04 12:14:53,218 basehttp 75683 6137622528 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:14:53,222 basehttp 75683 6154448896 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 12:14:57,859 basehttp 75683 6154448896 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 42041 +INFO 2025-09-04 12:14:57,895 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:04,359 basehttp 75683 6154448896 "GET /en/operating-theatre/rooms/55/update/ HTTP/1.1" 200 47164 +INFO 2025-09-04 12:15:04,392 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:13,592 basehttp 75683 6154448896 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 42041 +INFO 2025-09-04 12:15:13,626 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:22,536 basehttp 75683 6154448896 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 100952 +INFO 2025-09-04 12:15:22,552 basehttp 75683 6154448896 "GET /static/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 200 15096 +INFO 2025-09-04 12:15:22,552 basehttp 75683 6137622528 "GET /static/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 200 6044 +INFO 2025-09-04 12:15:22,553 basehttp 75683 13438578688 "GET /static/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 200 1470 +INFO 2025-09-04 12:15:22,554 basehttp 75683 6171275264 "GET /static/plugins/datatables.net/js/dataTables.min.js HTTP/1.1" 200 95735 +INFO 2025-09-04 12:15:22,554 basehttp 75683 13438578688 "GET /static/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 200 1796 +INFO 2025-09-04 12:15:22,554 basehttp 75683 6154448896 "GET /static/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 200 16086 +INFO 2025-09-04 12:15:22,590 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:29,660 basehttp 75683 6154448896 "GET /en/operating-theatre/notes/19/ HTTP/1.1" 200 31782 +INFO 2025-09-04 12:15:29,696 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:49,214 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:15:53,143 basehttp 75683 6154448896 "GET /en/operating-theatre/notes/ HTTP/1.1" 200 100952 +INFO 2025-09-04 12:15:53,177 basehttp 75683 6154448896 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:16:22,326 basehttp 75683 6154448896 "GET /en/operating-theatre/cases/5/ HTTP/1.1" 200 32149 +WARNING 2025-09-04 12:16:22,338 basehttp 75683 6154448896 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 12:16:22,363 basehttp 75683 6171275264 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:16:29,503 basehttp 75683 6171275264 "GET /en/operating-theatre/cases/5/update/ HTTP/1.1" 200 42733 +INFO 2025-09-04 12:16:29,536 basehttp 75683 6171275264 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:16:49,227 basehttp 75683 6171275264 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 12:17:15,525 log 75683 6171275264 Internal Server Error: /en/operating-theatre/blocks/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 480, in render + url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/base.py", line 98, in reverse + resolved_url = resolver._reverse_with_prefix(view, prefix, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/urls/resolvers.py", line 831, in _reverse_with_prefix + raise NoReverseMatch(msg) +django.urls.exceptions.NoReverseMatch: Reverse for 'check_availability' not found. 'check_availability' is not a valid view function or pattern name. +ERROR 2025-09-04 12:17:15,527 basehttp 75683 6171275264 "GET /en/operating-theatre/blocks/create/ HTTP/1.1" 500 169656 +INFO 2025-09-04 12:38:21,809 autoreload 82708 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 12:38:25,852 basehttp 82708 6194950144 "GET / HTTP/1.1" 302 0 +INFO 2025-09-04 12:38:25,905 basehttp 82708 6211776512 "GET /en/ HTTP/1.1" 200 49904 +INFO 2025-09-04 12:38:25,959 basehttp 82708 6211776512 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:38:25,960 basehttp 82708 6245429248 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-04 12:38:25,961 basehttp 82708 6228602880 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 12:38:25,963 basehttp 82708 6194950144 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:38:55,938 basehttp 82708 6194950144 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:39:25,978 basehttp 82708 6194950144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:39:25,978 basehttp 82708 6228602880 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 12:39:25,980 basehttp 82708 6245429248 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:39:55,944 basehttp 82708 6245429248 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:40:25,950 basehttp 82708 6245429248 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:40:25,950 basehttp 82708 6228602880 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 12:40:25,952 basehttp 82708 6194950144 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:40:55,956 basehttp 82708 6194950144 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 12:41:25,947 basehttp 82708 6194950144 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 12:41:25,948 basehttp 82708 6245429248 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 12:41:25,950 basehttp 82708 6228602880 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:11:04,651 autoreload 88648 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 14:11:06,462 basehttp 88648 6191460352 "GET / HTTP/1.1" 302 0 +INFO 2025-09-04 14:11:06,504 basehttp 88648 6208286720 "GET /en/ HTTP/1.1" 302 0 +INFO 2025-09-04 14:11:06,512 basehttp 88648 6208286720 "GET /accounts/login/?next=/en/ HTTP/1.1" 302 0 +ERROR 2025-09-04 14:11:06,536 log 88648 6191460352 Internal Server Error: /en/accounts/login/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/decorators.py", line 12, in wrap + resp = function(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/decorators/debug.py", line 143, in sensitive_post_parameters_wrapper + return view(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/views.py", line 95, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/decorators.py", line 48, in _wrapper + return bound_method(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/decorators/cache.py", line 80, in _view_wrapper + response = view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/mixins.py", line 53, in dispatch + response = super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/mixins.py", line 72, in get + response = super().get(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 142, in get + return self.render_to_response(self.get_context_data()) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/views.py", line 121, in get_context_data + signup_url = self.passthrough_next_url(reverse("account_signup")) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/mixins.py", line 191, in passthrough_next_url + return passthrough_next_redirect_url( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/utils.py", line 285, in passthrough_next_redirect_url + next_url = get_next_redirect_url(request, redirect_field_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/utils.py", line 43, in get_next_redirect_url + if redirect_to and not get_adapter().is_safe_url(redirect_to): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/allauth/account/adapter.py", line 587, in is_safe_url + allowed_hosts = {context.request.get_host()} | set(settings.ALLOWED_HOSTS) + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute 'get_host' +ERROR 2025-09-04 14:11:06,539 basehttp 88648 6191460352 "GET /en/accounts/login/?next=/en/ HTTP/1.1" 500 160320 +INFO 2025-09-04 14:11:13,013 basehttp 88648 6191460352 "GET /en/admin HTTP/1.1" 301 0 +INFO 2025-09-04 14:11:13,047 basehttp 88648 6191460352 "GET /en/admin/ HTTP/1.1" 302 0 +INFO 2025-09-04 14:11:13,060 basehttp 88648 6191460352 "GET /en/admin/login/?next=/en/admin/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:11:13,068 basehttp 88648 6208286720 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2808 +INFO 2025-09-04 14:11:13,069 basehttp 88648 6225113088 "GET /static/admin/js/theme.js HTTP/1.1" 200 1653 +INFO 2025-09-04 14:11:13,069 basehttp 88648 6191460352 "GET /static/admin/css/base.css HTTP/1.1" 200 22120 +INFO 2025-09-04 14:11:13,070 basehttp 88648 6191460352 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2810 +INFO 2025-09-04 14:11:13,070 basehttp 88648 6225113088 "GET /static/admin/css/login.css HTTP/1.1" 200 951 +INFO 2025-09-04 14:11:13,071 basehttp 88648 6208286720 "GET /static/admin/css/responsive.css HTTP/1.1" 200 16565 +INFO 2025-09-04 14:11:13,071 basehttp 88648 6225113088 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063 +INFO 2025-09-04 14:11:14,978 basehttp 88648 6225113088 "POST /en/admin/login/?next=/en/admin/ HTTP/1.1" 302 0 +INFO 2025-09-04 14:11:15,012 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:11:15,017 basehttp 88648 6225113088 "GET /en/admin/ HTTP/1.1" 200 90344 +INFO 2025-09-04 14:11:15,023 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:11:15,024 basehttp 88648 6225113088 "GET /static/admin/css/dashboard.css HTTP/1.1" 200 441 +INFO 2025-09-04 14:11:15,024 basehttp 88648 6241939456 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:11:15,027 basehttp 88648 6225113088 "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380 +INFO 2025-09-04 14:11:15,027 basehttp 88648 6241939456 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 +INFO 2025-09-04 14:11:15,027 basehttp 88648 6191460352 "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392 +INFO 2025-09-04 14:11:16,968 basehttp 88648 6191460352 "GET / HTTP/1.1" 302 0 +INFO 2025-09-04 14:11:16,994 basehttp 88648 6241939456 "GET /en/ HTTP/1.1" 200 49904 +INFO 2025-09-04 14:11:17,064 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:11:17,069 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:11:17,072 basehttp 88648 6191460352 "GET /en/htmx/tenant-info/ HTTP/1.1" 200 1043 +INFO 2025-09-04 14:11:17,073 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:11:22,445 basehttp 88648 6225113088 "GET /en/operating-theatre/ HTTP/1.1" 200 59264 +INFO 2025-09-04 14:11:22,493 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:11:22,495 basehttp 88648 6191460352 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:11:43,300 basehttp 88648 6191460352 "GET /en/operating-theatre/rooms/55/ HTTP/1.1" 200 42041 +INFO 2025-09-04 14:11:43,332 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 14:11:59,106 log 88648 6191460352 Not Found: /en/operating-theatre/cases/1/start/ +WARNING 2025-09-04 14:11:59,106 basehttp 88648 6191460352 "POST /en/operating-theatre/cases/1/start/ HTTP/1.1" 404 39941 +INFO 2025-09-04 14:12:03,895 basehttp 88648 6191460352 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60043 +INFO 2025-09-04 14:12:03,927 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:12:15,011 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:12:15,158 basehttp 88648 6191460352 "POST /en/operating-theatre/cases/34/start/ HTTP/1.1" 302 0 +INFO 2025-09-04 14:12:15,170 basehttp 88648 6191460352 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 60459 +INFO 2025-09-04 14:12:15,200 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:12:25,594 basehttp 88648 6191460352 "POST /en/operating-theatre/cases/34/complete/ HTTP/1.1" 302 0 +INFO 2025-09-04 14:12:25,614 basehttp 88648 6191460352 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 58512 +INFO 2025-09-04 14:12:25,651 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:12:31,397 basehttp 88648 6191460352 "GET /en/operating-theatre/cases/30/ HTTP/1.1" 200 32151 +WARNING 2025-09-04 14:12:31,411 basehttp 88648 6191460352 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:12:31,429 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:12:39,863 basehttp 88648 6225113088 "GET /en/operating-theatre/cases/30/update/ HTTP/1.1" 200 42734 +INFO 2025-09-04 14:12:39,897 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:12:43,166 basehttp 88648 6225113088 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 58106 +INFO 2025-09-04 14:12:43,199 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:15,029 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:13:15,031 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:15,031 basehttp 88648 6241939456 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:13:31,443 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:37,681 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:41,646 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:43,461 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:13:43,461 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:43,464 basehttp 88648 6241939456 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:13:46,594 basehttp 88648 6241939456 "GET /en/operating-theatre/ HTTP/1.1" 200 59253 +INFO 2025-09-04 14:13:46,646 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:46,648 basehttp 88648 6208286720 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:13:53,246 basehttp 88648 6208286720 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 62361 +INFO 2025-09-04 14:13:53,284 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:13:53,285 basehttp 88648 6241939456 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:14:10,892 basehttp 88648 6241939456 "GET /en/operating-theatre/rooms/ HTTP/1.1" 200 62361 +INFO 2025-09-04 14:14:10,945 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:14:10,946 basehttp 88648 6208286720 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:14:13,836 basehttp 88648 6208286720 "GET /en/operating-theatre/rooms/create/ HTTP/1.1" 200 46766 +INFO 2025-09-04 14:14:13,866 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:14:15,002 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:14:40,942 basehttp 88648 6208286720 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:15:04,140 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:15:06,609 basehttp 88648 6208286720 "GET /en/operating-theatre/blocks/ HTTP/1.1" 200 138849 +INFO 2025-09-04 14:15:06,643 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:15:15,033 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:15:15,035 basehttp 88648 6241939456 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:15:15,037 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:15:18,478 basehttp 88648 6225113088 "GET /en/operating-theatre/blocks/38/ HTTP/1.1" 200 32859 +INFO 2025-09-04 14:15:18,527 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:15:36,996 basehttp 88648 6225113088 "GET /en/operating-theatre/cases/36/ HTTP/1.1" 200 31984 +WARNING 2025-09-04 14:15:37,006 basehttp 88648 6225113088 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:15:37,033 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:15:57,592 basehttp 88648 6241939456 "GET /en/operating-theatre/equipment/ HTTP/1.1" 200 31695 +INFO 2025-09-04 14:15:57,628 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:16:04,144 basehttp 88648 6241939456 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:16:05,086 basehttp 88648 6241939456 "GET /en/operating-theatre/templates/ HTTP/1.1" 200 41476 +WARNING 2025-09-04 14:16:05,100 basehttp 88648 6241939456 "GET /static/assets/plugins/datatables.net-bs5/css/dataTables.bootstrap5.min.css HTTP/1.1" 404 2128 +WARNING 2025-09-04 14:16:05,104 basehttp 88648 6191460352 "GET /static/assets/plugins/datatables.net/js/jquery.dataTables.min.js HTTP/1.1" 404 2098 +WARNING 2025-09-04 14:16:05,104 basehttp 88648 6208286720 "GET /static/assets/plugins/datatables.net-responsive-bs5/css/responsive.bootstrap5.min.css HTTP/1.1" 404 2161 +WARNING 2025-09-04 14:16:05,109 basehttp 88648 6258765824 "GET /static/assets/plugins/datatables.net-responsive-bs5/js/responsive.bootstrap5.min.js HTTP/1.1" 404 2155 +WARNING 2025-09-04 14:16:05,109 basehttp 88648 6225113088 "GET /static/assets/plugins/datatables.net-bs5/js/dataTables.bootstrap5.min.js HTTP/1.1" 404 2122 +WARNING 2025-09-04 14:16:05,109 basehttp 88648 6241939456 "GET /static/assets/plugins/datatables.net-responsive/js/dataTables.responsive.min.js HTTP/1.1" 404 2143 +INFO 2025-09-04 14:16:05,132 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:16:15,013 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:16:47,510 basehttp 88648 6191460352 "GET /en/billing/bills/create/ HTTP/1.1" 200 109320 +INFO 2025-09-04 14:16:47,556 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:16:51,098 basehttp 88648 6191460352 "GET /en/admin/ HTTP/1.1" 200 90344 +INFO 2025-09-04 14:17:06,011 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:17:15,031 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:17:15,035 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:17:15,037 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:17:15,680 basehttp 88648 6225113088 "GET /en/appointments/create/ HTTP/1.1" 200 36516 +INFO 2025-09-04 14:17:15,713 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:17:32,461 basehttp 88648 6225113088 "GET /en/admin/ HTTP/1.1" 200 90344 +INFO 2025-09-04 14:17:35,630 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:17:35,631 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:17:36,009 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:17:37,343 basehttp 88648 6225113088 "GET /en/operating-theatre/ HTTP/1.1" 200 59253 +INFO 2025-09-04 14:17:37,393 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:17:37,394 basehttp 88648 6208286720 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:18:15,031 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:18:15,031 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:18:15,032 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:18:37,402 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 14:19:05,825 log 88648 6208286720 Not Found: /en/configuration +WARNING 2025-09-04 14:19:05,825 basehttp 88648 6208286720 "GET /en/configuration HTTP/1.1" 404 29880 +WARNING 2025-09-04 14:19:08,761 log 88648 6208286720 Not Found: /en/configurations +WARNING 2025-09-04 14:19:08,761 basehttp 88648 6208286720 "GET /en/configurations HTTP/1.1" 404 29883 +INFO 2025-09-04 14:19:15,002 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:19:34,538 basehttp 88648 6208286720 "GET /en/hr HTTP/1.1" 301 0 +INFO 2025-09-04 14:19:34,574 basehttp 88648 6191460352 "GET /en/hr/ HTTP/1.1" 200 42463 +INFO 2025-09-04 14:19:34,615 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:19:38,106 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 14:19:52,933 log 88648 6191460352 Not Found: /en/communication +WARNING 2025-09-04 14:19:52,934 basehttp 88648 6191460352 "GET /en/communication HTTP/1.1" 404 29880 +INFO 2025-09-04 14:20:15,032 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:20:15,033 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:20:15,036 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:20:20,235 basehttp 88648 6208286720 "GET /en/communications/messages HTTP/1.1" 301 0 +INFO 2025-09-04 14:20:20,251 basehttp 88648 6191460352 "GET /en/communications/messages/ HTTP/1.1" 200 29562 +INFO 2025-09-04 14:20:20,284 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:20:26,659 log 88648 6191460352 Internal Server Error: /en/communications/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 228, in get + context = self.get_context_data(**kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/communications/views.py", line 61, in get_context_data + 'recent_alerts': AlertInstance.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'tenant' into field. Choices are: acknowledged_at, acknowledged_by, acknowledged_by_id, alert_id, alert_rule, alert_rule_id, context_data, description, escalated_at, escalation_level, expires_at, last_notification_at, notifications_sent, resolution_notes, resolved_at, resolved_by, resolved_by_id, severity, status, title, trigger_data, triggered_at +ERROR 2025-09-04 14:20:26,661 basehttp 88648 6191460352 "GET /en/communications/ HTTP/1.1" 500 131927 +ERROR 2025-09-04 14:20:34,442 log 88648 6191460352 Internal Server Error: /en/communications/messages/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 178, in get + return super().get(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 142, in get + return self.render_to_response(self.get_context_data()) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 72, in get_context_data + kwargs["form"] = self.get_form() + ^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 37, in get_form + return form_class(**self.get_form_kwargs()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/communications/forms.py", line 76, in __init__ + ).order_by('template_name') + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1722, in order_by + obj.query.add_ordering(*field_names) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 2291, in add_ordering + self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'template_name' into field. Choices are: alertrule, category, content_template, created_at, created_by, created_by_id, default_values, description, formatting_rules, is_active, is_system_template, last_used_at, name, requires_approval, subject_template, template_id, template_type, tenant, tenant_id, updated_at, usage_count, variables +ERROR 2025-09-04 14:20:34,444 basehttp 88648 6191460352 "GET /en/communications/messages/create/ HTTP/1.1" 500 115242 +INFO 2025-09-04 14:21:15,031 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:21:15,032 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:21:17,691 basehttp 88648 6191460352 "GET /en/pharmacy/ HTTP/1.1" 200 34315 +INFO 2025-09-04 14:21:17,738 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:21:17,784 log 88648 6208286720 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:21:17,788 basehttp 88648 6208286720 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:21:17,794 log 88648 6225113088 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:21:17,795 basehttp 88648 6225113088 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +ERROR 2025-09-04 14:21:47,772 log 88648 6225113088 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:21:47,773 basehttp 88648 6225113088 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:21:49,353 basehttp 88648 6225113088 "GET /en/pharmacy/prescriptions/create/ HTTP/1.1" 200 71387 +INFO 2025-09-04 14:21:49,387 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:21:57,722 basehttp 88648 6225113088 "GET /en/pharmacy/medications/create/ HTTP/1.1" 200 45999 +INFO 2025-09-04 14:21:57,756 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:22:15,031 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:22:15,033 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:22:18,228 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:22:18,281 log 88648 6225113088 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:18,284 basehttp 88648 6225113088 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:22:18,291 log 88648 6191460352 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:18,292 basehttp 88648 6191460352 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:22:19,347 basehttp 88648 6191460352 "GET /en/pharmacy/inventory/create/ HTTP/1.1" 200 70718 +INFO 2025-09-04 14:22:19,381 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:22:26,669 basehttp 88648 6191460352 "GET /en/pharmacy/drug-interactions/ HTTP/1.1" 200 46048 +INFO 2025-09-04 14:22:26,700 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:22:31,612 basehttp 88648 6191460352 "GET /en/pharmacy/ HTTP/1.1" 200 34315 +INFO 2025-09-04 14:22:31,672 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:22:31,725 log 88648 6208286720 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:31,730 log 88648 6225113088 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:31,731 basehttp 88648 6208286720 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:22:31,731 basehttp 88648 6225113088 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:22:33,708 basehttp 88648 6225113088 "GET /en/pharmacy/ HTTP/1.1" 200 34315 +INFO 2025-09-04 14:22:33,757 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:22:33,802 log 88648 6191460352 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:33,804 basehttp 88648 6191460352 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:22:33,814 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:22:33,815 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +ERROR 2025-09-04 14:23:07,360 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:23:07,361 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:23:15,017 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:23:15,018 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:28:16,143 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:28:16,190 log 88648 6191460352 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:28:16,193 basehttp 88648 6191460352 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:28:16,203 log 88648 6225113088 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:28:16,203 basehttp 88648 6225113088 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +ERROR 2025-09-04 14:30:00,487 log 88648 6225113088 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:30:00,493 basehttp 88648 6225113088 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:30:06,463 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:30:06,466 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:30:06,467 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:30:30,450 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:30:30,483 log 88648 6208286720 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:30:30,484 basehttp 88648 6208286720 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:30:31,462 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:30:31,463 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +ERROR 2025-09-04 14:31:24,812 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:31:24,813 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:31:28,796 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:31:53,806 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:31:53,835 log 88648 6191460352 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:31:53,836 basehttp 88648 6191460352 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:31:55,814 log 88648 6191460352 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:31:55,816 basehttp 88648 6191460352 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:32:36,835 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:32:36,835 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:32:36,839 basehttp 88648 6241939456 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +ERROR 2025-09-04 14:32:36,863 log 88648 6191460352 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:32:36,864 basehttp 88648 6191460352 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:41:43,788 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:41:43,819 log 88648 6208286720 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:41:43,820 basehttp 88648 6208286720 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:42:14,887 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:42:14,888 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:42:17,798 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:42:17,798 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:42:17,799 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:42:26,579 basehttp 88648 6225113088 "GET /en/pharmacy/inventory/ HTTP/1.1" 200 120332 +INFO 2025-09-04 14:42:26,621 basehttp 88648 6225113088 "GET /static/css/saudiriyalsymbol.woff2 HTTP/1.1" 200 720 +INFO 2025-09-04 14:42:26,651 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:43:17,783 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:43:26,664 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:44:17,804 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:44:17,805 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:44:17,806 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:44:26,666 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:45:17,803 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:45:17,803 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:45:17,804 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:45:26,671 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:46:15,273 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:46:15,321 log 88648 6191460352 Internal Server Error: /en/pharmacy/inventory-alerts/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 737, in inventory_alerts + low_stock = InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:46:15,326 log 88648 6208286720 Internal Server Error: /en/pharmacy/stats/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/pharmacy/views.py", line 682, in pharmacy_stats + 'low_stock_items': InventoryItem.objects.filter( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1493, in filter + return self._filter_or_exclude(False, args, kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1511, in _filter_or_exclude + clone._filter_or_exclude_inplace(negate, args, kwargs) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1518, in _filter_or_exclude_inplace + self._query.add_q(Q(*args, **kwargs)) + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1646, in add_q + clause, _ = self._add_q(q_object, can_reuse) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1678, in _add_q + child_clause, needed_inner = self.build_filter( + ^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1526, in build_filter + lookups, parts, reffed_expression = self.solve_lookup_type(arg, summarize) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1333, in solve_lookup_type + _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 1805, in names_to_path + raise FieldError( +django.core.exceptions.FieldError: Cannot resolve keyword 'current_stock' into field. Choices are: bin_location, created_at, created_by, created_by_id, dispense_records, expiration_date, id, inventory_id, last_counted, lot_number, medication, medication_id, purchase_order_number, quality_check_date, quality_checked, quality_notes, quantity_allocated, quantity_available, quantity_on_hand, received_date, reorder_point, reorder_quantity, status, storage_location, supplier, tenant, tenant_id, total_cost, unit_cost, updated_at +ERROR 2025-09-04 14:46:15,327 basehttp 88648 6191460352 "GET /en/pharmacy/inventory-alerts/ HTTP/1.1" 500 126819 +ERROR 2025-09-04 14:46:15,328 basehttp 88648 6208286720 "GET /en/pharmacy/stats/ HTTP/1.1" 500 126636 +INFO 2025-09-04 14:46:17,801 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:46:17,803 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:46:17,804 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:47:17,772 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:47:24,374 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:47:25,202 basehttp 88648 6208286720 "GET /en/operating-theatre/ HTTP/1.1" 200 59253 +INFO 2025-09-04 14:47:25,242 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:47:25,243 basehttp 88648 6225113088 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:47:46,289 basehttp 88648 6191460352 "GET /en/operating-theatre/ HTTP/1.1" 200 59253 +INFO 2025-09-04 14:47:46,336 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:47:46,339 basehttp 88648 6208286720 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 14:48:06,083 basehttp 88648 6208286720 "GET /en/operating-theatre/cases/6/ HTTP/1.1" 200 32168 +WARNING 2025-09-04 14:48:06,095 basehttp 88648 6208286720 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:48:06,116 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:48:17,802 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:48:17,804 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:48:17,806 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:49:06,118 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:49:17,769 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:49:22,539 basehttp 88648 6225113088 "GET /en/operating-theatre/cases/6/ HTTP/1.1" 200 32185 +WARNING 2025-09-04 14:49:22,545 basehttp 88648 6225113088 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:49:22,571 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:49:50,349 basehttp 88648 6191460352 "GET /en/operating-theatre/cases/6/ HTTP/1.1" 200 32185 +WARNING 2025-09-04 14:49:50,356 basehttp 88648 6191460352 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:49:50,382 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:49:52,507 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:49:54,304 basehttp 88648 6208286720 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 200 32011 +WARNING 2025-09-04 14:49:54,311 basehttp 88648 6208286720 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:49:54,338 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:50:17,804 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:50:17,805 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:50:17,808 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:50:47,739 basehttp 88648 6225113088 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 200 31982 +WARNING 2025-09-04 14:50:47,748 basehttp 88648 6225113088 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 14:50:47,780 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:51:17,773 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:51:47,790 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 14:52:04,792 log 88648 6208286720 Internal Server Error: /en/operating-theatre/cases/4/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/response.py", line 92, in rendered_content + return template.render(context, self._request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render + return self.template.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render + return self._render(context) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render + return compiled_parent._render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render + return self.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render + result = block.nodelist.render(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1016, in render + return SafeString("".join([node.render_annotated(context) for node in self])) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 977, in render_annotated + return self.render(context) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 1075, in render + output = self.filter_expression.resolve(context) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/base.py", line 749, in resolve + new_obj = func(obj, *arg_vals) + ^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/defaultfilters.py", line 814, in timesince_filter + return timesince(value) + ^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/utils/timesince.py", line 62, in timesince + d = datetime.datetime(d.year, d.month, d.day) + ^^^^^^ +AttributeError: 'int' object has no attribute 'year' +ERROR 2025-09-04 14:52:04,795 basehttp 88648 6208286720 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 500 186348 +INFO 2025-09-04 14:52:17,777 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:52:17,778 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:52:17,780 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:53:17,777 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:53:17,779 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:53:17,779 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:54:17,805 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:54:17,807 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:54:17,809 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:55:17,795 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:55:17,797 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:55:17,798 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:56:17,802 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:56:17,803 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:56:17,805 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:57:17,721 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:58:17,751 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:58:17,752 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:58:17,753 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 14:59:17,752 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 14:59:17,753 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 14:59:17,755 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:00:17,729 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:01:17,748 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:01:17,750 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:01:17,752 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:02:17,731 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:03:17,735 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:03:17,735 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:03:17,738 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:04:17,749 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:04:17,751 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:04:17,752 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:05:17,749 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:05:17,751 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:05:17,753 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:06:17,727 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:07:17,738 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:07:17,743 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:07:17,746 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:08:17,743 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:08:17,745 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:08:17,746 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:09:17,734 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:10:17,746 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:10:17,748 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:10:17,750 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:11:17,746 basehttp 88648 6191460352 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:11:17,749 basehttp 88648 6208286720 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:11:17,750 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:12:17,720 basehttp 88648 6225113088 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:13:17,715 basehttp 88648 6208286720 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:13:17,716 basehttp 88648 6225113088 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:13:17,718 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:14:17,685 basehttp 88648 6191460352 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:15:17,706 basehttp 88648 6225113088 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:15:17,708 basehttp 88648 6191460352 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:15:17,709 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:16:17,687 basehttp 88648 6208286720 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:16:52,236 autoreload 88648 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/core/templatetags/custom_filters.py changed, reloading. +INFO 2025-09-04 15:16:52,695 autoreload 11341 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:16:53,809 basehttp 11341 6199554048 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 200 31973 +WARNING 2025-09-04 15:16:53,817 basehttp 11341 6199554048 "GET /static/plugins/fullcalendar/dist/main.min.css HTTP/1.1" 404 2041 +INFO 2025-09-04 15:16:53,842 basehttp 11341 6216380416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:17:17,698 basehttp 11341 6199554048 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:17:17,701 basehttp 11341 6216380416 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:17:17,703 basehttp 11341 6233206784 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:17:42,702 autoreload 11752 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:17:53,885 basehttp 11752 6169456640 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:18:17,691 basehttp 11752 6169456640 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:18:53,864 basehttp 11752 6169456640 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:19:17,700 basehttp 11752 6169456640 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:19:17,701 basehttp 11752 13304360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:19:17,705 basehttp 11752 13321187328 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:19:29,727 basehttp 11752 13321187328 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 200 31982 +WARNING 2025-09-04 15:19:29,734 basehttp 11752 13321187328 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 15:19:29,756 basehttp 11752 13304360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:19:50,325 basehttp 11752 13304360960 "GET /en/operating-theatre/cases/4/ HTTP/1.1" 200 31977 +WARNING 2025-09-04 15:19:50,332 basehttp 11752 13304360960 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 15:19:50,357 basehttp 11752 6169456640 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:20:02,551 basehttp 11752 6169456640 "GET /en/operating-theatre/cases/8/ HTTP/1.1" 200 32136 +WARNING 2025-09-04 15:20:02,562 basehttp 11752 6169456640 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 15:20:02,585 basehttp 11752 13304360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:20:17,712 basehttp 11752 13321187328 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:20:17,713 basehttp 11752 6169456640 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:20:17,714 basehttp 11752 13304360960 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:21:02,594 basehttp 11752 13304360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:21:17,685 basehttp 11752 13304360960 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:22:02,597 basehttp 11752 13304360960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:22:17,699 basehttp 11752 6169456640 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:22:17,701 basehttp 11752 13304360960 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:22:17,702 basehttp 11752 13321187328 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:22:36,675 autoreload 11752 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:22:37,204 autoreload 13983 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:23:02,681 basehttp 13983 6163935232 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:23:17,701 basehttp 13983 13052751872 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:23:17,702 basehttp 13983 13035925504 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:23:17,703 basehttp 13983 6163935232 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:23:55,247 autoreload 13983 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:23:55,662 autoreload 14536 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:24:02,659 basehttp 14536 6197948416 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:24:17,680 basehttp 14536 6197948416 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:24:40,459 autoreload 14536 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:24:40,868 autoreload 14953 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:25:02,678 basehttp 14953 6131642368 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:25:17,703 basehttp 14953 6148468736 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:25:17,704 basehttp 14953 6131642368 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:25:17,707 basehttp 14953 6165295104 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:25:28,825 autoreload 14953 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:25:29,303 autoreload 15268 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:26:02,666 basehttp 15268 6157578240 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:26:17,700 basehttp 15268 13052751872 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:26:17,702 basehttp 15268 13035925504 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:26:17,704 basehttp 15268 6157578240 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:26:25,647 autoreload 15268 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:26:26,146 autoreload 15752 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:27:02,692 basehttp 15752 6167982080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:27:17,680 basehttp 15752 6167982080 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:28:02,612 basehttp 15752 6167982080 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:28:05,224 autoreload 15752 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:28:05,640 autoreload 16449 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:28:17,866 basehttp 16449 6155382784 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:28:17,879 basehttp 16449 6189035520 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:28:17,879 basehttp 16449 6172209152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:29:02,593 basehttp 16449 6172209152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:29:17,647 basehttp 16449 6172209152 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:30:02,605 basehttp 16449 6172209152 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:30:04,377 autoreload 16449 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:30:04,678 autoreload 17295 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:31:44,097 autoreload 17295 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/patients/models.py changed, reloading. +INFO 2025-09-04 15:31:44,394 autoreload 18067 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 15:31:47,707 basehttp 18067 6162444288 "GET /en/operating-theatre/cases/8/ HTTP/1.1" 200 32123 +WARNING 2025-09-04 15:31:47,717 basehttp 18067 6162444288 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 15:31:47,777 basehttp 18067 13170143232 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:32:05,690 basehttp 18067 13170143232 "GET /en/htmx/dashboard-stats/ HTTP/1.1" 200 2094 +INFO 2025-09-04 15:32:11,683 basehttp 18067 13170143232 "GET /en/operating-theatre/blocks/create/ HTTP/1.1" 200 39351 +INFO 2025-09-04 15:32:11,736 basehttp 18067 13170143232 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:32:17,665 basehttp 18067 13170143232 "GET /en/htmx/system-health/ HTTP/1.1" 200 1356 +INFO 2025-09-04 15:32:17,666 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:33:11,746 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:34:11,748 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:35:11,738 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:36:11,749 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:37:11,752 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:38:11,753 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:39:11,745 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:40:11,745 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:41:11,757 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:42:12,636 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:43:14,644 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:44:17,639 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:46:17,630 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:47:17,623 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:49:17,622 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:50:17,625 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:52:17,613 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:53:17,615 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:54:17,627 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:56:17,619 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:57:17,612 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 15:58:17,615 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:00:17,611 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:02:17,615 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:03:17,615 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:05:17,609 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:06:17,612 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:08:17,609 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:09:17,608 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:11:17,619 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:13:17,615 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:14:17,601 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:16:17,608 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:17:17,591 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:19:17,593 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:20:17,596 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:22:17,591 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:23:17,593 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:25:17,583 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:27:17,576 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:28:17,585 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:30:17,591 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:32:17,592 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:34:17,592 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:35:17,590 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:36:17,597 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:38:17,582 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:39:17,581 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:41:17,583 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:43:17,577 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:44:17,594 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:46:17,596 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:46:37,683 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/create/ HTTP/1.1" 200 39351 +INFO 2025-09-04 16:46:37,746 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:47:37,751 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:48:12,057 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/?page=2&date=2025-09-05 HTTP/1.1" 200 95252 +INFO 2025-09-04 16:48:16,664 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/?page=1&page=2&date=2025-09-05 HTTP/1.1" 200 95274 +INFO 2025-09-04 16:48:16,695 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:49:16,707 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:50:07,857 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/9/ HTTP/1.1" 200 32871 +INFO 2025-09-04 16:50:07,902 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:50:16,708 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:50:54,564 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/?page=1&page=2&date=2025-09-05 HTTP/1.1" 200 95794 +INFO 2025-09-04 16:50:54,600 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:51:54,604 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:52:26,227 basehttp 18067 6162444288 "GET /en/operating-theatre/blocks/?date=2025-09-06 HTTP/1.1" 200 139685 +INFO 2025-09-04 16:52:26,255 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:53:26,258 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:54:26,273 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:55:26,271 basehttp 18067 6162444288 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:55:43,340 autoreload 18067 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 16:55:43,787 autoreload 54865 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 16:56:26,319 basehttp 54865 6125367296 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:57:26,278 basehttp 54865 6125367296 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:58:26,273 basehttp 54865 6125367296 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 16:59:14,095 autoreload 54865 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/operating_theatre/views.py changed, reloading. +INFO 2025-09-04 16:59:14,416 autoreload 56410 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 16:59:26,646 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:00:28,596 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:02:17,573 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:03:17,576 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:05:17,574 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:06:17,594 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:07:17,679 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:09:17,574 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:10:17,573 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:11:17,574 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:13:17,573 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:14:17,669 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:15:17,687 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:17:17,671 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:19:17,669 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:21:17,670 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:22:17,669 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:24:17,674 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:26:17,672 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:27:17,667 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:28:17,667 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:29:17,650 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:31:17,656 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:33:17,653 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:34:17,641 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:36:17,643 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:37:17,637 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:39:17,639 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:40:17,641 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:41:17,644 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:43:17,651 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:44:17,647 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:45:17,712 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:46:17,709 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:48:17,710 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:49:17,723 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:51:17,709 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:52:17,708 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:54:17,704 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:55:17,711 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:57:17,727 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 17:58:17,724 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:00:17,680 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:01:17,680 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:02:17,683 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:03:17,684 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:04:17,685 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:05:17,683 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:06:17,689 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:07:17,683 basehttp 56410 6197800960 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:08:02,794 autoreload 56410 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/hospital_management/settings.py changed, reloading. +INFO 2025-09-04 18:08:03,046 autoreload 87361 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:08:32,803 autoreload 87361 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/models.py changed, reloading. +INFO 2025-09-04 18:08:32,982 autoreload 87615 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:10:44,414 autoreload 87615 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/models.py changed, reloading. +INFO 2025-09-04 18:10:44,677 autoreload 88550 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:11:17,908 autoreload 88550 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/models.py changed, reloading. +INFO 2025-09-04 18:11:18,219 autoreload 88876 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:11:47,269 autoreload 88876 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/admin.py changed, reloading. +INFO 2025-09-04 18:11:47,598 autoreload 89078 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:11:47,881 autoreload 89086 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:12:00,284 autoreload 89258 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:12:04,217 basehttp 89258 6204665856 "GET /en/operating-theatre/blocks/?date=2025-09-06 HTTP/1.1" 200 139685 +INFO 2025-09-04 18:12:04,289 basehttp 89258 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:12:07,141 basehttp 89258 6204665856 "GET /en/operating-theatre/blocks/?date=2025-09-05 HTTP/1.1" 200 139685 +INFO 2025-09-04 18:12:15,385 basehttp 89258 6204665856 "GET /en/operating-theatre/ HTTP/1.1" 200 59253 +INFO 2025-09-04 18:12:15,417 basehttp 89258 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:12:15,420 basehttp 89258 6221492224 "GET /en/operating-theatre/htmx/stats/ HTTP/1.1" 200 4212 +INFO 2025-09-04 18:12:29,117 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/1/ HTTP/1.1" 200 32125 +WARNING 2025-09-04 18:12:29,131 basehttp 89258 6221492224 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 18:12:29,149 basehttp 89258 6204665856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 18:12:45,249 log 89258 6204665856 Not Found: /en/operating-theatre/cases/5/start/ +WARNING 2025-09-04 18:12:45,249 basehttp 89258 6204665856 "POST /en/operating-theatre/cases/5/start/ HTTP/1.1" 404 39941 +INFO 2025-09-04 18:12:49,984 basehttp 89258 6204665856 "GET /en/operating-theatre/cases/5/ HTTP/1.1" 200 32119 +WARNING 2025-09-04 18:12:49,994 basehttp 89258 6204665856 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +INFO 2025-09-04 18:12:50,020 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 18:12:52,716 log 89258 6221492224 Not Found: /en/operating-theatre/cases/5/start/ +WARNING 2025-09-04 18:12:52,716 basehttp 89258 6221492224 "POST /en/operating-theatre/cases/5/start/ HTTP/1.1" 404 39941 +WARNING 2025-09-04 18:12:56,342 basehttp 89258 6221492224 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +WARNING 2025-09-04 18:12:56,357 log 89258 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:12:56,357 basehttp 89258 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:10,059 log 89258 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:10,059 basehttp 89258 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:10,069 log 89258 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:10,070 basehttp 89258 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:11,677 log 89258 6204665856 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:11,677 basehttp 89258 6204665856 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:11,679 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 18:13:11,691 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:11,691 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:13,759 basehttp 89258 6221492224 "GET /en/operating-theatre/blocks/33/ HTTP/1.1" 200 32856 +WARNING 2025-09-04 18:13:13,776 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:13,776 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:13,873 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:13:16,394 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/37/ HTTP/1.1" 200 32117 +WARNING 2025-09-04 18:13:16,409 basehttp 89258 6204665856 "GET /static/plugins/%40fullcalendar/dist/main.min.css HTTP/1.1" 404 2044 +WARNING 2025-09-04 18:13:16,415 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:16,415 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:16,506 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 18:13:22,718 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:22,718 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:22,729 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:22,729 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:23,549 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:23,549 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:13:23,559 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:23,559 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:34,576 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 58106 +WARNING 2025-09-04 18:13:34,596 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:34,596 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:34,692 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:13:45,408 basehttp 89258 6221492224 "POST /en/operating-theatre/cases/30/start/ HTTP/1.1" 302 0 +INFO 2025-09-04 18:13:45,428 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 58522 +WARNING 2025-09-04 18:13:45,444 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:45,444 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:45,543 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:13:56,078 basehttp 89258 6221492224 "POST /en/operating-theatre/cases/30/complete/ HTTP/1.1" 302 0 +INFO 2025-09-04 18:13:56,098 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 56574 +WARNING 2025-09-04 18:13:56,114 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:13:56,114 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:13:56,207 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:14:05,141 basehttp 89258 6221492224 "GET /en/operating-theatre/cases/ HTTP/1.1" 200 56168 +WARNING 2025-09-04 18:14:05,155 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:05,156 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:14:05,885 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:05,885 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:14:06,518 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:06,518 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:14:06,527 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:06,527 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:14:11,680 basehttp 89258 6221492224 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +WARNING 2025-09-04 18:14:31,693 log 89258 6221492224 Not Found: /en/blood_bank +WARNING 2025-09-04 18:14:31,693 basehttp 89258 6221492224 "GET /en/blood_bank HTTP/1.1" 404 29871 +WARNING 2025-09-04 18:14:31,711 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:31,711 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +WARNING 2025-09-04 18:14:35,622 log 89258 6221492224 Not Found: /en/blood-bank +WARNING 2025-09-04 18:14:35,623 basehttp 89258 6221492224 "GET /en/blood-bank HTTP/1.1" 404 29871 +WARNING 2025-09-04 18:14:35,644 log 89258 6221492224 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:35,644 basehttp 89258 6221492224 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:14:53,597 autoreload 89258 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/hospital_management/urls.py changed, reloading. +INFO 2025-09-04 18:14:54,023 autoreload 90522 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:14:55,234 basehttp 90522 6124810240 "GET /en/blood-bank HTTP/1.1" 301 0 +INFO 2025-09-04 18:14:55,287 basehttp 90522 6141636608 "GET /en/blood-bank/ HTTP/1.1" 200 28906 +WARNING 2025-09-04 18:14:55,300 log 90522 6141636608 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-09-04 18:14:55,300 basehttp 90522 6141636608 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 2668 +INFO 2025-09-04 18:14:55,405 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:15:55,672 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +ERROR 2025-09-04 18:16:25,112 log 90522 6141636608 Internal Server Error: /en/blood-bank/donors/create/ +Traceback (most recent call last): + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response + response = wrapped_callback(request, *callback_args, **callback_kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 59, in _view_wrapper + return view_func(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/views.py", line 140, in donor_create + return render(request, 'blood_bank/donor_form.html', {'form': form, 'title': 'Add New Donor'}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/shortcuts.py", line 25, in render + content = loader.render_to_string(template_name, context, request, using=using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader.py", line 61, in render_to_string + template = get_template(template_name, using=using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/manus_project/hospital_management_system_v4/.venv/lib/python3.12/site-packages/django/template/loader.py", line 19, in get_template + raise TemplateDoesNotExist(template_name, chain=chain) +django.template.exceptions.TemplateDoesNotExist: blood_bank/donor_form.html +ERROR 2025-09-04 18:16:25,113 basehttp 90522 6141636608 "GET /en/blood-bank/donors/create/ HTTP/1.1" 500 95086 +INFO 2025-09-04 18:16:55,663 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:17:55,671 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:18:55,684 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:19:55,674 basehttp 90522 6141636608 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:20:40,072 autoreload 90522 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/views.py changed, reloading. +INFO 2025-09-04 18:20:40,444 autoreload 93059 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:20:44,002 basehttp 93059 6125350912 "GET /en/blood-bank/ HTTP/1.1" 200 28906 +INFO 2025-09-04 18:20:44,061 basehttp 93059 6125350912 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:21:44,671 basehttp 93059 6125350912 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:22:45,671 basehttp 93059 6125350912 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:23:46,671 basehttp 93059 6125350912 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:31:01,971 autoreload 97867 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 18:31:07,103 basehttp 97867 6124793856 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 105023 +INFO 2025-09-04 18:31:07,122 basehttp 97867 6192099328 "GET /static/admin/js/core.js HTTP/1.1" 200 6208 +INFO 2025-09-04 18:31:07,122 basehttp 97867 6175272960 "GET /static/admin/js/jquery.init.js HTTP/1.1" 200 347 +INFO 2025-09-04 18:31:07,122 basehttp 97867 6124793856 "GET /static/admin/css/changelists.css HTTP/1.1" 200 6878 +INFO 2025-09-04 18:31:07,123 basehttp 97867 6208925696 "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 200 9777 +INFO 2025-09-04 18:31:07,124 basehttp 97867 6124793856 "GET /static/admin/js/urlify.js HTTP/1.1" 200 7887 +INFO 2025-09-04 18:31:07,125 basehttp 97867 6175272960 "GET /static/admin/js/actions.js HTTP/1.1" 200 8076 +INFO 2025-09-04 18:31:07,125 basehttp 97867 6192099328 "GET /static/admin/js/prepopulate.js HTTP/1.1" 200 1531 +INFO 2025-09-04 18:31:07,129 basehttp 97867 6141620224 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:31:07,129 basehttp 97867 6175272960 "GET /static/admin/img/search.svg HTTP/1.1" 200 458 +INFO 2025-09-04 18:31:07,131 basehttp 97867 6158446592 "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 285314 +INFO 2025-09-04 18:31:07,133 basehttp 97867 6208925696 "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 325171 +INFO 2025-09-04 18:31:07,136 basehttp 97867 6208925696 "GET /static/admin/js/filters.js HTTP/1.1" 200 978 +INFO 2025-09-04 18:31:07,144 basehttp 97867 6208925696 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331 +INFO 2025-09-04 18:31:07,144 basehttp 97867 6158446592 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +INFO 2025-09-04 18:31:09,012 basehttp 97867 6158446592 "GET /en/admin/operating_theatre/surgicalnote/ HTTP/1.1" 200 105023 +INFO 2025-09-04 18:31:09,025 basehttp 97867 6158446592 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:31:11,845 basehttp 97867 6158446592 "GET /en/admin/blood_bank/adversereaction/ HTTP/1.1" 200 76655 +INFO 2025-09-04 18:31:11,858 basehttp 97867 6158446592 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:31:15,584 basehttp 97867 6158446592 "GET /en/admin/blood_bank/bloodcomponent/ HTTP/1.1" 200 74601 +INFO 2025-09-04 18:31:15,597 basehttp 97867 6158446592 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:31:18,496 basehttp 97867 6158446592 "GET /en/admin/blood_bank/bloodgroup/ HTTP/1.1" 200 74475 +INFO 2025-09-04 18:31:18,510 basehttp 97867 6158446592 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:31:18,737 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:31:26,689 basehttp 97867 6158446592 "GET /en/admin/blood_bank/bloodtest/ HTTP/1.1" 200 77034 +INFO 2025-09-04 18:31:26,706 basehttp 97867 6158446592 "GET /en/admin/jsi18n/ HTTP/1.1" 200 3342 +INFO 2025-09-04 18:32:20,735 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:34:17,738 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:36:17,736 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:38:17,741 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:39:17,750 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:40:17,743 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:42:17,743 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:43:17,749 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:45:17,746 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:47:17,750 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:49:17,741 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:51:17,742 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:53:17,741 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:54:17,746 basehttp 97867 6158446592 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:56:17,749 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:57:17,750 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 18:59:17,746 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:01:17,702 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:03:17,682 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:04:17,684 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:05:17,692 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:07:17,689 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:08:17,684 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:09:17,690 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:10:17,701 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:12:17,687 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:14:17,691 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:16:17,627 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:17:17,641 basehttp 97867 6124793856 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:17:57,803 autoreload 97867 8466948288 /Users/marwanalwali/manus_project/hospital_management_system_v4/blood_bank/models.py changed, reloading. +INFO 2025-09-04 19:17:58,222 autoreload 18782 8466948288 Watching for file changes with StatReloader +INFO 2025-09-04 19:18:13,010 basehttp 18782 6199914496 "GET /en/blood-bank/ HTTP/1.1" 200 48551 +INFO 2025-09-04 19:18:13,070 basehttp 18782 6199914496 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:18:32,510 basehttp 18782 6199914496 "GET /en/blood-bank/units/ HTTP/1.1" 200 84640 +INFO 2025-09-04 19:18:32,548 basehttp 18782 6199914496 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:18:41,898 basehttp 18782 6199914496 "GET /en/blood-bank/units/45/ HTTP/1.1" 200 31883 +INFO 2025-09-04 19:18:41,931 basehttp 18782 6199914496 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 +INFO 2025-09-04 19:19:32,572 basehttp 18782 6199914496 "GET /en/htmx/system-notifications/ HTTP/1.1" 200 3836 diff --git a/operating_theatre/__pycache__/forms.cpython-312.pyc b/operating_theatre/__pycache__/forms.cpython-312.pyc index cefa4e6b07ebdf190fcd09786d222675bcd2d9e1..53eae69839d81f06d551fe4e76c36dde905baf80 100644 GIT binary patch delta 11330 zcma)C2~Zs8mF}LKIhYw>I0ZC^Bu0Ya5W3NUICP^(Ajv|pgHj0gE%~Rh@)LY zB1dLBiO@z{!j*UxK>{w2!VmVG?XOk_@7`)()9LG+wiBjuiBzwz8?I!!)KimkH zyQGi5-+TZ2ulL^n|F7q<=h)x;fld6S$)soC@h*RaDu6cp_h(m_YEw2jr7Gb!B+bjv(?7NuK(o-~iXjM9^Vo-&V~P3bnE zr_Q72PiBMMxssZ7X|W4lXi57Uu$=5EE3yOAK>;szlOx z>C2|H@HybtGS{cr*Qe?<0+nZYWh>L7Jj)OTuWV$3+G!mjW>(IwYLHpId!{XrQNjN; z@c+XKfV~V0eF-rq%?#7W&gm0Nb(Da}x7dp;%bd5Wm>%Z)$}ZN>{N=dNGT%E0{3%<=5} zw=2N_Gt>Ln5Gzul1SY74*6Gu(k)BLRZj4VfQ2G?XgeeviQUs~1;QNe8REHF`%mt+z zG`STg*Fp{DoJN(?iym(@Q)JI)FU?LJQk-9}0zG|TItffG)29lt?Plz*v6eYm1+Mbd!tr-|AfT0O#;%ylFv>`3DlNwUBC*xqk+G$ZRm?9N(eyfTJsT!dfmNwPJ z6fi;K^dJivqGXw4%z1Yg)2%$lfN3efT8r&^x~Q@mOw7{(%Pa=`vf3MP@gm8B%48XU zoKV;87CM3+;OWHunKX2EO9F$fPSC_2ma1l}9Wwu*ZdxC;b zL__imvbw_~fK{;_q7G!asb|`V(00*=(dI}w2w?N#I6yx$sWtZZO`5F(3Agp80U`Xg zRTKKms6KN{zpTIJZ9^hu#Z+pw>9*B&F>@$$xJJqy(A+lIo@lwuj~fc!F0L3$uDe!0 z^3e0{n|Y%xFM6N#zTp2x%`hv~U)(pe@0$%*>!Zna5o29U$ruY`dd6h#ubZ?aUrZcI z{7(xvpqjL0Tx=d{9#MYFIS>Yp?V@4GAejcLWwQm}j6=rZgWojY)iSBeL5DRDbQrDu z`#!yAV^ZqbPi`Ah?lG*|^tR3zQ^McRL^}-aJNBA<<`rX3O}6Tl)meZ)(I|lOYPK3N zKcU8l+z+ zf^0p|ArM#4<8M6_2>9v)#OEpoN7CaO)OUKlTnmsmm)Fzk7kDlh;DT)e*WvODUJe$p z!|MtPo2YOJ2Qeog3L+=?&w5BW;P(msU@_-*b+}G@z#=??Sj>s;Hi7SiMQ`O=Jc5@O zr|SA#9Z>P1PEQBcqD#%K;KUBW?QwaXErKi9NkDbcp2hTd-MAk* z>IRXZ;CK0hC1KGW=ztz~`aKVILOc{jF3`de7^BnQ={qfusd^B#JUk2nEBZQ0+d6$7 z-V^NMh|AxK9d`M7PV~S)1rF*7#N*~fmmeiyBDEUO*4B9N0 zRr6|Du_cMiS6ddSOF@QB$=mqk1)Nk=2pv!3)A@`A9nYNMWi8?@Lmp_%=5rQk%w3Yh zEy>ASl9P`d=wBjVu&57((z~jR2<7tP?Nnc3aEh*$MFye%`l z#g?)4b9md97}s{B+ZV0OQ*5)5ujY5~HGC~!$Jbw0H=BBP+ILA;)ER7^^pd(ztAPVc zuv3(7t24r?E(kkv0*wKpr&o{@-2wzAf2*@i@U*rCWiy5VjD`?voIa0#0m0QR8>iy~ zWzTs7UW&^@obEOnH=Llx*%s&|vK3+?#J;nFGu#0YOa#@kMeOY82#}!YB!Sa`pvNuS zW++|=mn49}3&_bcWS_?!r}oH+GeoaT6o{PA<`SK5r;GSx4J`&`E&lZpkDQ2wPH&L7 z#6WtdpO=%7;1@bcz!!ih79cQu>F?@-u+``4cDg~Klkdd+0Csf~%!5C07Df{E_ypPH z_6iXBV7ln5nP9jk0uS*NHg!=>oFN1Scbh0DctoemjYF5ME;k+(M5h1|6i%n^9gLfy3HYjDhT1%pH+>!EsYmf&c0 z6m$Ds9zQp;jd8e-aphzKNZ1wR0r*3j5jG-hLcqiFo!0^ED$19YxY$Y)OhH_9Gw`Hm zHMa1zDFw%{8l1_PUUR(7I+qyaj>2RRJj@aUfF}YM0J}2Y;whv$5w-%{Nx{-KfL>*p zqkO7cvPujJ9b`N5su6Y|)BxP+#!@X42E+k;W{FP}?l>hLe@ADK)S*N@!cK%;2)hyX zAnZlhhp-=^0pJcE<~s`j4)|dQ7YK((uVOAhICsG3bCrk!SRU+z{QLd?dM!STu&g41 zE|JjTA3!BafZps~J*SC>=MEey=DaSLI~U;fk<_;rM25cX0cJU{D~iAICRuDDW<^O%NTu ziH#3+!a0ER2`J#`Ob3NcJ>WeqFLY4c#FcM&zhA0Y_mdknj?UDD%r#}eTvxW-(VJ6I zwwm*ZbTR^d4o&J%0f+Y;-bHxPVOLX|jjuN@Wqi$QqzyVgY^uSfIUVTUjf*4enx+mX zvbM{^w+cZ~*0%}X4tfm}uQ7zf`q)!hwO@c^4BRCcG)?hquuA8cNlW&C`ko>wNk5>8 ztyr0?|E)1&c-!#WE88w@ySX*e+#2cZiI(?{XFVKK12-1dFsAgm0$niQ^@=@;y9`sY zSMd=XnfEDTS`^ixWEH5Yx>R*DG1Bxv)NyP)t2vf{OgP-y?#DDBGm$Z6MRH1qg^8Tf zXin*^#K_SHA}&5c&PK!Qy2f+5V`dbyFs8KOz_4&7a4B%pA2~^)mEw3#FlI$&5@Sl9 z%k)Pp1LHXzv1DYXK-U&GAVk--jOVn*Y$%e-n6ej(xWmzP{CJKKOGBAV#*`B&s2o{4 zQBWBzsJwM5a`JR^vwOUNk7Xf$+0y)Mu#fAa1?z6MMs^;HY-t`ZI38P${36Db8!22rQa4e!K3cf` zW>;iab7brB@xl`^JMvdCrouV=@En1=t5KksG3Cz@n8S~iAm4!#dH)7Vkza;uaesa} z@+-hnX8GZHJzRqVm5eEMR$v}~E%Mhb-GTMU->~!mHX?r$)E{XWsrz2TlMT1RTO-F$ zfXVyWMl|_NO=$AV4=ZAuQM3vsb4GMVazB-9pppj^u`MXMoyB#@s~E9OAE`YO*>rTA zdmy%#>e&Yp-2El)?nj9MZR`-sEIZ0hX04vg-8h-MezLIku0fNkAJoSqR*&?fstm;` zR(fS+(T)(~oXNP%CRGNNA?9(&FoakSBvHQ0ew}3@L(`7;`UMZ^m3)U+S%^Dmn&zOO z^qxIgI;~39U!T$*Vx-7MTebpoRnD0N&3!7lw=SrZ8lGRL2NGyKu<19*n)t>-H%5XR zo82HQI|3c#VJJfeqZ4)?S?6?m;Ed#S%DS1vm!jhg&11!DcA&Hth2WMN*Q0`6UGTQZ zDi>)L!?NZ~7Z&6Mr;{FRoKBilgUfY4jsN5kP|=$?b9$M+ggd6&h9dwYeg)tYNOq(y zyVyR|K9YX5axArMKy}`5TW1>7Ms?}Kg%O>7WW}30`=r5qVar#y3^!dldFkZAiR_X$ zvrBGQR^KXot>l%Gi5;h+J5G&NItOYm>>b=2NiT{T?c>Js+v{p>)xNg>mHiX7r=zu} z$JV*01y)6ktKTxNiK&?!$G{fCNiXlsNWmk<{QPOVf-alOlzn7+*&w^1XrR*shlz5i zAsgud5)O=T-*(AL*cPv`f zWILkSj*0AwXm&+pP0d(#?U=bPqO1D?ovxnWX*39e>d9BJjXAwbjrVS0UZS@M`?qN! znbuyihjnAw^<(Cp5#7#s4;8BvQmiyn0jWL6`B|pB)D4+S$gnG<2Tdu`8{2gW@nmL* zZIsLzxfWg-Vy6?7q9JIIZkST^vnf8wrAm?BN})9seG2Kos#GgzOkh^`neI%VB2F}i=3J?P2pUqQ?_?%x$cm7nJsVSz z(J>ka>f}GCExxbYt2p9yA%G$u` zcEJrtKc&m-jRzJj*gW1}2zs@wY4LdB%t~96wL-Vs+sO;EM(Bn-rwCUQbd3x;6SCqV zk!qL@9^foen{jjaaS##T1AyR=mNk)96iq9dNGpz}6<<9$mbUrLwCbB=B6U|Zb=O$x zo&m$#=FG|DoQN^!w%K~2d$2o_zWVC%ar4I8NqLd{Q)5Zah|&3bQ|5#zKWfUKFs+E1 zR*ad71{9N!JIxx(ded6}UF}uXGp1{%8{M~3#<+0(fM(KQjTo{gt;rWNhB8K0JdrVG zwGZr=G?_0P8$5P(^T4q&(|XW=VQFy7gdyuqLlz2SDmHkf?^54HZfP{P^oh(dYZ+8C zm@aG_+<1O7?a{%pq(c$op-FRQM3+f-pn2a>bPOb;(PBUR6}ad(SqMq+5`P90r1#3p zq`T#5(y9uBWUa`M_EjX%cYlQ;9g^*eFK2*}r-c+D<(U((W=XL5XeF20mZzTfC)l}E zAf*N=RY*NY%BoJzR`HryIbI8?dAQGseqebYZyv7fRG=7=F{L>1x6ZZzF& zdhW!e(Q=_-upyFF9C7%@jec;ExdP!CiQ%o0)%>_o_+6H3aPL6f6P1&eH2lUeTsLOP zAE=%*TL$|^tRqd|NuRW&;Ae^9&a1X(vae;|5O3Cu*|$&F>!bGiG5fAa(eBr?BS()% zj+}_Vm1M=Kw=B+>mRWY1g=?WDZ6J~QnB73UFzPVz0TMretaUp1fZORLJxIbM3;7xX zh9B~6gb@Jv-WNaQxCO7*>4Z2+XB)TA?eW9T8WcsqFQ4K%fKSdbcNH47?&HK7R;|Cw zAbzw*p;q$+>^%#su4nIQSoJPIi#qG$!bEjii~*n>C2J)Ajt58oXtpR;VwQv)ML3S| zJixVh?gq@F2TpU4n_)+}l$cr?CLtuFbI@t0nLWCL;1)x^fp8H4tH`Bj1W(P^)YNInS5W*M!jBQ?5>BFq``2_vRo)jO;2y*HEiA~E& zf1nG5_bkiXHajE?0;C^d7~v8EP7>HBdVhQmUetwuTeiJ|jtN5%jw$}k^>QnYY5^^Jl3W_#A2*l44@iP>rR!it-dh!ww@0d}%9bhU|NlqcbiEtXB zO?sms6D<1A1y!sdtt{jcZzK5~gi!!#Tca)aclh>ugg+qs7s4MA{)Dh`bgAfAQ9yP2y?suUmpUHO|{VRCg?a#ei0EFU%)$l4RQq#9K^=~&W$Foc$}TYnI! zG@)$QF7iF;@2ktxsG({>YMzlkBJC{BVO^sw#ouOGdgGF^9QR5FP@5Vdil9SK0l*$h z{ozw6PyG%APKTRH_p$#dJyyCOG~}5wq`#D&GyD~+{28HL>MQdUP>pj{yfs$^lx0q; zD(577`5N|ubh7*iIR5kH&nj%#6rmnYRmSl3KcwDDJNumU-O5M2G+vD$mHIgCDz%|m z@1_;0o>@P~uEdw~11QNl_}t%u4l&Q;XWM=s#beUf*KW_E6M27+m+q|1V*hzmy^gR= z9Mpir18#3~V*COJ|6k<(4PgY~zOMc@au9M@>6h!*#_jfP>g%~1Rw~$^OFK6euz!@! zY|1dqb@mIJmTOwDt|0wzQ>La3i~lXjn=Xbe-~{C7_-=(#!_+1`rsym|k9n>18ENFYB3{Rl|p+*yf*2dEe-ds{W6ySm1f+Z=cypras@p9UcQN?x4s^2x#lz_|&#eA)!q= zUzY=vxMz^X8)6M}FT;fu!eJZLKkW>_5kpk6f-${}Gm zYT0E}%!cwsVfzBMf(Az5r-TeOr+RuQgN^8Z_C#arY$T!E!|PamHvCeP%Rp_@MwE0P zEBgK(PO()Xy|L%75ZGScdyuugfNFk#@GF2j=~((qTE4%vX+cP%p-PABnTQOR7#fGs z2xnKFU`&mlvNTXaE1ovv5$U)4vmuT1xBX8o=TK?_Vd1GF7e|3$Qb?~itcqJ$E-M9g zq>ow;^eYU9vDQ(5-qlh^LB90kgZlCZkv3~knemU7`{sOG<{ELQBRxdGnk%Ib4i%~$ z4hLzG@(&$kc`114SK$(D+JR7tP=cs8@5zZoXA#@{f2y~WvuvCmK zpb4R&pOap0yfYP(a0?rKttpc=VV~?QpNX$3Ht-Q;Kf5Wy&2I1B;8tQRG}+R^(<&l)>Zie@JlLT zE2)A;;U6P@4*-5b#=qhdWOw-hpBjn$$OV^L>b4sjQJggdxu%|aS`wpA2R^= nQk3k*d-@dC`cd)2ESom0zGA*){)oZyN3|;H>I27B9H{+&F8B6G delta 5564 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 BYF_{V diff --git a/operating_theatre/__pycache__/models.cpython-312.pyc b/operating_theatre/__pycache__/models.cpython-312.pyc index f1014383598ccd3ef019c049f932f7d2fd4b8dad..8650cbe35f983133e16c01d803a6c7e46fcf40ba 100644 GIT binary patch delta 3323 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 delta 2842 zcmZ`*eQ;FO6@T~b?%Pc^yTl{}5?NR%A`e0$1P}p{B$5OZH(v%Bruf|Kz9dUFyXk#z z30Xo{2h>TFk8on4Oj}5`DpT9)JX^JbsK|_3EZ7#~JPF!q9R@*2fSJ;1JJWma!fqym z`Qx|eo%?a_J-^>MH($Oi4!$6||KxII3heJ8m(l*8!PnhKM9Uu}0hC!Yj7#EABx_HN zTx-0PvB^a?!{2=#d&gWsp!0g+_4<5RG9}j%6kml$3+_(zSY=y$b*A^`UzMtR12Ia~ zi0;*5v@I0yhrI#6rg}rIUK)*ddPABw8VJO?LTa!$wTv!dM=_mieM)^}T~*_nrY4!t z2=n=5EB`g!w{}x-H_enocg}F`g3odnd@*JAs71&tz9xuy?(^>4KK0qQQJd(>AC-jcJi3j?D>HT#j)~Cc z@sObLvS)+U<*?;lvj~!VOk|d^eAWXt@*c$R9wF};>*p@8*i5$WpwT~nKFJ zBAkU2MWy7|#=nc!iPBm0{1ci>ev^BdnenW;#`179&{3@UH>i1;!37me4fh^KK_7iumjd<&6w2i8oMnA^Ulkm#wuSq}jmHk;dgO1N(WBGBC z2{S7WF}6OaSWkwHJ0JY3NY25PN)P!OI_FQdtzl<6Y0Rr4gw#M$br~^@NcC}%`~w!% z6eVidD6K}|X$|4Fb_S*;675bBoWVv-d$eVf8qhWREDk!NG^kRgrH4L;3%*64P3sDW zbkm{fv{esvs`NV?!Ys)Sx&!Si2%`u*%mrq_-)aiTb+}xUKb7m{j`4}%q8Tx!)m|jz zJUDzab1)FS$l$P;-0~W%@U0?OA@2K#JOmYWE5-kc@MPUD?@V85JDbjV@g{j0fmQWh zVgaT8cT#c|)8KSi)R4zAS=DeKli!mK(~h;Ogo0dn zl;?9T=5w6v@YDkO2*NwCvT>=?hvrSiZEKv*PJg&@hRk(Wg+r)KGe^}}D*d_|RDv<; z*F(_={UMHSgt5lE@-56X-GOi@f-OjiM0Hi8A`~@stV?V6du6NOMt+1e^%8#C8H`sl z3VB2Z-R%Ha3@dg zL`u;a&$}fZ9}8aG#gfJP^JzG)zUl@x?qhYui+%{UwJs&Y@J4F|qxwc`QFE%(n6A2r z`bd;PWk?MN`JIzJhsT~sJl+zC=ORhdeFzV4fu6PjvJaf?)12Mt;Js!GENY)cV$j^a zd;_O?2#2t{m@ZxI>I4qZ?*yK9}<_vt$eX zmd`*yI_@Fcjn&noxNWMgc^)pn>8*3?Ig?k|Vsla~64I4utJ10Znf6u6IZa*6 z%z97_u<{Kj)pQx-jpDk@a8y?!vCbBi(*Fri-8(mdrA%!IX(91f=OX&j)tpvC`u(|v zQ@Ac}TfWC|7~v}{vLm7(+}I(EiK5MMRdP?4PFoAFPB*UfzQ&#?<51$Hl^ifSchs}z z!g%+oeHNRIEw~>x^qsLgm__X(WOq*mU%!W}HNyS7Ny3iq3m zr3Wy6GXlOH$=;7^OuM=z5RS2j#D!l{tSiXmpMEyz7+a%FP!iiAUNFAWAA#vDc8Na~ zweZYy+gVLJcTQW%8Rk8kzcmv|*O@A|TYa0~%>o;D&Lnmtv9p>ahVZbP5b!q1e(X$& zA`p#5^d#A7W+w1NWp+$9UC@3Gi=iZ^%u4e1RPL)CsJ$+reZ3mGA^3k&e;XD6 diff --git a/operating_theatre/__pycache__/urls.cpython-312.pyc b/operating_theatre/__pycache__/urls.cpython-312.pyc index 7959966305c74c93bdec24108c119c5b2aae9cd5..ddffd1790ace7a4292030041383339739270e7e3 100644 GIT binary patch delta 1100 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 bO|^bdp-|7B>4J&cF+;DO>z)O}`q=p|mHk;A delta 18547 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 anKOoj)adQ(z`H4|QFc*~$>!5&;{O6x{3rJS diff --git a/operating_theatre/forms.py b/operating_theatre/forms.py index be3e48a7..6b8ef063 100644 --- a/operating_theatre/forms.py +++ b/operating_theatre/forms.py @@ -7,7 +7,7 @@ from django import forms from django.core.exceptions import ValidationError from django.utils import timezone from datetime import datetime, time, timedelta - +import json, re from accounts.models import User from patients.models import PatientProfile from .models import ( @@ -20,92 +20,157 @@ from .models import ( # OPERATING ROOM FORMS # ============================================================================ +def _list_to_text(value): + if isinstance(value, list): + return "\n".join(str(v) for v in value) + return "" if value in (None, "", []) else str(value) + +def _text_to_list(value): + if value is None: + return [] + raw = str(value).strip() + if not raw: + return [] + # Try JSON list first + try: + parsed = json.loads(raw) + if isinstance(parsed, list): + return [str(x).strip() for x in parsed if str(x).strip()] + except Exception: + pass + # Fallback: newline / comma split + items = [] + for line in raw.splitlines(): + for piece in line.split(","): + p = piece.strip() + if p: + items.append(p) + return items + class OperatingRoomForm(forms.ModelForm): """ - Form for creating and updating operating rooms. + Full form aligned to the panel template: + - exposes environment, capabilities, scheduling fields + - maps equipment_list & special_features (JSON) <-> textarea + - enforces tenant-scoped uniqueness of room_number + - validates temp/humidity ranges, and simple numeric sanity checks """ - class Meta: model = OperatingRoom fields = [ - 'room_number', 'room_name', 'room_type', 'floor_number', 'building', - 'room_size', 'equipment_list', 'special_features', - 'status', 'is_active', 'wing' + # Basic + 'room_number', 'room_name', 'room_type', 'status', + # Physical + 'floor_number', 'building', 'wing', 'room_size', 'ceiling_height', + # Environment + 'temperature_min', 'temperature_max', + 'humidity_min', 'humidity_max', + 'air_changes_per_hour', 'positive_pressure', + # Capabilities & equipment + 'supports_robotic', 'supports_laparoscopic', + 'supports_microscopy', 'supports_laser', + 'has_c_arm', 'has_ct', 'has_mri', 'has_ultrasound', 'has_neuromonitoring', + 'equipment_list', 'special_features', + # Scheduling / staffing + 'max_case_duration', 'turnover_time', 'cleaning_time', + 'required_nurses', 'required_techs', + 'is_active', 'accepts_emergency', ] widgets = { - 'room_number': forms.TextInput(attrs={ - 'class': 'form-control', - 'placeholder': 'e.g., OR-01' - }), - 'room_name': forms.TextInput(attrs={ - 'class': 'form-control', - 'placeholder': 'e.g., Main Operating Room 1' - }), - 'room_type': forms.Select(attrs={'class': 'form-control'}), - 'floor_number': forms.NumberInput(attrs={ - 'class': 'form-control', - 'min': 1, - 'max': 50 - }), - 'building': forms.TextInput(attrs={ - 'class': 'form-control', - 'placeholder': 'e.g., Main Building' - }), - 'room_size': forms.NumberInput(attrs={ - 'class': 'form-control', - 'min': 1, - 'max': 1000 - }), - 'equipment_list': forms.Textarea(attrs={ - 'class': 'form-control', - 'rows': 4, - 'placeholder': 'List available equipment...' - }), - 'special_features': forms.Textarea(attrs={ - 'class': 'form-control', - 'rows': 3, - 'placeholder': 'Special capabilities and features...' - }), - 'status': forms.Select(attrs={'class': 'form-control'}), - 'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}), - 'wing': forms.TextInput(attrs={ - 'class': 'form-control', - 'placeholder': 'e.g., East Wing' - }), + # Basic + 'room_number': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'e.g., OR-01', 'required': True}), + 'room_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'e.g., Main Operating Room 1', 'required': True}), + 'room_type': forms.Select(attrs={'class': 'form-control', 'required': True}), + 'status': forms.Select(attrs={'class': 'form-control', 'required': True}), + # Physical + 'floor_number': forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 200, 'required': True}), + 'building': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'e.g., Main Building'}), + 'wing': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'e.g., East Wing'}), + 'room_size': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 2000}), + 'ceiling_height': forms.NumberInput(attrs={'class': 'form-control', 'min': 1, 'max': 20}), + # Environment + 'temperature_min': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'temperature_max': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'humidity_min': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'humidity_max': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'air_changes_per_hour':forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 120}), + 'positive_pressure': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + # Capabilities & imaging + 'supports_robotic': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'supports_laparoscopic':forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'supports_microscopy': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'supports_laser': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'has_c_arm': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'has_ct': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'has_mri': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'has_ultrasound': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'has_neuromonitoring': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'equipment_list': forms.Textarea(attrs={'class': 'form-control', 'rows': 4, 'placeholder': 'One per line, or comma-separated…'}), + 'special_features': forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Hybrid OR, laminar flow, etc.'}), + # Scheduling / staffing + 'max_case_duration': forms.NumberInput(attrs={'class': 'form-control', 'min': 30, 'max': 1440}), + 'turnover_time': forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 240}), + 'cleaning_time': forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 240}), + 'required_nurses': forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 20}), + 'required_techs': forms.NumberInput(attrs={'class': 'form-control', 'min': 0, 'max': 20}), + 'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}), + 'accepts_emergency':forms.CheckboxInput(attrs={'class': 'form-check-input'}), } help_texts = { - 'room_number': 'Unique identifier for the operating room', - 'room_type': 'Type of procedures this room is designed for', - 'room_size': 'Size of the room in square meters', - 'equipment_list': 'List of permanently installed equipment', - 'special_features': 'Special features like imaging, robotics, etc.', + 'room_number': 'Unique identifier (per tenant). Letters, numbers, dashes.', + 'room_size': 'Square meters.', + 'temperature_min': 'Typical ORs: 18–26°C.', + 'humidity_min': 'Typical ORs: 30–60%.', + 'air_changes_per_hour': '20+ is common in OR standards.', } - + + def __init__(self, *args, **kwargs): + self.tenant = kwargs.pop('tenant', None) + super().__init__(*args, **kwargs) + if self.instance and self.instance.pk: + self.fields['equipment_list'].initial = _list_to_text(self.instance.equipment_list) + self.fields['special_features'].initial = _list_to_text(self.instance.special_features) + + # JSONField <-> textarea mapping + def clean_equipment_list(self): + return _text_to_list(self.cleaned_data.get('equipment_list')) + + def clean_special_features(self): + return _text_to_list(self.cleaned_data.get('special_features')) + def clean_room_number(self): - room_number = self.cleaned_data['room_number'] - - # Check for uniqueness within tenant - queryset = OperatingRoom.objects.filter(room_number=room_number) + room_number = (self.cleaned_data.get('room_number') or '').strip() + if not room_number: + return room_number + if not re.match(r'^[A-Za-z0-9\-]+$', room_number): + raise ValidationError('Room number may contain only letters, numbers, and dashes.') + # tenant-scoped uniqueness + qs = OperatingRoom.objects.all() + tenant = self.tenant or getattr(self.instance, 'tenant', None) + if tenant is not None: + qs = qs.filter(tenant=tenant) + qs = qs.filter(room_number__iexact=room_number) if self.instance.pk: - queryset = queryset.exclude(pk=self.instance.pk) - - if queryset.exists(): - raise ValidationError('Room number must be unique.') - + qs = qs.exclude(pk=self.instance.pk) + if qs.exists(): + raise ValidationError('Room number must be unique within the tenant.') return room_number - + def clean(self): - cleaned_data = super().clean() - status = cleaned_data.get('status') - is_active = cleaned_data.get('is_active') - - # Validate status and active state consistency - if not is_active and status not in ['OUT_OF_SERVICE', 'MAINTENANCE']: - raise ValidationError( - 'Inactive rooms must have status "Out of Service" or "Maintenance".' - ) - - return cleaned_data + cleaned = super().clean() + # Temperature/humidity ranges + tmin, tmax = cleaned.get('temperature_min'), cleaned.get('temperature_max') + hmin, hmax = cleaned.get('humidity_min'), cleaned.get('humidity_max') + if tmin is not None and tmax is not None and tmin >= tmax: + self.add_error('temperature_max', 'Maximum temperature must be greater than minimum temperature.') + if hmin is not None and hmax is not None and hmin >= hmax: + self.add_error('humidity_max', 'Maximum humidity must be greater than minimum humidity.') + # Simple sanity checks + for field, minv in [('max_case_duration', 1), ('turnover_time', 0), ('cleaning_time', 0)]: + v = cleaned.get(field) + if v is not None and v < minv: + self.add_error(field, f'{field.replace("_", " ").title()} must be ≥ {minv}.') + return cleaned # ============================================================================ diff --git a/operating_theatre/management/commands/__pycache__/or_data.cpython-312.pyc b/operating_theatre/management/commands/__pycache__/or_data.cpython-312.pyc index 5373f3f2d8183c42f42829fa90bd533aa5610e33..552f1bd92d58ec9f408512e5de7785b30885d3ec 100644 GIT binary patch literal 39363 zcmcG%3wT@CbtZZM0t7&S1VMoB7x*S5zTbL_FG-a65+9O9TZTa%Py$5)@&PD`2$-m8 zT2qdjP-$9IO;S^ddrjABqa>b2eau%S%{NWk^cEo45bMM@L z?SlhAG;L{azJbJj)_(7^_u6Z(z4qGc{7rg#8i!w7=-x%~vmEyy$Rq!{_Po2+LFisg6teMYTFin{ltewwVFi)8otedwiWKU%?IBh;>A$KZw zA#W;gA%7}=pV2jp=hdz#p~yb7fPl|7;Km?U9e7B8Js>}wopD*&ftvsiiOIl zN(HCnoRx3HUURDI0>>M_s+g+AGZW7m-o$5JQ1IppirEz2!e;}{VQ?;=2RNVL3n_d7 zUkG0jiz((y0GBe@%9jBykEN>ME8(kRG1Ytx;93UT_&tF4#!}Vs_3$;Ym`1({a5IBj z_*TGeu~hAR2Yj6@riz87#`ELA^$48G$m z<^(?g_#}f*@q>VeVyTAt5%@+~%xQiM@Hm4f_({NLVyVvZPr-MN#Z2)}1Ad0V=lN#= z+heJo;~nr#vzQs42kd07BkN;0CqFj!(Rscd@Pl~d*So3m__~y z;HwP2#xDW($5MTQ55Tv~Vm`@#3h;FX{|f(Uz`q(x^%?%x;QMtJ^8&vD_y&Vtpfm)UcTzr~)v z!+(iAzs!GyJ%5*fg+15#+w{DkovH_Js`#(+UwcC-A?Q>C3wbpuq>+XE9?!+oG_jEX zBPpbr|0Djj&nTu^_>IqSQ?2~#DE0T9s#z8P#%EMhZTuaCw)1}gw}byfXD8bHb%b}t z;JbkL@!vq~{#eL25psb4cFgy!�#kD!Jnv|K?{n{@*xtZ=}RpduT~vyZ4Yh!#0(u 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 HM!VM^F`pQP literal 29965 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 tQ~h&p*U!0@zcv;|jm59&erB{TU;N!yU( 0.6 - - if is_female: - first_name = random.choice(self.SAUDI_FEMALE_FIRST_NAMES) - gender = 'F' - else: - first_name = random.choice(self.SAUDI_MALE_FIRST_NAMES) - gender = 'M' - - last_name = random.choice(self.SAUDI_FAMILY_NAMES) - - # Create user for patient - username = f"patient_{first_name.lower()}_{i}" - user, _ = User.objects.get_or_create( - username=username, - defaults={ - 'email': f"{username}@example.com", - 'first_name': first_name, - 'last_name': last_name - } - ) - - # Create patient profile - patient, created = PatientProfile.objects.get_or_create( - user=user, - defaults={ - 'tenant': tenant, - 'patient_id': f"P{datetime.now().year}{i:06d}", - 'date_of_birth': fake.date_of_birth(minimum_age=18, maximum_age=80), - 'gender': gender, - 'blood_group': random.choice(['A+', 'A-', 'B+', 'B-', 'O+', 'O-', 'AB+', 'AB-']), - 'phone': f"+966{random.randint(500000000, 599999999)}", - 'email': user.email, - 'address': f"{random.randint(1, 999)} {random.choice(['King Fahd Road', 'Olaya Street', 'Tahlia Street'])}, {random.choice(self.SAUDI_CITIES)}", - 'emergency_contact_name': random.choice(self.SAUDI_MALE_FIRST_NAMES) + ' ' + last_name, - 'emergency_contact_phone': f"+966{random.randint(500000000, 599999999)}", - 'national_id': f"{random.randint(1000000000, 2999999999)}", - 'insurance_provider': random.choice(['Bupa', 'Tawuniya', 'MedGulf', 'Allianz', 'AXA']), - 'insurance_number': f"INS{random.randint(100000, 999999)}" - } - ) - - patients.append(patient) - - self.stdout.write(self.style.SUCCESS(f'Created {len(patients)} patients')) - return patients - - def create_surgical_note_templates(self, tenant): - """Create surgical note templates.""" - self.stdout.write('Creating surgical note templates...') - - specialties = ['GENERAL', 'CARDIAC', 'NEURO', 'ORTHOPEDIC', 'OBSTETRIC'] - - for specialty in specialties: - for template_type in ['Standard', 'Complex', 'Emergency']: - SurgicalNoteTemplate.objects.get_or_create( - tenant=tenant, - name=f"{specialty} - {template_type} Template", - defaults={ - 'description': f"Standard {template_type.lower()} template for {specialty.lower()} procedures", - 'specialty': specialty, - 'procedure_type': random.choice(self.SURGICAL_PROCEDURES.get(specialty, ['General'])), - 'preoperative_diagnosis_template': "Preoperative Diagnosis: [Enter diagnosis]", - 'planned_procedure_template': "Planned Procedure: [Enter procedure]", - 'indication_template': "Indication: Patient presents with [symptoms] requiring intervention", - 'procedure_performed_template': "Procedure: [Describe procedure performed]", - 'surgical_approach_template': "Approach: [Describe approach]", - 'findings_template': "Findings: [Describe findings]", - 'technique_template': "Technique: Standard surgical technique employed", - 'postoperative_diagnosis_template': "Postoperative Diagnosis: [Enter diagnosis]", - 'is_active': True, - 'is_default': template_type == 'Standard' - } - ) - - self.stdout.write(self.style.SUCCESS('Created surgical note templates')) - - def create_operating_rooms(self, tenant, count=5): - """Create operating rooms.""" - self.stdout.write('Creating operating rooms...') + + if not last_cn: + return f"{prefix}0001" + + try: + last_num = int(last_cn.split('-')[-1]) + except Exception: + # Fallback if an unexpected format is found + last_num = 0 + return f"{prefix}{last_num + 1:04d}" + + def _create_operating_rooms(self, tenant, rooms_target): rooms = [] - - room_types = ['GENERAL', 'CARDIAC', 'NEURO', 'ORTHOPEDIC', 'OBSTETRIC'] - - for i in range(1, count + 1): - room_type = room_types[(i-1) % len(room_types)] - - room = OperatingRoom.objects.create( + room_types = [choice[0] for choice in OperatingRoom.ROOM_TYPE_CHOICES] + for idx in range(1, rooms_target + 1): + rt = random.choice(room_types) + building = random.choice(SAUDI_BUILDINGS) + wing = random.choice(SAUDI_WINGS) + + has_c_arm = rt in {"ORTHOPEDIC", "TRAUMA", "VASCULAR", "THORACIC", "UROLOGY"} + supports_robotic = rt in {"UROLOGY", "GENERAL", "GYNE", "ORTHOPEDIC", "CARDIAC", "TRANSPLANT", "THORACIC", "NEURO", "PLASTIC"} + has_ultrasound = rt in {"GENERAL", "UROLOGY", "OBSTETRIC", "VASCULAR"} + + equipment_list = [e[0] for e in random_equipment_set(rt, supports_robotic, has_c_arm, has_ultrasound)] + features = random.sample(ROOM_FEATURES, k=min(len(ROOM_FEATURES), random.randint(3, 6))) + + room = OperatingRoom( tenant=tenant, - room_number=f"OR-{i:03d}", - room_name=f"{room_type.title()} Operating Room {i}", - room_type=room_type, - status='AVAILABLE', + room_number=f"OR-{idx:02d}", + room_name=f"Operating Room {idx}", + room_type=rt, + status="AVAILABLE", floor_number=random.randint(1, 4), - room_size=random.uniform(40, 80), - ceiling_height=random.uniform(3.0, 4.5), + room_size=round(random.uniform(35.0, 70.0), 1), + ceiling_height=round(random.uniform(2.8, 3.5), 1), temperature_min=18.0, - temperature_max=24.0, + temperature_max=26.0, humidity_min=30.0, humidity_max=60.0, - air_changes_per_hour=random.randint(20, 25), + air_changes_per_hour=random.choice([20, 25, 30]), positive_pressure=True, - equipment_list=self._get_equipment_list(room_type), - special_features=self._get_special_features(room_type), - has_c_arm=room_type in ['ORTHOPEDIC', 'NEURO'], - has_ct=room_type in ['NEURO', 'CARDIAC'] and random.random() > 0.5, - has_mri=room_type == 'NEURO' and random.random() > 0.7, - has_ultrasound=True, - has_neuromonitoring=room_type in ['NEURO', 'ORTHOPEDIC'], - supports_robotic=room_type in ['GENERAL', 'CARDIAC'] and random.random() > 0.4, - supports_laparoscopic=room_type in ['GENERAL', 'OBSTETRIC'], - supports_microscopy=room_type in ['NEURO', 'OPHTHALMOLOGY'], - max_case_duration=random.randint(240, 720), - turnover_time=random.randint(20, 45), - cleaning_time=random.randint(30, 60), - required_nurses=random.randint(2, 4), - required_techs=random.randint(1, 3), + equipment_list=equipment_list, + special_features=features, + has_c_arm=has_c_arm, + has_ct=False, + has_mri=False, + has_ultrasound=has_ultrasound, + has_neuromonitoring=rt in {"NEURO", "ORTHOPEDIC", "SPINE"}, + supports_robotic=supports_robotic, + supports_laparoscopic=True, + supports_microscopy=rt in {"NEURO", "PLASTIC", "ENT"}, + supports_laser=rt in {"UROLOGY", "ENT", "OPHTHALMOLOGY"}, + max_case_duration=random.choice([480, 540, 600]), + turnover_time=random.choice([25, 30, 35]), + cleaning_time=random.choice([40, 45, 50]), + required_nurses=random.choice([2, 3, 4]), + required_techs=random.choice([1, 2]), is_active=True, accepts_emergency=True, - building=random.choice(['Main', 'East Wing', 'West Wing']), - wing=random.choice(['North', 'South', 'Central']) + building=building, + wing=wing, ) - rooms.append(room) - - self.stdout.write(self.style.SUCCESS(f'Created {len(rooms)} operating rooms')) - return rooms - - def _get_equipment_list(self, room_type): - """Get equipment list for room type.""" - basic = [ - "Anesthesia Machine", - "Patient Monitor", - "Surgical Lights", - "Operating Table", - "Electrocautery Unit" - ] - - specialized = { - 'CARDIAC': ["Heart-Lung Machine", "IABP"], - 'NEURO': ["Surgical Microscope", "Neuronavigation"], - 'ORTHOPEDIC': ["C-Arm", "Power Tools"], - 'GENERAL': ["Laparoscopic Tower", "Harmonic Scalpel"] - } - - equipment = basic.copy() - if room_type in specialized: - equipment.extend(specialized[room_type]) - - return equipment - - def _get_special_features(self, room_type): - """Get special features for room type.""" - features = ["Laminar Flow", "HEPA Filtration"] - - special = { - 'CARDIAC': ["Hybrid OR Capability"], - 'NEURO': ["Intraoperative MRI Compatible"], - 'ORTHOPEDIC': ["Class 100 Clean Room"], - 'OBSTETRIC': ["Neonatal Resuscitation Area"] - } - - if room_type in special: - features.extend(special[room_type]) - - return features - - def create_or_blocks_with_cases(self, room, users, patients, num_blocks, num_cases): - """Create OR blocks with surgical cases.""" - self.stdout.write(f'Creating blocks for {room.room_number}...') - - surgeons = [u for u in users if 'Dr.' in u.first_name or random.random() > 0.5] - nurses = [u for u in users if u not in surgeons] - - for block_num in range(num_blocks): - # Create OR block - block_date = timezone.now().date() + timedelta(days=random.randint(1, 30)) - start_hour = random.choice([7, 8, 9, 13]) - duration = random.randint(2, 6) - - block = ORBlock.objects.create( - operating_room=room, - date=block_date, - start_time=time(start_hour, 0), - end_time=time((start_hour + duration) % 24, 0), - block_type='SCHEDULED', - primary_surgeon=random.choice(surgeons), - service=room.room_type, - status=random.choice(['SCHEDULED', 'ACTIVE', 'COMPLETED']), - allocated_minutes=duration * 60, - used_minutes=random.randint(duration * 45, duration * 60), - special_equipment=random.sample(self.MEDICAL_EQUIPMENT, k=random.randint(0, 2)), - notes=f"Block for {room.room_type} procedures" + OperatingRoom.objects.bulk_create(rooms) + return list(OperatingRoom.objects.filter(tenant=tenant)) + + def _ensure_templates(self, tenant): + created = 0 + for specialty_code, specialty_label in SurgicalNoteTemplate.SPECIALTY_CHOICES: + name = f"Default {specialty_label} Template" + if not SurgicalNoteTemplate.objects.filter(tenant=tenant, name=name).exists(): + SurgicalNoteTemplate.objects.create( + tenant=tenant, + name=name, + description=f"Standardized note template for {specialty_label}.", + procedure_type=None, + specialty=specialty_code, + preoperative_diagnosis_template="Preoperative diagnosis: {{ diagnosis }}.", + planned_procedure_template="Planned procedure: {{ primary_procedure }}.", + indication_template="Indications include symptom severity and failed conservative management.", + procedure_performed_template="Procedure performed as planned with appropriate variations.", + surgical_approach_template="Approach: {{ approach }} with standard sterile technique.", + findings_template="Key intraoperative findings noted.", + technique_template="Step-wise technique documented with hemostasis achieved.", + postoperative_diagnosis_template="Postoperative diagnosis similar to preoperative with noted changes.", + complications_template="No complications unless specified.", + specimens_template="Specimens sent to pathology as listed.", + implants_template="Implants, if any, listed with lot numbers.", + closure_template="Layered closure with appropriate sutures.", + postop_instructions_template="Routine postoperative instructions and follow-up plan.", + is_active=True, + is_default=(specialty_code == "ALL"), + usage_count=0, + created_by=None, + ) + created += 1 + return created + + def _create_day_blocks(self, tenant, the_day, rooms, count, block_type, surgeons, anesth_pool, time_window): + if count <= 0 or not rooms: + return 0 + + created = 0 + start_t, end_t = time_window + window_minutes = minutes_between(start_t, end_t) + + # Each block ~ 90–180 minutes + blocks_to_make = count + room_idx = 0 + + while blocks_to_make > 0 and room_idx < len(rooms): + room = rooms[room_idx] + room_idx += 1 + + # Decide number of blocks for this room for the day + per_room = random.randint(1, min(3, blocks_to_make)) + # Build non-overlapping blocks + cursor_minute = 0 + for _ in range(per_room): + if cursor_minute + 90 > window_minutes: + break + dur = random.choice([90, 120, 150, 180]) + if cursor_minute + dur > window_minutes: + dur = window_minutes - cursor_minute + if dur < 60: + break + + block_start = (datetime.combine(the_day, start_t) + timedelta(minutes=cursor_minute)).time() + block_end_dt = (datetime.combine(the_day, start_t) + timedelta(minutes=cursor_minute + dur)) + block_end = block_end_dt.time() + + # Assign primary surgeon + primary = choose_staff(surgeons, k=1) + if not primary: + continue + primary = primary[0] + + service = random.choice(list(SERVICE_TO_PROCEDURES.keys())) + ob = ORBlock( + operating_room=room, + date=the_day, + start_time=block_start, + end_time=block_end, + block_type=block_type, + primary_surgeon=primary, + service=service, + status="SCHEDULED", + allocated_minutes=0, # computed in save() + used_minutes=0, + special_equipment=[], + special_setup=None, + notes=f"{block_type.title()} block for {service} service.", + created_by=None, + ) + ob.save() + created += 1 + + # Occasionally add assistant surgeons + assistants = choose_staff(surgeons, k=random.choice([0, 1, 2]), exclude=[primary]) + if assistants: + ob.assistant_surgeons.add(*assistants) + + # Add special equipment hints + if room.supports_robotic and random.random() < 0.2: + ob.special_equipment.append("Robot Instruments Set") + if room.has_c_arm and random.random() < 0.3: + ob.special_equipment.append("C-Arm Ready") + if room.has_ultrasound and random.random() < 0.3: + ob.special_equipment.append("Intraop Ultrasound Probe") + + ob.save() + + cursor_minute += dur + room.turnover_time + + if created >= count: + break + if created >= count: + break + + return created + + def _populate_cases_for_block(self, tenant, block, count, surgeons, anesth_pool, nurses_pool, patients): + created_cases = 0 + created_usage = 0 + created_notes = 0 + + # Time slicing within the block for each case + block_start_dt = dt_in_ksa(block.date, block.start_time) + block_end_dt = dt_in_ksa(block.date, block.end_time) + available_minutes = int((block_end_dt - block_start_dt).total_seconds() // 60) + + # Estimate per-case minutes + per_case_estimates = [] + remaining = available_minutes + for i in range(count): + est = random.choice([60, 90, 120, 150]) + if i == count - 1: + est = max(45, remaining) + per_case_estimates.append(est) + remaining -= est + if remaining < 45 and i < count - 1: + # Reduce case count if not enough room + count = i + 1 + per_case_estimates = per_case_estimates[:count] + break + + current_start = block_start_dt + + for i in range(count): + est_minutes = per_case_estimates[i] + sched_start = current_start + # Keep end within block + est_end = sched_start + timedelta(minutes=est_minutes) + if est_end > block_end_dt: + est_end = block_end_dt + + # Staff + primary_surgeon = block.primary_surgeon + assistants = choose_staff(surgeons, k=random.choice([0, 1, 2]), exclude=[primary_surgeon]) + anesthesiologist = choose_staff(anesth_pool, k=1, exclude=[primary_surgeon] + assistants) + anesthesiologist = anesthesiologist[0] if anesthesiologist else None + circ_nurse = choose_staff(nurses_pool, k=1, exclude=[primary_surgeon] + assistants + ([anesthesiologist] if anesthesiologist else [])) + circ_nurse = circ_nurse[0] if circ_nurse else None + scrub_nurse = choose_staff(nurses_pool, k=1, exclude=[primary_surgeon] + assistants + ([anesthesiologist] if anesthesiologist else []) + ([circ_nurse] if circ_nurse else [])) + scrub_nurse = scrub_nurse[0] if scrub_nurse else None + + # Procedure selection by service + service = block.service + proc_triplet = random.choice(SERVICE_TO_PROCEDURES[service]) + primary_proc, secondary_proc_list, cpts = proc_triplet + + case_type = probable_case_type(service) + approach = pick_approach(service) + anesthesia = pick_anesthesia() + position = pick_position(service) + diagnosis, icd10s = random.choice(DIAGNOSES) + + patient = patients.order_by('?').first() + encounter = safe_get_encounter(patient) + admission = safe_get_admission(patient) if case_type != "ELECTIVE" and random.random() < 0.5 else None + + day = sched_start.date() + for attempt in range(5): + try: + case_number = self._next_case_number(tenant, day) + + sc = SurgicalCase( + or_block=block, + case_number=case_number, # <-- set explicitly (non-empty) + patient=patient, + primary_surgeon=primary_surgeon, + # assistants added after save + anesthesiologist=anesthesiologist, + circulating_nurse=circ_nurse, + scrub_nurse=scrub_nurse, + primary_procedure=primary_proc, + secondary_procedures=secondary_proc_list[:], + procedure_codes=cpts[:], + case_type=case_type, + approach=approach, + anesthesia_type=anesthesia, + scheduled_start=sched_start, + estimated_duration=est_minutes, + actual_start=None, + actual_end=None, + status="SCHEDULED", + diagnosis=diagnosis, + diagnosis_codes=icd10s[:], + clinical_notes="Patient optimized preoperatively. Informed consent obtained.", + special_equipment=[], + blood_products=random.sample(BLOOD_PRODUCTS, k=random.choice([0, 1, 2])), + implants=random.sample(IMPLANT_EXAMPLES, k=random.choice([0, 1, 2])), + patient_position=position, + complications=[], + estimated_blood_loss=None, + encounter=encounter, + admission=admission, + created_by=None, + ) + sc.save() + break # success + except IntegrityError: + # Someone else grabbed that number; try again with the next one + if attempt == 4: + raise + continue + # Optional: set realistic actual times (simulate some completed cases) + if random.random() < 0.4: + delay = random.choice([0, 5, 10, 15]) + overrun = random.choice([-10, 0, 10, 20, 30]) + sc.actual_start = sc.scheduled_start + timedelta(minutes=delay) + sc.actual_end = sc.actual_start + timedelta(minutes=max(45, est_minutes + overrun)) + sc.status = "COMPLETED" + sc.estimated_blood_loss = random.choice([100, 150, 200, 300, 500]) + sc.save() + + created_cases += 1 + + # Equipment usage entries (a few per case) + eu_set = random_equipment_set( + service=service, + robotic=block.operating_room.supports_robotic and approach == "ROBOTIC", + has_c_arm=block.operating_room.has_c_arm, + has_ultrasound=block.operating_room.has_ultrasound, ) - - # Add assistant surgeons - if surgeons: - assistants = random.sample(surgeons, k=min(random.randint(0, 2), len(surgeons))) - block.assistant_surgeons.set(assistants) - - # Create surgical cases for this block - for case_num in range(random.randint(1, num_cases)): - self.create_surgical_case(block, patients, surgeons, nurses) - - def create_surgical_case(self, block, patients, surgeons, nurses): - """Create a surgical case.""" - procedure_type = block.service - procedures = self.SURGICAL_PROCEDURES.get(procedure_type, ['General Surgery']) - - case_time = datetime.combine(block.date, block.start_time) + timedelta(minutes=random.randint(0, 120)) - duration = random.randint(30, 240) - - case = SurgicalCase.objects.create( - or_block=block, - patient=random.choice(patients), - primary_surgeon=block.primary_surgeon, - anesthesiologist=random.choice(surgeons) if surgeons else block.primary_surgeon, - circulating_nurse=random.choice(nurses) if nurses else None, - scrub_nurse=random.choice(nurses) if nurses else None, - primary_procedure=random.choice(procedures), - secondary_procedures=[], - procedure_codes=[f"CPT{random.randint(10000, 99999)}" for _ in range(random.randint(1, 3))], - case_type=random.choice(['ELECTIVE', 'URGENT', 'EMERGENCY']), - approach=random.choice(['OPEN', 'LAPAROSCOPIC', 'ROBOTIC']), - anesthesia_type=random.choice(['GENERAL', 'REGIONAL', 'SPINAL']), - scheduled_start=timezone.make_aware(case_time), - estimated_duration=duration, - status=random.choice(['SCHEDULED', 'COMPLETED', 'IN_PROGRESS']), - diagnosis=self._get_diagnosis(), - diagnosis_codes=[f"ICD10-{random.choice(['K', 'I', 'M'])}{random.randint(10, 99)}.{random.randint(0, 9)}"], - clinical_notes="Patient prepared for surgery as per protocol", - special_equipment=random.sample(self.MEDICAL_EQUIPMENT, k=random.randint(0, 2)), - patient_position=random.choice(['SUPINE', 'PRONE', 'LATERAL']), - estimated_blood_loss=random.randint(10, 500) if random.random() > 0.5 else None - ) - - # Add assistant surgeons - if surgeons: - assistants = random.sample(surgeons, k=min(random.randint(0, 2), len(surgeons))) - case.assistant_surgeons.set(assistants) - - # Create surgical note for completed cases - if case.status == 'COMPLETED': - self.create_surgical_note(case) - - # Create equipment usage - self.create_equipment_usage(case) - - return case - - def _get_diagnosis(self): - """Get a random diagnosis.""" - diagnoses = [ - "Acute Appendicitis", - "Cholelithiasis", - "Inguinal Hernia", - "Coronary Artery Disease", - "Spinal Stenosis", - "Osteoarthritis", - "Brain Tumor", - "Breast Cancer" - ] - return random.choice(diagnoses) - - def create_surgical_note(self, case): - """Create surgical note for completed case.""" - SurgicalNote.objects.create( - surgical_case=case, - surgeon=case.primary_surgeon, - preoperative_diagnosis=case.diagnosis, - planned_procedure=case.primary_procedure, - indication="Symptomatic disease requiring surgical intervention", - procedure_performed=case.primary_procedure, - surgical_approach=f"{case.approach} approach utilized", - findings="As per preoperative diagnosis", - technique="Standard surgical technique employed", - postoperative_diagnosis=case.diagnosis, - condition=random.choice(['STABLE', 'GOOD', 'FAIR']), - disposition=random.choice(['RECOVERY', 'ICU', 'WARD']), - complications="None", - estimated_blood_loss=case.estimated_blood_loss or random.randint(10, 200), - specimens="Sent to pathology" if random.random() > 0.5 else None, - closure="Layered closure with absorbable sutures", - postop_instructions="Standard postoperative care protocol", - follow_up="2 weeks in surgical clinic", - status='SIGNED', - signed_datetime=timezone.now() - ) - - def create_equipment_usage(self, case): - """Create equipment usage records.""" - equipment_types = [ - ('Surgical Drape Set', 'DISPOSABLE', 1, 'SET', 150.00), - ('Harmonic Scalpel', 'SURGICAL_INSTRUMENT', 1, 'EACH', 2500.00), - ('Suture Pack', 'DISPOSABLE', 3, 'PACK', 75.00), - ('Surgical Gloves', 'DISPOSABLE', 10, 'PAIR', 5.00) - ] - - for name, eq_type, qty, unit, cost in random.sample(equipment_types, k=random.randint(2, 4)): - EquipmentUsage.objects.create( - surgical_case=case, - equipment_name=name, - equipment_type=eq_type, - manufacturer=random.choice(['Medtronic', 'Johnson & Johnson', 'Stryker']), - quantity_used=qty, - unit_of_measure=unit, - unit_cost=Decimal(str(cost)), - total_cost=Decimal(str(cost * qty)), - lot_number=f"LOT{random.randint(10000, 99999)}", - expiration_date=timezone.now().date() + timedelta(days=random.randint(180, 730)), - sterilization_date=timezone.now().date() - timedelta(days=random.randint(1, 7)), - recorded_by=case.primary_surgeon + for (eq_name, eq_type, manu, model) in random.sample(eu_set, k=min(len(eu_set), random.randint(2, 5))): + started = sc.scheduled_start + timedelta(minutes=random.choice([0, 5, 10, 15])) + ended = started + timedelta(minutes=random.choice([20, 30, 45, 60])) + eu = EquipmentUsage( + surgical_case=sc, + equipment_name=eq_name, + equipment_type=eq_type, + manufacturer=manu, + model=model, + quantity_used=random.choice([1, 1, 2]), + unit_of_measure="EACH", + start_time=started if random.random() < 0.8 else None, + end_time=ended if random.random() < 0.7 else None, + unit_cost=random.choice([None, 250.00, 500.00, 1200.00]), + total_cost=None, + lot_number=str(uuid.uuid4())[:8] if random.random() < 0.4 else None, + expiration_date=None, + sterilization_date=block.date - timedelta(days=random.randint(1, 14)) if random.random() < 0.5 else None, + notes=None, + recorded_by=primary_surgeon if random.random() < 0.3 else None, + ) + eu.save() + created_usage += 1 + + # Surgical Note (draft or completed) + note_status = random.choice(["DRAFT", "COMPLETED", "SIGNED"]) + tmpl = SurgicalNoteTemplate.objects.filter(tenant=tenant, is_active=True).order_by('?').first() + sn = SurgicalNote( + surgical_case=sc, + surgeon=primary_surgeon, + preoperative_diagnosis=f"{diagnosis}.", + planned_procedure=primary_proc, + indication="Worsening symptoms with failure of conservative management.", + procedure_performed=f"{primary_proc} performed; secondary procedures as indicated.", + surgical_approach=f"Approach: {approach}. Standard sterile preparation and draping.", + findings="Findings consistent with preoperative diagnosis.", + technique="Procedure completed in steps with meticulous hemostasis.", + postoperative_diagnosis=diagnosis, + condition=random.choice([c[0] for c in SurgicalNote.CONDITION_CHOICES]), + disposition=random.choice([d[0] for d in SurgicalNote.DISPOSITION_CHOICES]), + complications=None if sc.status == "COMPLETED" and random.random() < 0.7 else "Minor bleeding controlled with cautery.", + estimated_blood_loss=sc.estimated_blood_loss if sc.estimated_blood_loss else random.choice([None, 150, 200]), + blood_transfusion=None if random.random() < 0.7 else "1 unit PRBC transfused intraoperatively.", + specimens="Specimen sent to pathology as required." if random.random() < 0.5 else None, + implants=", ".join(sc.implants) if sc.implants else None, + drains="Closed-suction drain placed to dependent region." if random.random() < 0.3 else None, + closure="Layered closure with absorbable sutures; skin staples as needed.", + postop_instructions="Early ambulation, incentive spirometry, pain control, DVT prophylaxis.", + follow_up="Outpatient clinic in 1–2 weeks; sooner if concerns.", + status=note_status, + signed_datetime=( + timezone.now() if note_status == "SIGNED" else None + ), + template_used=tmpl, ) - - def print_summary(self, tenant): - """Print summary of generated data.""" - self.stdout.write("\n" + "="*60) - self.stdout.write(self.style.SUCCESS("Data Generation Summary")) - self.stdout.write("="*60) - - rooms = OperatingRoom.objects.filter(tenant=tenant) - blocks = ORBlock.objects.filter(operating_room__tenant=tenant) - cases = SurgicalCase.objects.filter(or_block__operating_room__tenant=tenant) - notes = SurgicalNote.objects.filter(surgical_case__or_block__operating_room__tenant=tenant) - equipment = EquipmentUsage.objects.filter(surgical_case__or_block__operating_room__tenant=tenant) - templates = SurgicalNoteTemplate.objects.filter(tenant=tenant) - - self.stdout.write(f"Tenant: {tenant.name}") - self.stdout.write(f"Operating Rooms: {rooms.count()}") - self.stdout.write(f"OR Blocks: {blocks.count()}") - self.stdout.write(f"Surgical Cases: {cases.count()}") - self.stdout.write(f"Surgical Notes: {notes.count()}") - self.stdout.write(f"Equipment Usage Records: {equipment.count()}") - self.stdout.write(f"Surgical Templates: {templates.count()}") - self.stdout.write("="*60) \ No newline at end of file + sn.save() + created_notes += 1 + + # Move pointer for next case + current_start = est_end + timedelta(minutes=block.operating_room.turnover_time) + + # Update block used_minutes based on completed cases + used = 0 + for case in block.surgical_cases.all(): + if case.actual_start and case.actual_end: + used += int((case.actual_end - case.actual_start).total_seconds() // 60) + else: + used += case.estimated_duration + block.used_minutes = min(used, block.allocated_minutes or used) + block.status = "ACTIVE" if block.used_minutes > 0 else block.status + block.save() + + return created_cases, created_usage, created_notes \ No newline at end of file diff --git a/operating_theatre/migrations/0002_alter_surgicalnote_surgeon_and_more.py b/operating_theatre/migrations/0002_alter_surgicalnote_surgeon_and_more.py new file mode 100644 index 00000000..181aee6b --- /dev/null +++ b/operating_theatre/migrations/0002_alter_surgicalnote_surgeon_and_more.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.4 on 2025-09-04 15:07 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("operating_theatre", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name="surgicalnote", + name="surgeon", + field=models.ForeignKey( + help_text="Operating surgeon", + on_delete=django.db.models.deletion.CASCADE, + related_name="surgeon_surgical_notes", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="surgicalnote", + name="surgical_case", + field=models.OneToOneField( + help_text="Related surgical case", + on_delete=django.db.models.deletion.CASCADE, + related_name="surgical_notes", + to="operating_theatre.surgicalcase", + ), + ), + ] diff --git a/operating_theatre/migrations/__pycache__/0002_alter_surgicalnote_surgeon_and_more.cpython-312.pyc b/operating_theatre/migrations/__pycache__/0002_alter_surgicalnote_surgeon_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc081c89b293e096d8ad8d6139d6488480e1da16 GIT binary patch literal 1593 zcmcIky>Ht_6hD#@MbeUMOHR|Wv7y$EY&wYK)a~S=h>$of@@2q@7oou6th>k*$fHWq zapb85GGxqFbZW;I&OgvUpi?KJgNOr)4xPFQu(M?99VyB}WMu0NkMI5N-n-wu5B^aq z8Gx^?liv=$$pP?>FtU{&DW|(!`2k>nB?q)5{*@isRa%N9FvZEa`BvUlTdD+P@D;$h z=K$wPzB`)*I{%(1sopB|B}@HR7!NIpX#ojCn|12X^@~=C z=?}7c^5V{WJtB%rJ1{&TDD(*{ZftDafHt*58#$~P9Qqx*jU4KQgcXEEJbFC8llfIg z5PN^5z{~>*m%z#~{eU<<7?Nip(>)4#2N52t=o1Hp1Vf5k!sO7i6y9s1zfvTZ;Q1#u zaWE^5gSJsXjxX(|zRBf+T~)wrc6=(i`gm#Tb@l9oIRDU^XBtdygOC{z^4kv`!u2AA z-yZTeb7m0wqSkC7I6}Q1+UNV2^a#a-w)?&qANF2z@A21g@6q-ye6VwS`#vj9v6u_ zGe!^Mv-m4G6|MBgB}L3=X+h!4jTtv(6dA2Kn|l0aS07! z&<{f5!l$1#rgGFcANU6Eg-;<8{KsV#sZ9*t2M|%rv*wd}ukRN)okWP44}Rz3IT)%y zugBWz3uB|nK zZ4Q0xk@Qj00comMMBF5JO}J`br0w^mzs^nZHw-@EVyH-xbgBaB/', views.OperatingRoomDetailView.as_view(), name='operating_room_detail'), path('rooms//update/', views.OperatingRoomUpdateView.as_view(), name='operating_room_update'), path('rooms//delete/', views.OperatingRoomDeleteView.as_view(), name='operating_room_delete'), - + path("availability/check/", views.check_room_availability, name="check_room_availability"), + # ============================================================================ # SURGICAL NOTE TEMPLATE URLS (FULL CRUD - Master Data) # ============================================================================ @@ -55,6 +56,8 @@ urlpatterns = [ path('notes/', views.SurgicalNoteListView.as_view(), name='surgical_note_list'), path('notes/create/', views.SurgicalNoteCreateView.as_view(), name='surgical_note_create'), path('notes//', views.SurgicalNoteDetailView.as_view(), name='surgical_note_detail'), + path('notes//preview/', views.surgical_note_preview, name='surgical_note_preview'), + # Note: No update/delete views for surgical notes - append-only for clinical records # ============================================================================ @@ -75,8 +78,10 @@ urlpatterns = [ # ============================================================================ # ACTION URLS FOR WORKFLOW OPERATIONS # ============================================================================ - path('cases//start/', views.start_case, name='start_case'), - path('cases//complete/', views.complete_case, name='complete_case'), + # path('cases//start/', views.start_case, name='start_case'), + # path('cases//complete/', views.complete_case, name='complete_case'), + path('cases//start/', views.StartCaseView.as_view(), name='start_case'), + path('cases//complete/', views.CompleteCaseView.as_view(), name='complete_case'), path('notes//sign/', views.sign_note, name='sign_note'), path('rooms//update-status/', views.update_room_status, name='update_room_status'), diff --git a/operating_theatre/views.py b/operating_theatre/views.py index 180617b8..f7a0fa31 100644 --- a/operating_theatre/views.py +++ b/operating_theatre/views.py @@ -6,19 +6,23 @@ Implements appropriate access patterns for surgical and OR management workflows. from django.shortcuts import render, get_object_or_404, redirect from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from django.views import View from django.views.generic import ( ListView, DetailView, CreateView, UpdateView, DeleteView, TemplateView ) -from django.http import JsonResponse, HttpResponse -from django.db.models import Q, Count, Avg, Sum, F +from django.db.models import Q, Count, Avg, F, DurationField, ExpressionWrapper +from django.views.decorators.http import require_POST + from django.utils import timezone from django.contrib import messages from django.urls import reverse_lazy, reverse from django.core.paginator import Paginator from django.template.loader import render_to_string +from django.http import JsonResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponse from datetime import datetime, timedelta, date import json - +from django.utils import timezone +from django.utils.dateparse import parse_datetime, parse_date, parse_time from core.utils import AuditLogger from .models import ( OperatingRoom, ORBlock, SurgicalCase, SurgicalNote, @@ -35,95 +39,98 @@ from .forms import ( # ============================================================================ class OperatingTheatreDashboardView(LoginRequiredMixin, TemplateView): - """ - Main operating theatre dashboard with key metrics and recent activity. - """ template_name = 'operating_theatre/dashboard.html' - + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) tenant = self.request.user.tenant today = timezone.now().date() - - # Dashboard statistics + + # --- Stats --- context.update({ 'total_rooms': OperatingRoom.objects.filter( - tenant=tenant, - is_active=True + tenant=tenant, is_active=True ).count(), + 'rooms_available': OperatingRoom.objects.filter( - tenant=tenant, - is_active=True, - status='AVAILABLE' + tenant=tenant, is_active=True, status='AVAILABLE' ).count(), + 'rooms_in_use': OperatingRoom.objects.filter( - tenant=tenant, - is_active=True, - status='IN_USE' + tenant=tenant, is_active=True, status='OCCUPIED' # was IN_USE ).count(), + 'rooms_maintenance': OperatingRoom.objects.filter( - tenant=tenant, - is_active=True, - status='MAINTENANCE' + tenant=tenant, is_active=True, status='MAINTENANCE' ).count(), + 'cases_today': SurgicalCase.objects.filter( - admission__tenant=tenant, + or_block__operating_room__tenant=tenant, # was admission__tenant scheduled_start__date=today ).count(), + 'cases_in_progress': SurgicalCase.objects.filter( - admission__tenant=tenant, + or_block__operating_room__tenant=tenant, # was admission__tenant status='IN_PROGRESS' ).count(), + 'cases_completed_today': SurgicalCase.objects.filter( - admission__tenant=tenant, + or_block__operating_room__tenant=tenant, # was admission__tenant actual_end__date=today, status='COMPLETED' ).count(), + 'emergency_cases_today': SurgicalCase.objects.filter( - admission__tenant=tenant, + or_block__operating_room__tenant=tenant, # was admission__tenant scheduled_start__date=today, case_type='EMERGENCY' ).count(), + 'blocks_today': ORBlock.objects.filter( operating_room__tenant=tenant, date=today ).count(), + 'equipment_in_use': EquipmentUsage.objects.filter( - surgical_case__admission__tenant=tenant, - # status='IN_USE' + surgical_case__or_block__operating_room__tenant=tenant + # add a real "in use" condition if you have one (e.g., end_time__isnull=True) ).count(), + 'notes_pending': SurgicalNote.objects.filter( - surgical_case__admission__tenant=tenant, + surgical_case__or_block__operating_room__tenant=tenant, status='DRAFT' ).count(), }) - - # Recent surgical cases - context['recent_cases'] = SurgicalCase.objects.filter( - admission__tenant=tenant - ).select_related( - 'patient', 'primary_surgeon', 'or_block__operating_room' - ).order_by('-scheduled_start')[:10] - - # Today's schedule - context['todays_schedule'] = SurgicalCase.objects.filter( - admission__tenant=tenant, - scheduled_start__date=today - ).select_related( - 'patient', 'primary_surgeon', 'or_block__operating_room' - ).order_by('scheduled_start') - - # Room utilization - # context['room_utilization'] = OperatingRoom.objects.filter( - # tenant=tenant, - # is_active=True - # ).annotate( - # cases_today=Count( - # 'or_block__surgical_cases', - # filter=Q(surgical_cases__scheduled_start__date=today) - # ) - # ).order_by('room_number') - + + # --- Recent cases --- + context['recent_cases'] = ( + SurgicalCase.objects + .filter(or_block__operating_room__tenant=tenant) + .select_related('patient', 'primary_surgeon', 'or_block', 'or_block__operating_room') + .order_by('-scheduled_start')[:10] + ) + + # --- Today’s schedule --- + context['todays_schedule'] = ( + SurgicalCase.objects + .filter(or_block__operating_room__tenant=tenant, scheduled_start__date=today) + .select_related('patient', 'primary_surgeon', 'or_block', 'or_block__operating_room') + .order_by('scheduled_start') + ) + + # --- Room utilization (cases today per room) --- + context['room_utilization'] = ( + OperatingRoom.objects + .filter(tenant=tenant, is_active=True) + .annotate( + cases_today=Count( + 'or_blocks__surgical_cases', + filter=Q(or_blocks__surgical_cases__scheduled_start__date=today) + ) + ) + .order_by('room_number') + ) + return context @@ -184,6 +191,9 @@ class OperatingRoomListView(LoginRequiredMixin, ListView): return context + + + class OperatingRoomDetailView(LoginRequiredMixin, DetailView): """ Display detailed information about an operating room. @@ -191,77 +201,115 @@ class OperatingRoomDetailView(LoginRequiredMixin, DetailView): model = OperatingRoom template_name = 'operating_theatre/rooms/operating_room_detail.html' context_object_name = 'operating_room' - + def get_queryset(self): + # tenant scoping return OperatingRoom.objects.filter(tenant=self.request.user.tenant) - + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) operating_room = self.object today = timezone.now().date() - - # Get today's cases for this room - context['todays_cases'] = operating_room.surgical_cases.filter( - scheduled_start_time__date=today - ).select_related('patient', 'primary_surgeon').order_by('scheduled_start_time') - - # Get recent cases - context['recent_cases'] = operating_room.surgical_cases.all().select_related( - 'patient', 'primary_surgeon' - ).order_by('-scheduled_start_time')[:10] - - # Get equipment usage - context['equipment_usage'] = EquipmentUsage.objects.filter( - operating_room=operating_room, - tenant=self.request.user.tenant - ).order_by('-start_time')[:10] - + + # Base QS for cases in this room + room_cases = ( + SurgicalCase.objects + .filter(or_block__operating_room=operating_room) + .select_related('patient', 'primary_surgeon', 'or_block', 'or_block__operating_room') + ) + + # Today's cases + context['todays_cases'] = ( + room_cases + .filter(scheduled_start__date=today) + .order_by('scheduled_start') + ) + + # Recent cases + context['recent_cases'] = room_cases.order_by('-scheduled_start')[:10] + + # Equipment usage for this room (scope via case -> block -> room) + context['equipment_usage'] = ( + EquipmentUsage.objects + .filter(surgical_case__or_block__operating_room=operating_room) + .select_related('surgical_case') + .order_by('-start_time')[:10] + ) + + # Average duration: (actual_end - actual_start) over completed cases + completed_cases = room_cases.filter(actual_start__isnull=False, actual_end__isnull=False) + duration_expr = ExpressionWrapper( + F('actual_end') - F('actual_start'), + output_field=DurationField() + ) + avg_duration = completed_cases.aggregate(avg_duration=Avg(duration_expr))['avg_duration'] + # Room statistics + now = timezone.now() context['room_stats'] = { - 'total_cases': operating_room.surgical_cases.count(), - 'cases_this_month': operating_room.surgical_cases.filter( - scheduled_start_time__month=timezone.now().month, - scheduled_start_time__year=timezone.now().year + 'total_cases': room_cases.count(), + 'cases_this_month': room_cases.filter( + scheduled_start__year=now.year, + scheduled_start__month=now.month ).count(), - 'average_case_duration': operating_room.surgical_cases.filter( - actual_end_time__isnull=False - ).aggregate( - avg_duration=Avg( - F('actual_end_time') - F('actual_start_time') - ) - )['avg_duration'], + 'average_case_duration': avg_duration, # a datetime.timedelta or None } - + return context class OperatingRoomCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): """ - Create a new operating room. + Create a new operating room (fields matched to the form/template). """ model = OperatingRoom form_class = OperatingRoomForm template_name = 'operating_theatre/rooms/operating_room_form.html' permission_required = 'operating_theatre.add_operatingroom' success_url = reverse_lazy('operating_theatre:operating_room_list') - + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['tenant'] = self.request.user.tenant + return kwargs + + def post(self, request, *args, **kwargs): + """ + Support 'Save as Draft' AJAX click from the template. + We return a JSON success without persisting anything (no draft model). + If you later want true draft saving, add a Draft model or a flag. + """ + if request.POST.get('save_draft') == 'true': + return JsonResponse({'success': True}) + return super().post(request, *args, **kwargs) + def form_valid(self, form): + """ + Attach tenant (and created_by if desired) then save. + """ form.instance.tenant = self.request.user.tenant + if hasattr(form.instance, 'created_by') and not form.instance.created_by_id: + form.instance.created_by = self.request.user + response = super().form_valid(form) - + # Log the action - AuditLogger.log_action( - user=self.request.user, - action='OPERATING_ROOM_CREATED', - model='OperatingRoom', - object_id=str(self.object.id), - details={ - 'room_number': self.object.room_number, - 'room_name': self.object.room_name, - 'room_type': self.object.room_type - } - ) - + try: + AuditLogger.log_event( + user=self.request.user, + action='OPERATING_ROOM_CREATED', + model='OperatingRoom', + object_id=str(self.object.pk), + details={ + 'room_number': self.object.room_number, + 'room_name': self.object.room_name, + 'room_type': self.object.room_type, + }, + ) + except Exception: + # keep UX smooth even if audit logging fails + pass + messages.success(self.request, f'Operating room "{self.object.room_number}" created successfully.') return response @@ -465,7 +513,7 @@ class SurgicalNoteTemplateUpdateView(LoginRequiredMixin, PermissionRequiredMixin response = super().form_valid(form) # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=self.request.user, action='SURGICAL_NOTE_TEMPLATE_UPDATED', model='SurgicalNoteTemplate', @@ -522,7 +570,7 @@ class ORBlockListView(LoginRequiredMixin, ListView): """ model = ORBlock template_name = 'operating_theatre/blocks/block_list.html' - context_object_name = 'or_blocks' + context_object_name = 'blocks' paginate_by = 25 def get_queryset(self): @@ -547,7 +595,7 @@ class ORBlockListView(LoginRequiredMixin, ListView): queryset = queryset.filter(operating_room_id=room_id) return queryset.select_related( - 'operating_room', 'surgeon' + 'operating_room', 'primary_surgeon', ).order_by('-date', 'start_time') def get_context_data(self, **kwargs): @@ -567,39 +615,39 @@ class ORBlockDetailView(LoginRequiredMixin, DetailView): """ model = ORBlock template_name = 'operating_theatre/blocks/block_detail.html' - context_object_name = 'or_block' + # context_object_name = 'block' def get_queryset(self): - return ORBlock.objects.filter(tenant=self.request.user.tenant) + return ORBlock.objects.filter(operating_room__tenant=self.request.user.tenant) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) or_block = self.object # Get cases scheduled in this block - context['scheduled_cases'] = SurgicalCase.objects.filter( - operating_room=or_block.operating_room, - scheduled_start_time__date=or_block.date, - scheduled_start_time__time__gte=or_block.start_time, - scheduled_start_time__time__lt=or_block.end_time, - tenant=self.request.user.tenant - ).select_related('patient', 'primary_surgeon').order_by('scheduled_start_time') - + scheduled_cases = SurgicalCase.objects.filter( + or_block__operating_room=or_block.operating_room, + scheduled_start__date=or_block.date, + scheduled_start__time__gte=or_block.start_time, + scheduled_start__time__lt=or_block.end_time, + or_block__operating_room__tenant=self.request.user.tenant + ).select_related('patient', 'primary_surgeon').order_by('scheduled_start') + context['scheduled_cases'] = scheduled_cases # Calculate utilization total_block_minutes = ( - timezone.datetime.combine(timezone.now().date(), or_block.end_time) - - timezone.datetime.combine(timezone.now().date(), or_block.start_time) + datetime.combine(timezone.now().date(), or_block.end_time) - + datetime.combine(timezone.now().date(), or_block.start_time) ).total_seconds() / 60 used_minutes = 0 - for case in context['scheduled_cases']: - if case.estimated_duration_minutes: - used_minutes += case.estimated_duration_minutes + for case in scheduled_cases: + if case.estimated_duration: + used_minutes += case.estimated_duration context['utilization_percentage'] = ( (used_minutes / total_block_minutes) * 100 if total_block_minutes > 0 else 0 ) - + context['total_block_minutes'] = total_block_minutes return context @@ -618,7 +666,7 @@ class ORBlockCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView) response = super().form_valid(form) # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=self.request.user, action='OR_BLOCK_CREATED', model='ORBlock', @@ -640,7 +688,7 @@ class ORBlockUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView) """ model = ORBlock fields = ['start_time', 'end_time', 'notes'] # Restricted fields - template_name = 'operating_theatre/or_block_update_form.html' + template_name = 'operating_theatre/or_block_form.html' permission_required = 'operating_theatre.change_orblock' def get_queryset(self): @@ -677,65 +725,64 @@ class SurgicalCaseListView(LoginRequiredMixin, ListView): List all surgical cases with filtering and search. """ model = SurgicalCase - template_name = 'operating_theatre/surgical_case_list.html' + template_name = 'operating_theatre/cases/surgical_case_list.html' context_object_name = 'surgical_cases' paginate_by = 25 - + def get_queryset(self): tenant = self.request.user.tenant - queryset = SurgicalCase.objects.filter(admission__tenant=tenant) - - # Search functionality - search = self.request.GET.get('search') + qs = SurgicalCase.objects.filter(admission__tenant=tenant) + + # Search + search = self.request.GET.get('search', '').strip() if search: - queryset = queryset.filter( - Q(patient__first_name__icontains=search) | - Q(patient__last_name__icontains=search) | - Q(patient__mrn__icontains=search) | - Q(procedure_name__icontains=search) - ) - - # Filter by status + # You can keep mrn fields if PatientProfile has them + name_q = Q(patient__first_name__icontains=search) | Q(patient__last_name__icontains=search) + mrn_q = Q(patient__mrn__icontains=search) + proc_q = Q(primary_procedure__icontains=search) + qs = qs.filter(name_q | mrn_q | proc_q) + + # Status status = self.request.GET.get('status') if status: - queryset = queryset.filter(status=status) - - # Filter by priority - priority = self.request.GET.get('priority') - if priority: - queryset = queryset.filter(priority=priority) - - # Filter by surgeon + qs = qs.filter(status=status) + + # Case type (your "priority" select) + case_type = self.request.GET.get('priority') + if case_type: + qs = qs.filter(case_type=case_type) + + # Surgeon surgeon_id = self.request.GET.get('surgeon') if surgeon_id: - queryset = queryset.filter(primary_surgeon_id=surgeon_id) - - # Filter by operating room + qs = qs.filter(primary_surgeon_id=surgeon_id) + + # Room (goes through ORBlock -> OperatingRoom) room_id = self.request.GET.get('room') if room_id: - queryset = queryset.filter(operating_room_id=room_id) - - # Filter by date range + qs = qs.filter(or_block__operating_room_id=room_id) + + # Date range (scheduled_start is a DateTimeField) date_from = self.request.GET.get('date_from') date_to = self.request.GET.get('date_to') if date_from: - queryset = queryset.filter(scheduled_start__date__gte=date_from) + qs = qs.filter(scheduled_start__date__gte=date_from) if date_to: - queryset = queryset.filter(scheduled_start__date__lte=date_to) - - return queryset.select_related( - 'patient', 'primary_surgeon', 'or_block__operating_room' - ).order_by('-scheduled_start') - + qs = qs.filter(scheduled_start__date__lte=date_to) + + return qs.select_related('patient', 'primary_surgeon', 'or_block__operating_room').order_by('-scheduled_start') + def get_context_data(self, **kwargs): + from django.contrib.auth import get_user_model + User = get_user_model() context = super().get_context_data(**kwargs) + tenant = self.request.user.tenant + context.update({ 'statuses': SurgicalCase.STATUS_CHOICES, - 'priorities': SurgicalCase.CASE_TYPE_CHOICES, - 'operating_rooms': OperatingRoom.objects.filter( - tenant=self.request.user.tenant, - is_active=True - ).order_by('room_number'), + 'case_types': SurgicalCase.CASE_TYPE_CHOICES, # renamed for clarity + 'operating_rooms': OperatingRoom.objects.filter(tenant=tenant, is_active=True).order_by('room_number'), + 'surgeons': User.objects.filter(tenant=tenant, is_active=True).order_by('first_name', 'last_name'), }) return context @@ -749,24 +796,24 @@ class SurgicalCaseDetailView(LoginRequiredMixin, DetailView): context_object_name = 'surgical_case' def get_queryset(self): - return SurgicalCase.objects.filter(tenant=self.request.user.tenant) + return SurgicalCase.objects.filter(or_block__operating_room__tenant=self.request.user.tenant) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) surgical_case = self.object # Get surgical notes for this case - context['surgical_notes'] = surgical_case.surgical_notes.all().order_by('-created_at') + context['surgical_notes'] = surgical_case.surgical_notes # Get equipment usage for this case context['equipment_usage'] = EquipmentUsage.objects.filter( surgical_case=surgical_case, - tenant=self.request.user.tenant + surgical_case__or_block__operating_room__tenant=self.request.user.tenant ).order_by('-start_time') # Calculate actual duration if case is completed - if surgical_case.actual_start_time and surgical_case.actual_end_time: - context['actual_duration'] = surgical_case.actual_end_time - surgical_case.actual_start_time + if surgical_case.actual_start and surgical_case.actual_end: + context['actual_duration'] = surgical_case.actual_end - surgical_case.actual_start return context @@ -811,7 +858,7 @@ class SurgicalCaseUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Update permission_required = 'operating_theatre.change_surgicalcase' def get_queryset(self): - return SurgicalCase.objects.filter(tenant=self.request.user.tenant) + return SurgicalCase.objects.filter(or_block__operating_room__tenant=self.request.user.tenant) def get_form_class(self): # Limit fields based on case status @@ -819,7 +866,7 @@ class SurgicalCaseUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Update # Limited fields for cases that have started class RestrictedSurgicalCaseForm(SurgicalCaseForm): class Meta(SurgicalCaseForm.Meta): - fields = ['status', 'notes', 'complications'] + fields = ['status', 'complications'] return RestrictedSurgicalCaseForm else: return SurgicalCaseForm @@ -855,8 +902,8 @@ class SurgicalNoteListView(LoginRequiredMixin, ListView): List all surgical notes with filtering and search. """ model = SurgicalNote - template_name = 'operating_theatre/notes/operative_note_list.html' - context_object_name = 'surgical_notes' + template_name = 'operating_theatre/notes/surgical_note_list.html' + context_object_name = 'notes' paginate_by = 25 def get_queryset(self): @@ -889,7 +936,7 @@ class SurgicalNoteListView(LoginRequiredMixin, ListView): queryset = queryset.filter(surgeon_id=surgeon_id) return queryset.select_related( - 'surgical_case__patient', 'surgeon', 'template' + 'surgical_case__patient', 'surgeon', 'template_used' ).order_by('-created_at') def get_context_data(self, **kwargs): @@ -906,11 +953,11 @@ class SurgicalNoteDetailView(LoginRequiredMixin, DetailView): Display detailed information about a surgical note. """ model = SurgicalNote - template_name = 'operating_theatre/notes/operative_note_detail.html' - context_object_name = 'surgical_note' + template_name = 'operating_theatre/notes/surgical_note_detail.html' + context_object_name = 'note' def get_queryset(self): - return SurgicalNote.objects.filter(tenant=self.request.user.tenant) + return SurgicalNote.objects.filter(surgeon__tenant=self.request.user.tenant) class SurgicalNoteCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): @@ -929,7 +976,7 @@ class SurgicalNoteCreateView(LoginRequiredMixin, PermissionRequiredMixin, Create response = super().form_valid(form) # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=self.request.user, action='SURGICAL_NOTE_CREATED', model='SurgicalNote', @@ -1008,7 +1055,7 @@ class EquipmentUsageDetailView(LoginRequiredMixin, DetailView): Display detailed information about equipment usage. """ model = EquipmentUsage - template_name = 'operating_theatre/equipment_usage_detail.html' + template_name = 'operating_theatre/equipment/equipment_detail.html' context_object_name = 'equipment_usage' def get_queryset(self): @@ -1062,7 +1109,7 @@ class EquipmentUsageUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Upda """ model = EquipmentUsage fields = ['status', 'end_time', 'notes'] # Restricted fields - template_name = 'operating_theatre/equipment_usage_update_form.html' + template_name = 'operating_theatre/equipment/equipment_form.html' permission_required = 'operating_theatre.change_equipmentusage' def get_queryset(self): @@ -1075,7 +1122,7 @@ class EquipmentUsageUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Upda response = super().form_valid(form) # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=self.request.user, action='EQUIPMENT_USAGE_UPDATED', model='EquipmentUsage', @@ -1167,92 +1214,144 @@ def case_search(request): # ============================================================================ # ACTION VIEWS # ============================================================================ +class StartCaseView(LoginRequiredMixin, PermissionRequiredMixin, View): + """ + Mark a scheduled case as IN_PROGRESS and set room status to OCCUPIED. + """ + permission_required = 'operating_theatre.change_surgicalcase' + + def post(self, request, pk): + case = get_object_or_404(SurgicalCase, pk=pk, admission__tenant=request.user.tenant) + if case.status != 'SCHEDULED': + messages.error(request, 'Only scheduled cases can be started.') + return redirect('operating_theatre:surgical_case_list') -@login_required -def start_case(request, case_id): - """ - Start a surgical case. - """ - if request.method == 'POST': - case = get_object_or_404( - SurgicalCase, - id=case_id, - tenant=request.user.tenant - ) - case.status = 'IN_PROGRESS' - case.actual_start_time = timezone.now() + if not case.actual_start: + case.actual_start = timezone.now() case.save() - - # Update room status - if case.operating_room: - case.operating_room.status = 'IN_USE' - case.operating_room.save() - - # Log the action - AuditLogger.log_action( - user=request.user, - action='SURGICAL_CASE_STARTED', - model='SurgicalCase', - object_id=str(case.case_id), - details={ - 'patient_name': f"{case.patient.first_name} {case.patient.last_name}", - 'procedure_name': case.procedure_name - } - ) - - messages.success(request, 'Surgical case started successfully.') - - if request.headers.get('HX-Request'): - return render(request, 'operating_theatre/partials/case_status.html', {'case': case}) - - return redirect('operating_theatre:surgical_case_detail', pk=case.pk) - - return JsonResponse({'success': False}) + + # Set room status + if case.or_block and case.or_block.operating_room: + room = case.or_block.operating_room + room.status = 'OCCUPIED' + room.save(update_fields=['status']) + + messages.success(request, f'Case {case.case_number} started.') + return redirect('operating_theatre:surgical_case_list') -@login_required -def complete_case(request, case_id): +class CompleteCaseView(LoginRequiredMixin, PermissionRequiredMixin, View): """ - Complete a surgical case. + Mark an in-progress case as COMPLETED and set room to CLEANING. """ - if request.method == 'POST': - case = get_object_or_404( - SurgicalCase, - id=case_id, - tenant=request.user.tenant - ) - + permission_required = 'operating_theatre.change_surgicalcase' + + def post(self, request, pk): + case = get_object_or_404(SurgicalCase, pk=pk, admission__tenant=request.user.tenant) + if case.status != 'IN_PROGRESS': + messages.error(request, 'Only in-progress cases can be completed.') + return redirect('operating_theatre:surgical_case_list') + case.status = 'COMPLETED' - case.actual_end_time = timezone.now() + if not case.actual_end: + case.actual_end = timezone.now() case.save() - - # Update room status - if case.operating_room: - case.operating_room.status = 'CLEANING' - case.operating_room.save() - - # Log the action - AuditLogger.log_action( - user=request.user, - action='SURGICAL_CASE_COMPLETED', - model='SurgicalCase', - object_id=str(case.case_id), - details={ - 'patient_name': f"{case.patient.first_name} {case.patient.last_name}", - 'procedure_name': case.procedure_name, - 'duration': str(case.actual_end_time - case.actual_start_time) if case.actual_start_time else None - } - ) - - messages.success(request, 'Surgical case completed successfully.') - - if request.headers.get('HX-Request'): - return render(request, 'operating_theatre/partials/case_status.html', {'case': case}) - - return redirect('operating_theatre:surgical_case_detail', pk=case.pk) - - return JsonResponse({'success': False}) + + # Set room status + if case.or_block and case.or_block.operating_room: + room = case.or_block.operating_room + room.status = 'CLEANING' + room.save(update_fields=['status']) + + messages.success(request, f'Case {case.case_number} marked as completed.') + return redirect('operating_theatre:surgical_case_list') + +# @login_required +# def start_case(request, case_id): +# """ +# Start a surgical case. +# """ +# if request.method == 'POST': +# case = get_object_or_404( +# SurgicalCase, +# id=case_id, +# tenant=request.user.tenant +# ) +# +# case.status = 'IN_PROGRESS' +# case.actual_start_time = timezone.now() +# case.save() +# +# # Update room status +# if case.operating_room: +# case.operating_room.status = 'IN_USE' +# case.operating_room.save() +# +# # Log the action +# AuditLogger.log_action( +# user=request.user, +# action='SURGICAL_CASE_STARTED', +# model='SurgicalCase', +# object_id=str(case.case_id), +# details={ +# 'patient_name': f"{case.patient.first_name} {case.patient.last_name}", +# 'procedure_name': case.procedure_name +# } +# ) +# +# messages.success(request, 'Surgical case started successfully.') +# +# if request.headers.get('HX-Request'): +# return render(request, 'operating_theatre/partials/case_status.html', {'case': case}) +# +# return redirect('operating_theatre:surgical_case_detail', pk=case.pk) +# +# return JsonResponse({'success': False}) +# +# +# @login_required +# def complete_case(request, case_id): +# """ +# Complete a surgical case. +# """ +# if request.method == 'POST': +# case = get_object_or_404( +# SurgicalCase, +# id=case_id, +# tenant=request.user.tenant +# ) +# +# case.status = 'COMPLETED' +# case.actual_end_time = timezone.now() +# case.save() +# +# # Update room status +# if case.operating_room: +# case.operating_room.status = 'CLEANING' +# case.operating_room.save() +# +# # Log the action +# AuditLogger.log_action( +# user=request.user, +# action='SURGICAL_CASE_COMPLETED', +# model='SurgicalCase', +# object_id=str(case.case_id), +# details={ +# 'patient_name': f"{case.patient.first_name} {case.patient.last_name}", +# 'procedure_name': case.procedure_name, +# 'duration': str(case.actual_end_time - case.actual_start_time) if case.actual_start_time else None +# } +# ) +# +# messages.success(request, 'Surgical case completed successfully.') +# +# if request.headers.get('HX-Request'): +# return render(request, 'operating_theatre/partials/case_status.html', {'case': case}) +# +# return redirect('operating_theatre:surgical_case_detail', pk=case.pk) +# +# return JsonResponse({'success': False}) @login_required @@ -1278,7 +1377,7 @@ def sign_note(request, note_id): note.save() # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=request.user, action='SURGICAL_NOTE_SIGNED', model='SurgicalNote', @@ -1318,7 +1417,7 @@ def update_room_status(request, room_id): room.save() # Log the action - AuditLogger.log_action( + AuditLogger.log_event( user=request.user, action='OPERATING_ROOM_STATUS_UPDATED', model='OperatingRoom', @@ -2474,36 +2573,36 @@ def update_room_status(request, room_id): # return render(request, 'operating_theatre/partials/or_stats.html', {'stats': stats}) # # -# @login_required -# def case_search(request): -# """ -# HTMX endpoint for surgical case search. -# """ -# search = request.GET.get('search', '') -# status = request.GET.get('status', '') -# priority = request.GET.get('priority', '') -# -# queryset = SurgicalCase.objects.filter(tenant=request.user.tenant) -# -# if search: -# queryset = queryset.filter( -# Q(patient__first_name__icontains=search) | -# Q(patient__last_name__icontains=search) | -# Q(patient__mrn__icontains=search) | -# Q(procedure_name__icontains=search) -# ) -# -# if status: -# queryset = queryset.filter(status=status) -# -# if priority: -# queryset = queryset.filter(priority=priority) -# -# cases = queryset.select_related( -# 'patient', 'primary_surgeon', 'operating_room' -# ).order_by('-scheduled_start_time')[:20] -# -# return render(request, 'operating_theatre/partials/case_list.html', {'cases': cases}) +@login_required +def case_search(request): + """ + HTMX endpoint for surgical case search. + """ + search = request.GET.get('search', '') + status = request.GET.get('status', '') + priority = request.GET.get('priority', '') + + queryset = SurgicalCase.objects.filter(tenant=request.user.tenant) + + if search: + queryset = queryset.filter( + Q(patient__first_name__icontains=search) | + Q(patient__last_name__icontains=search) | + Q(patient__mrn__icontains=search) | + Q(procedure_name__icontains=search) + ) + + if status: + queryset = queryset.filter(status=status) + + if priority: + queryset = queryset.filter(priority=priority) + + cases = queryset.select_related( + 'patient', 'primary_surgeon', 'operating_room' + ).order_by('-scheduled_start_time')[:20] + + return render(request, 'operating_theatre/partials/case_list.html', {'cases': cases}) # # # # ============================================================================ @@ -2684,3 +2783,250 @@ def update_room_status(request, room_id): # # # + +class SurgicalNotePreviewView(LoginRequiredMixin, View): + """ + Preview a surgical note before finalizing or signing. + Allows users to review the note content in a read-only format. + """ + model = SurgicalNote + template_name = 'operating_theatre/surgical_note_preview.html' + context_object_name = 'surgical_note' + + def get_queryset(self): + return SurgicalNote.objects.filter(tenant=self.request.user.tenant) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + surgical_note = self.object + + # Add surgical case information + context['surgical_case'] = surgical_note.surgical_case + + # Add template information if available + if surgical_note.template: + context['template'] = surgical_note.template + + # Check if user can sign the note + context['can_sign'] = ( + surgical_note.status == 'DRAFT' and + (surgical_note.created_by == self.request.user or + self.request.user.has_perm('operating_theatre.change_surgicalnote')) + ) + + # Check if user can edit the note + context['can_edit'] = ( + surgical_note.status == 'DRAFT' and + surgical_note.created_by == self.request.user + ) + + # Add signature information + context['signatures'] = surgical_note.signatures.all().order_by('signed_at') + + # Add related equipment usage + if surgical_note.surgical_case: + context['equipment_usage'] = EquipmentUsage.objects.filter( + surgical_case=surgical_note.surgical_case, + tenant=self.request.user.tenant + ).order_by('start_time') + + return context + + +@login_required +def surgical_note_preview(request, pk): + """ + AJAX endpoint for surgical note preview modal. + Returns rendered preview content for modal display. + """ + surgical_note = get_object_or_404( + SurgicalNote, + id=pk, + tenant=request.user.tenant + ) + + context = { + 'surgical_note': surgical_note, + 'surgical_case': surgical_note.surgical_case, + 'template': surgical_note.template_used, + 'signatures': surgical_note.signatures.all().order_by('signed_at'), + 'can_sign': ( + surgical_note.status == 'DRAFT' and + (surgical_note.surgeon == request.user or + request.user.has_perm('operating_theatre.change_surgicalnote')) + ), + 'can_edit': ( + surgical_note.status == 'DRAFT' and + surgical_note.surgeon == request.user + ), + } + + # Add equipment usage if available + if surgical_note.surgical_case: + context['equipment_usage'] = EquipmentUsage.objects.filter( + surgical_case=surgical_note.surgical_case, + tenant=request.user.tenant + ).order_by('start_time') + + return render(request, 'operating_theatre/partials/surgical_note_preview_modal.html', context) + + +def _parse_start(payload): + """ + Accepts either: + - payload['scheduled_start'] as ISO datetime string, or + - payload['date'] ('YYYY-MM-DD') + payload['start_time'] ('HH:MM' 24h) + Returns an aware datetime in the current timezone, or None. + """ + tz = timezone.get_current_timezone() + + # Prefer unified datetime + if payload.get("scheduled_start"): + dt = parse_datetime(payload["scheduled_start"]) + if dt is not None and timezone.is_naive(dt): + dt = timezone.make_aware(dt, tz) + return dt + + # Fallback: date + time + d = parse_date(payload.get("date") or "") + t = parse_time(payload.get("start_time") or "") + if d and t: + naive = timezone.datetime.combine(d, t) + return timezone.make_aware(naive, tz) + return None + + +@login_required +@require_POST +def check_room_availability(request): + """ + POST JSON: + { + "room_id": , + "duration": , + "scheduled_start": "YYYY-MM-DDTHH:MM[:SS]", + // OR: + "date": "YYYY-MM-DD", + "start_time": "HH:MM", + // Optional: + "case_id": + } + """ + # ---- Parse JSON body + try: + payload = json.loads(request.body.decode("utf-8")) + except Exception: + return HttpResponseBadRequest("Invalid JSON payload") + + room_id = payload.get("room_id") + duration = payload.get("duration") + case_id = payload.get("case_id") + + if not room_id or duration is None: + return HttpResponseBadRequest("room_id and duration are required") + + try: + duration = int(duration) + if duration <= 0: + raise ValueError + except ValueError: + return HttpResponseBadRequest("duration must be a positive integer (minutes)") + + start_dt = _parse_start(payload) + if start_dt is None: + return HttpResponseBadRequest( + "Provide either 'scheduled_start' (ISO) or 'date' + 'start_time'" + ) + + # ---- Tenant scope & room checks + room = get_object_or_404( + OperatingRoom.objects.select_related("tenant"), + pk=room_id, + tenant=request.user.tenant, + ) + + # If room is not usable, return fast + if not room.is_active: + return JsonResponse({ + "available": False, + "conflict_reason": "Room is inactive", + "conflicts": [], + }) + + if room.status in ("OUT_OF_ORDER", "MAINTENANCE", "CLOSED"): + return JsonResponse({ + "available": False, + "conflict_reason": f"Room status is {room.get_status_display()}", + "conflicts": [], + }) + + end_dt = start_dt + timedelta(minutes=duration) + + # ---- Find potentially overlapping cases + # We’ll fetch a reasonable window (same day +/- 1 day buffer) to reduce DB load, then check overlap in Python. + day_start = timezone.make_aware( + datetime.combine(start_dt.date(), datetime.min.time()), + timezone.get_current_timezone() + ) + day_end = day_start + timedelta(days=2) # small buffer to capture cross-midnight or long cases + + qs = SurgicalCase.objects.filter( + operating_room=room, + ).exclude( + status__in=["CANCELLED"] # adjust based on your enum + ) + + if case_id: + qs = qs.exclude(pk=case_id) + + # Try to use the most stable datetime field name(s) you’re using across the app: + # We saw both 'scheduled_start_time' and 'scheduled_start' in your templates; handle both. + # Pull candidates that start within the window or could overlap it. + # We'll just fetch cases for the surrounding window by their scheduled start field(s). + candidates = qs.filter( + Q(scheduled_start_time__gte=day_start, scheduled_start_time__lte=day_end) + | Q(scheduled_start__gte=day_start, scheduled_start__lte=day_end) + ).select_related("patient") + + conflicts = [] + for c in candidates: + # Determine the other case's start & duration field names robustly + other_start = getattr(c, "scheduled_start", None) or getattr(c, "scheduled_start_time", None) + if other_start is None: + continue + + other_duration = ( + getattr(c, "estimated_duration", None) + or getattr(c, "estimated_duration_minutes", None) + or 120 # sane default if not set + ) + try: + other_duration = int(other_duration) + except Exception: + other_duration = 120 + + other_end = other_start + timedelta(minutes=other_duration) + + # Check overlap: [start_dt, end_dt) intersects [other_start, other_end) + if (start_dt < other_end) and (end_dt > other_start): + conflicts.append({ + "id": c.pk, + "patient": getattr(c.patient, "get_full_name", lambda: str(c.patient))(), + "start": timezone.localtime(other_start).strftime("%Y-%m-%d %H:%M"), + "end": timezone.localtime(other_end).strftime("%Y-%m-%d %H:%M"), + "status": getattr(c, "status", "UNKNOWN"), + }) + + if conflicts: + return JsonResponse({ + "available": False, + "conflict_reason": "Overlaps existing case", + "conflicts": conflicts, + }) + + # No overlaps found + return JsonResponse({ + "available": True, + "conflict_reason": "", + "conflicts": [], + }) \ No newline at end of file diff --git a/or_data.py b/or_data.py index 7bda8dd9..167a31df 100644 --- a/or_data.py +++ b/or_data.py @@ -1,866 +1,1292 @@ +# """ +# Saudi-influenced data generator for Operating Theatre models. +# Generates realistic test data with Saudi Arabian healthcare context using English. +# +# Save this file as: operating_theatre/management/commands/generate_saudi_or_data.py +# """ +# +# import random +# from datetime import datetime, timedelta +# from decimal import Decimal +# from django.core.management.base import BaseCommand +# from django.contrib.auth import get_user_model +# from django.utils import timezone +# from faker import Faker +# from faker.providers import BaseProvider +# +# from core.models import Tenant, Department +# from accounts.models import User +# from patients.models import PatientProfile +# from operating_theatre.models import ( +# OperatingRoom, ORBlock, SurgicalCase, SurgicalNote, +# EquipmentUsage, SurgicalNoteTemplate +# ) +# +# User = get_user_model() +# +# # Custom Saudi provider for Faker +# class SaudiProvider(BaseProvider): +# """Custom provider for Saudi Arabian healthcare data in English.""" +# +# # Saudi male names (transliterated to English) +# saudi_male_first_names = [ +# 'Mohammed', 'Ahmed', 'Abdullah', 'Abdulrahman', 'Ali', 'Khalid', 'Saad', 'Fahd', 'Abdulaziz', +# 'Sultan', 'Turki', 'Bandar', 'Nawaf', 'Mishaal', 'Faisal', 'Salman', 'Abdulmajeed', 'Yasser', +# 'Omar', 'Hussam', 'Talal', 'Waleed', 'Majed', 'Rashid', 'Sami', 'Hisham', 'Adel', 'Kareem', +# 'Nasser', 'Mansour', 'Hamad', 'Badr', 'Zaid', 'Yazeed', 'Rayan', 'Osama', 'Tariq', 'Mazen' +# ] +# +# # Saudi female names (transliterated to English) +# saudi_female_first_names = [ +# 'Fatimah', 'Aisha', 'Khadijah', 'Maryam', 'Zainab', 'Sarah', 'Nora', 'Hind', 'Lateefah', 'Mona', +# 'Amal', 'Salma', 'Reem', 'Dana', 'Lina', 'Rana', 'Haya', 'Jawaher', 'Shahd', 'Ghada', +# 'Raghad', 'Asma', 'Hanan', 'Wafa', 'Iman', 'Samira', 'Nadia', 'Abeer', 'Suad', 'Layla', +# 'Nouf', 'Rania', 'Dina', 'Rima', 'Najla', 'Arwa', 'Lamya', 'Thuraya', 'Widad', 'Amina' +# ] +# +# # Saudi family names (transliterated) +# saudi_family_names = [ +# 'Al Saud', 'Al Otaibi', 'Al Qahtani', 'Al Ghamdi', 'Al Zahrani', 'Al Shehri', 'Al Anzi', 'Al Harbi', +# 'Al Mutairi', 'Al Dosari', 'Al Khalidi', 'Al Subaie', 'Al Rashid', 'Al Baqmi', 'Al Juhani', 'Al Asiri', +# 'Al Faisal', 'Al Maliki', 'Al Shammari', 'Al Balawi', 'Al Saadi', 'Al Thaqafi', 'Al Ahmadi', 'Al Salmi', +# 'Al Hasani', 'Al Omari', 'Al Fahd', 'Al Nuaimi', 'Al Rajhi', 'Al Olayan', 'Al Sudairi', 'Al Tamimi', +# 'Bin Laden', 'Bin Mahfouz', 'Al Amoudi', 'Al Gosaibi', 'Al Zamil', 'Al Juffali', 'Al Hokair' +# ] +# +# # Saudi cities +# saudi_cities = [ +# 'Riyadh', 'Jeddah', 'Mecca', 'Medina', 'Dammam', 'Khobar', 'Taif', +# 'Buraidah', 'Tabuk', 'Khamis Mushait', 'Hail', 'Jubail', 'Al Ahsa', 'Najran', 'Yanbu', +# 'Abha', 'Arar', 'Sakaka', 'Jazan', 'Qatif', 'Al Bahah', 'Rafha', 'Wadi Al Dawasir', +# 'Al Kharj', 'Hafar Al Batin', 'Al Qunfudhah', 'Unaizah', 'Al Majmaah', 'Dhahran' +# ] +# +# # Medical specialties +# medical_specialties = [ +# 'General Surgery', 'Cardiac Surgery', 'Neurosurgery', 'Orthopedic Surgery', 'Plastic Surgery', +# 'Urology', 'Pediatric Surgery', 'Vascular Surgery', 'Thoracic Surgery', 'Ophthalmology', +# 'ENT Surgery', 'Gynecology', 'Emergency Medicine', 'Anesthesiology', 'Radiology' +# ] +# +# # Common surgical procedures +# surgical_procedures = [ +# 'Laparoscopic Cholecystectomy', 'Appendectomy', 'Inguinal Hernia Repair', +# 'Thyroidectomy', 'Open Heart Surgery', 'Cardiac Catheterization', 'Knee Replacement', +# 'Hip Replacement', 'Mastectomy', 'Cataract Surgery', 'Tonsillectomy', 'Septoplasty', +# 'Hysterectomy', 'Cesarean Section', 'Prostatectomy', 'Lumbar Spine Surgery', +# 'Discectomy', 'Rhinoplasty', 'Liposuction', 'Hair Transplant', 'Kidney Stone Removal', +# 'Varicose Vein Surgery', 'Coronary Artery Bypass', 'Angioplasty', 'Gallbladder Surgery' +# ] +# +# # Medical equipment names +# medical_equipment = [ +# 'Ventilator', 'Cardiac Monitor', 'Defibrillator', 'Laparoscope', +# 'Endoscope', 'Portable X-Ray', 'Infusion Pump', 'Blood Pressure Monitor', +# 'Ultrasound Machine', 'Electrocautery Unit', 'Surgical Laser', +# 'Arthroscope', 'Dialysis Machine', 'Incubator', 'Physical Therapy Equipment', +# 'CT Scanner', 'MRI Machine', 'Anesthesia Machine', 'Operating Microscope' +# ] +# +# # Hospital departments +# hospital_departments = [ +# 'Emergency Department', 'Surgery Department', 'Internal Medicine', 'Pediatrics', 'Obstetrics & Gynecology', +# 'Orthopedics', 'Cardiology', 'Neurology', 'Ophthalmology', 'ENT Department', +# 'Dermatology', 'Psychiatry', 'Radiology', 'Laboratory', 'Pharmacy', +# 'Intensive Care Unit', 'Operating Theater', 'Outpatient Clinic' +# ] +# +# # Saudi hospital names +# saudi_hospitals = [ +# 'King Fahd University Hospital', 'King Khalid University Hospital', 'King Abdulaziz Medical City', +# 'King Faisal Specialist Hospital', 'Prince Sultan Military Medical City', 'King Saud Medical City', +# 'National Guard Health Affairs', 'Saudi German Hospital', 'Dr. Sulaiman Al Habib Medical Group', +# 'Dallah Healthcare', 'Mouwasat Medical Services', 'Al Hammadi Hospital' +# ] +# +# def saudi_male_name(self): +# """Generate a Saudi male name.""" +# first_name = self.random_element(self.saudi_male_first_names) +# family_name = self.random_element(self.saudi_family_names) +# return f"{first_name} {family_name}" +# +# def saudi_female_name(self): +# """Generate a Saudi female name.""" +# first_name = self.random_element(self.saudi_female_first_names) +# family_name = self.random_element(self.saudi_family_names) +# return f"{first_name} {family_name}" +# +# def saudi_city(self): +# """Generate a Saudi city name.""" +# return self.random_element(self.saudi_cities) +# +# def medical_specialty(self): +# """Generate a medical specialty.""" +# return self.random_element(self.medical_specialties) +# +# def surgical_procedure(self): +# """Generate a surgical procedure name.""" +# return self.random_element(self.surgical_procedures) +# +# def medical_equipment_name(self): +# """Generate medical equipment name.""" +# return self.random_element(self.medical_equipment) +# +# def hospital_department(self): +# """Generate hospital department name.""" +# return self.random_element(self.hospital_departments) +# +# def saudi_hospital_name(self): +# """Generate Saudi hospital name.""" +# return self.random_element(self.saudi_hospitals) +# +# def saudi_national_id(self): +# """Generate a Saudi national ID (10 digits starting with 1 or 2).""" +# first_digit = random.choice(['1', '2']) # 1 for Saudi, 2 for resident +# remaining_digits = ''.join([str(random.randint(0, 9)) for _ in range(9)]) +# return first_digit + remaining_digits +# +# def saudi_phone_number(self): +# """Generate a Saudi phone number.""" +# prefixes = ['050', '053', '054', '055', '056', '057', '058', '059'] +# prefix = random.choice(prefixes) +# number = ''.join([str(random.randint(0, 9)) for _ in range(7)]) +# return f"+966{prefix[1:]}{number}" +# +# def saudi_medical_license(self): +# """Generate Saudi medical license number.""" +# return f"SCFHS-{random.randint(10000, 99999)}" +# +# +# class Command(BaseCommand): +# help = 'Generate Saudi-influenced test data for Operating Theatre models' +# +# def __init__(self): +# super().__init__() +# self.fake = Faker(['en_US']) +# self.fake.add_provider(SaudiProvider) +# +# def add_arguments(self, parser): +# parser.add_argument( +# '--rooms', +# type=int, +# default=12, +# help='Number of operating rooms to create' +# ) +# parser.add_argument( +# '--cases', +# type=int, +# default=75, +# help='Number of surgical cases to create' +# ) +# parser.add_argument( +# '--notes', +# type=int, +# default=50, +# help='Number of surgical notes to create' +# ) +# parser.add_argument( +# '--templates', +# type=int, +# default=20, +# help='Number of surgical note templates to create' +# ) +# parser.add_argument( +# '--blocks', +# type=int, +# default=30, +# help='Number of OR blocks to create' +# ) +# parser.add_argument( +# '--equipment', +# type=int, +# default=60, +# help='Number of equipment usage records to create' +# ) +# parser.add_argument( +# '--tenant', +# type=str, +# default=None, +# help='Tenant name (will use random Saudi hospital if not provided)' +# ) +# +# def handle(self, *args, **options): +# self.stdout.write( +# self.style.SUCCESS('Starting Saudi-influenced Operating Theatre data generation...') +# ) +# +# # Get or create tenant +# tenant_name = options['tenant'] or self.fake.saudi_hospital_name() +# tenant = self.get_or_create_tenant(tenant_name) +# +# # Create users (doctors, nurses, etc.) +# users = self.create_users(tenant) +# +# # Create patients +# patients = self.create_patients(tenant) +# +# # Create operating rooms +# operating_rooms = self.create_operating_rooms(tenant, options['rooms']) +# +# # Create surgical note templates +# templates = self.create_surgical_note_templates(tenant, users, options['templates']) +# +# # Create OR blocks +# or_blocks = self.create_or_blocks(tenant, operating_rooms, users, options['blocks']) +# +# # Create surgical cases +# surgical_cases = self.create_surgical_cases( +# tenant, patients, users, operating_rooms, options['cases'] +# ) +# +# # Create surgical notes +# surgical_notes = self.create_surgical_notes( +# tenant, surgical_cases, users, templates, options['notes'] +# ) +# +# # Create equipment usage records +# equipment_usage = self.create_equipment_usage( +# tenant, surgical_cases, operating_rooms, options['equipment'] +# ) +# +# self.stdout.write( +# self.style.SUCCESS( +# f'Successfully generated Saudi-influenced data:\n' +# f'- {len(operating_rooms)} Operating Rooms\n' +# f'- {len(surgical_cases)} Surgical Cases\n' +# f'- {len(surgical_notes)} Surgical Notes\n' +# f'- {len(templates)} Note Templates\n' +# f'- {len(or_blocks)} OR Blocks\n' +# f'- {len(equipment_usage)} Equipment Usage Records\n' +# f'- Tenant: {tenant.name}' +# ) +# ) +# +# def get_or_create_tenant(self, tenant_name): +# """Get or create tenant.""" +# slug = tenant_name.lower().replace(' ', '-').replace('&', 'and') +# tenant, created = Tenant.objects.get_or_create( +# name=tenant_name, +# defaults={ +# 'slug': slug, +# 'is_active': True, +# 'subscription_plan': 'enterprise', +# 'max_users': 1000, +# 'country': 'Saudi Arabia', +# 'timezone': 'Asia/Riyadh' +# } +# ) +# if created: +# self.stdout.write(f'Created tenant: {tenant_name}') +# return tenant +# +# +# def create_users(self, tenant): +# """Create medical staff users with Saudi names.""" +# users = [] +# +# # Create surgeons +# for i in range(20): +# gender = random.choice(["M", "F"]) +# if gender == "M": +# full_name = self.fake.saudi_male_name() +# else: +# full_name = self.fake.saudi_female_name() +# +# name_parts = full_name.split() +# first_name = name_parts[0] +# last_name = " ".join(name_parts[1:]) if len(name_parts) > 1 else name_parts[0] +# +# username = f"dr_{first_name.lower()}_{i}" +# email = f"{username}@{tenant.slug}.sa" +# +# user = User.objects.create_user( +# username=username, +# email=email, +# first_name=first_name, +# last_name=last_name, +# tenant=tenant, +# is_active=True +# ) +# +# # Create user profile +# User.objects.create( +# user=user, +# title="Dr." if gender == "M" else "Dr.", +# specialty=self.fake.medical_specialty(), +# license_number=self.fake.saudi_medical_license(), +# phone_number=self.fake.saudi_phone_number(), +# department=self.fake.hospital_department(), +# is_verified=True, +# years_of_experience=random.randint(3, 25), +# education=f"MD from King Saud University, {random.choice(["Fellowship", "Residency"])} in {self.fake.medical_specialty()}" +# ) +# +# users.append(user) +# +# # Create anesthesiologists +# for i in range(10): +# gender = random.choice(["M", "F"]) +# if gender == "M": +# full_name = self.fake.saudi_male_name() +# else: +# full_name = self.fake.saudi_female_name() +# +# name_parts = full_name.split() +# first_name = name_parts[0] +# last_name = " ".join(name_parts[1:]) if len(name_parts) > 1 else name_parts[0] +# +# username = f"anesth_{first_name.lower()}_{i}" +# email = f"{username}@{tenant.slug}.sa" +# +# user = User.objects.create_user( +# username=username, +# email=email, +# first_name=first_name, +# last_name=last_name, +# tenant=tenant, +# is_active=True +# ) +# +# User.objects.create( +# user=user, +# title="Dr.", +# specialty="Anesthesiology", +# license_number=self.fake.saudi_medical_license(), +# phone_number=self.fake.saudi_phone_number(), +# department="Anesthesia Department", +# is_verified=True, +# years_of_experience=random.randint(5, 20), +# education=f"MD from {random.choice(["King Saud University", "King Abdulaziz University", "Imam Abdulrahman Bin Faisal University"])}" +# ) +# +# users.append(user) +# +# self.stdout.write(f"Created {len(users)} medical staff users with Saudi names") +# return users +# +# +# def create_patients(self, tenant): +# """Create patient records with Saudi demographics.""" +# patients = [] +# +# for i in range(150): +# gender = random.choice(["M", "F"]) +# if gender == "M": +# full_name = self.fake.saudi_male_name() +# else: +# full_name = self.fake.saudi_female_name() +# +# name_parts = full_name.split() +# first_name = name_parts[0] +# last_name = " ".join(name_parts[1:]) if len(name_parts) > 1 else name_parts[0] +# +# birth_date = self.fake.date_of_birth(minimum_age=1, maximum_age=85) +# +# patient = PatientProfile.objects.create( +# tenant=tenant, +# medical_record_number=f"MRN{random.randint(100000, 999999)}", +# first_name=first_name, +# last_name=last_name, +# date_of_birth=birth_date, +# gender=gender, +# national_id=self.fake.saudi_national_id(), +# phone_number=self.fake.saudi_phone_number(), +# email=f"patient{i}@email.com", +# address=f"{self.fake.street_address()}, {self.fake.saudi_city()}, Saudi Arabia", +# emergency_contact_name=self.fake.saudi_male_name() if random.choice( +# [True, False]) else self.fake.saudi_female_name(), +# emergency_contact_phone=self.fake.saudi_phone_number(), +# blood_type=random.choice(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]), +# nationality="Saudi Arabian" if random.random() > 0.3 else random.choice( +# ["Egyptian", "Pakistani", "Indian", "Bangladeshi", "Filipino"]), +# is_active=True +# ) +# +# patients.append(patient) +# +# self.stdout.write(f"Created {len(patients)} patients with Saudi demographics") +# return patients +# +# +# def create_operating_rooms(self, tenant, count): +# """Create operating rooms with Saudi hospital context.""" +# operating_rooms = [] +# +# room_types = [ +# ("GENERAL", "General Surgery OR"), +# ("CARDIAC", "Cardiac Surgery OR"), +# ("NEURO", "Neurosurgery OR"), +# ("ORTHOPEDIC", "Orthopedic Surgery OR"), +# ("PEDIATRIC", "Pediatric Surgery OR"), +# ("TRAUMA", "Trauma Surgery OR"), +# ("OPHTHALMOLOGY", "Eye Surgery OR"), +# ("ENT", "ENT Surgery OR") +# ] +# +# floors = ["2nd Floor - Surgical Wing", "3rd Floor - Cardiac Wing", "4th Floor - Specialty Wing"] +# +# for i in range(1, count + 1): +# room_type, room_name = random.choice(room_types) +# +# operating_room = OperatingRoom.objects.create( +# tenant=tenant, +# room_number=f"OR-{i:02d}", +# room_name=f"{room_name} {i}", +# room_type=room_type, +# floor=random.randint(2, 5), +# location=random.choice(floors), +# capacity=random.randint(10, 18), +# status=random.choice(["AVAILABLE", "IN_USE", "MAINTENANCE", "CLEANING"]), +# equipment_list=f"Ventilator, Cardiac Monitor, {self.fake.medical_equipment_name()}, Anesthesia Machine", +# special_requirements=f"Special requirements for {room_name.lower()}", +# is_active=True, +# last_maintenance=timezone.now().date() - timedelta(days=random.randint(1, 30)), +# next_maintenance=timezone.now().date() + timedelta(days=random.randint(30, 90)) +# ) +# +# operating_rooms.append(operating_room) +# +# self.stdout.write(f"Created {count} operating rooms") +# return operating_rooms +# +# +# def create_surgical_note_templates(self, tenant, users, count): +# """Create surgical note templates for common Saudi procedures.""" +# templates = [] +# +# specialties = [ +# "General Surgery", "Cardiac Surgery", "Neurosurgery", "Orthopedic Surgery", +# "Plastic Surgery", "Urology", "Pediatric Surgery", "Ophthalmology" +# ] +# +# for i in range(count): +# specialty = random.choice(specialties) +# procedure = self.fake.surgical_procedure() +# +# template = SurgicalNoteTemplate.objects.create( +# tenant=tenant, +# template_name=f"{procedure} Template", +# procedure_type=procedure, +# specialty=specialty, +# pre_operative_diagnosis_template=f"Pre-operative diagnosis for {procedure}", +# post_operative_diagnosis_template=f"Post-operative diagnosis following {procedure}", +# procedure_template=f"Detailed description of {procedure} procedure", +# findings_template=f"Expected findings for {procedure}", +# technique_template=f"Surgical technique used in {procedure}", +# complications_template="No complications noted", +# instructions_template=f"Post-operative instructions for {procedure}", +# created_by=random.choice(users), +# is_active=True, +# version=f"v{random.randint(1, 5)}.{random.randint(0, 9)}" +# ) +# +# templates.append(template) +# +# self.stdout.write(f"Created {count} surgical note templates") +# return templates +# +# +# def create_or_blocks(self, tenant, operating_rooms, users, count): +# """Create OR blocks (time slots) with Saudi working hours.""" +# or_blocks = [] +# +# # Saudi working hours: typically 7 AM to 3 PM for morning shift, 3 PM to 11 PM for evening +# working_hours = [ +# (7, 15), # Morning shift +# (15, 23), # Evening shift +# ] +# +# for i in range(count): +# start_date = timezone.now().date() + timedelta(days=random.randint(-15, 45)) +# shift_start, shift_end = random.choice(working_hours) +# +# start_hour = random.randint(shift_start, shift_end - 4) +# start_time = timezone.make_aware( +# datetime.combine(start_date, datetime.min.time().replace( +# hour=start_hour, +# minute=random.choice([0, 30]) +# )) +# ) +# end_time = start_time + timedelta(hours=random.randint(2, 6)) +# +# or_block = ORBlock.objects.create( +# tenant=tenant, +# operating_room=random.choice(operating_rooms), +# date=start_date, +# start_time=start_time.time(), +# end_time=end_time.time(), +# assigned_surgeon=random.choice(users), +# block_type=random.choice(["ELECTIVE", "EMERGENCY", "URGENT"]), +# specialty=self.fake.medical_specialty(), +# notes=f"OR Block {i + 1} - {self.fake.medical_specialty()}", +# is_active=True, +# utilization_rate=random.randint(70, 100) +# ) +# +# or_blocks.append(or_block) +# +# self.stdout.write(f"Created {count} OR blocks") +# return or_blocks +# +# +# def create_surgical_cases(self, tenant, patients, users, operating_rooms, count): +# """Create surgical cases with Saudi medical context.""" +# surgical_cases = [] +# +# priorities = ["ROUTINE", "URGENT", "EMERGENCY"] +# statuses = ["SCHEDULED", "IN_PROGRESS", "COMPLETED", "CANCELLED", "POSTPONED"] +# +# # Weight the statuses to be more realistic +# status_weights = [0.4, 0.1, 0.4, 0.05, 0.05] +# +# for i in range(count): +# scheduled_start = timezone.now() + timedelta( +# days=random.randint(-30, 30), +# hours=random.randint(7, 20), +# minutes=random.choice([0, 15, 30, 45]) +# ) +# +# status = random.choices(statuses, weights=status_weights)[0] +# actual_start = None +# actual_end = None +# +# if status in ["IN_PROGRESS", "COMPLETED"]: +# actual_start = scheduled_start + timedelta(minutes=random.randint(-15, 45)) +# +# if status == "COMPLETED": +# duration_hours = random.randint(1, 8) +# actual_end = actual_start + timedelta( +# hours=duration_hours, +# minutes=random.randint(0, 59) +# ) +# +# procedure = self.fake.surgical_procedure() +# priority = random.choices(priorities, weights=[0.7, 0.2, 0.1])[0] +# +# # Create case number with Saudi format +# case_number = f"CASE-{tenant.slug.upper()}-{timezone.now().year}-{i + 1:05d}" +# +# surgical_case = SurgicalCase.objects.create( +# tenant=tenant, +# case_number=case_number, +# patient=random.choice(patients), +# primary_surgeon=random.choice(users), +# anesthesiologist=random.choice(users), +# operating_room=random.choice(operating_rooms), +# procedure_name=procedure, +# scheduled_start_time=scheduled_start, +# scheduled_end_time=scheduled_start + timedelta(hours=random.randint(2, 8)), +# actual_start_time=actual_start, +# actual_end_time=actual_end, +# priority=priority, +# status=status, +# diagnosis=f"Diagnosis requiring {procedure}", +# notes=f"Surgical case notes for {procedure} - Patient from {self.fake.saudi_city()}", +# estimated_duration=timedelta(hours=random.randint(2, 6)), +# is_emergency=(priority == "EMERGENCY"), +# insurance_type=random.choice(["Government", "Private", "Self-Pay", "Company Insurance"]), +# consent_obtained=True if status != "SCHEDULED" else random.choice([True, False]) +# ) +# +# surgical_cases.append(surgical_case) +# +# self.stdout.write(f"Created {count} surgical cases") +# return surgical_cases +# +# +# def create_surgical_notes(self, tenant, surgical_cases, users, templates, count): +# """Create surgical notes with Saudi medical documentation standards.""" +# surgical_notes = [] +# +# # Only create notes for completed or in-progress cases +# eligible_cases = [case for case in surgical_cases if case.status in ["COMPLETED", "IN_PROGRESS"]] +# +# for i in range(min(count, len(eligible_cases))): +# case = eligible_cases[i] +# template = random.choice(templates) if templates and random.random() > 0.3 else None +# +# # Create realistic surgical note content +# complications = "No complications noted" if random.random() > 0.15 else random.choice([ +# "Minor bleeding controlled with electrocautery", +# "Slight tissue adhesions noted and carefully dissected", +# "Temporary hypotension managed with fluids" +# ]) +# +# surgical_note = SurgicalNote.objects.create( +# tenant=tenant, +# surgical_case=case, +# template=template, +# pre_operative_diagnosis=f"Pre-operative diagnosis: {case.diagnosis}", +# post_operative_diagnosis=f"Post-operative diagnosis: Successful {case.procedure_name}", +# procedure_performed=f"{case.procedure_name} performed according to standard protocol at {tenant.name}", +# operative_findings=f"Surgical findings: Procedure completed successfully without major complications", +# technique=f"Standard technique used for {case.procedure_name} with modern equipment", +# complications=complications, +# post_operative_instructions=f"Post-operative care instructions for {case.procedure_name} - Follow up in 1-2 weeks", +# additional_notes=f"Additional notes for case {case.case_number} - Patient tolerated procedure well", +# created_by=case.primary_surgeon, +# status=random.choices(["DRAFT", "SIGNED", "FINALIZED"], weights=[0.2, 0.3, 0.5])[0], +# signed_at=timezone.now() - timedelta(hours=random.randint(1, 48)) if random.choice([True, False]) else None, +# dictation_time=random.randint(15, 45), # minutes +# transcription_time=random.randint(30, 90) # minutes +# ) +# +# surgical_notes.append(surgical_note) +# +# self.stdout.write(f"Created {len(surgical_notes)} surgical notes") +# return surgical_notes +# +# +# def create_equipment_usage(self, tenant, surgical_cases, operating_rooms, count): +# """Create equipment usage records with Saudi hospital equipment.""" +# equipment_usage_records = [] +# +# equipment_names = [ +# "Ventilator Model SV-300", "Cardiac Monitor CM-2000", "Defibrillator DF-500", +# "Laparoscope HD-Pro", "Electrocautery Unit ECU-400", "Ultrasound Machine US-Elite", +# "Infusion Pump IP-Smart", "Blood Pressure Monitor BPM-Digital", "Surgical Laser SL-2000", +# "Anesthesia Machine AM-Pro", "Operating Microscope OM-HD", "Arthroscope AS-Flex" +# ] +# +# statuses = ["IN_USE", "COMPLETED", "MAINTENANCE", "AVAILABLE"] +# status_weights = [0.15, 0.6, 0.1, 0.15] +# +# for i in range(count): +# case = random.choice(surgical_cases) +# equipment_name = random.choice(equipment_names) +# +# start_time = case.actual_start_time or case.scheduled_start_time +# end_time = None +# status = random.choices(statuses, weights=status_weights)[0] +# +# if status == "COMPLETED" and case.actual_end_time: +# end_time = case.actual_end_time +# elif status == "IN_USE": +# end_time = None +# else: +# end_time = start_time + timedelta(hours=random.randint(1, 6)) +# +# # Generate Saudi equipment serial numbers +# serial_prefix = random.choice(["KSA", "RYD", "JED", "DMM"]) +# serial_number = f"{serial_prefix}-{random.randint(1000, 9999)}" +# +# equipment_usage = EquipmentUsage.objects.create( +# tenant=tenant, +# surgical_case=case, +# operating_room=case.operating_room, +# equipment_name=equipment_name, +# equipment_serial=serial_number, +# start_time=start_time, +# end_time=end_time, +# status=status, +# notes=f"Equipment usage for {case.procedure_name} - {equipment_name}", +# maintenance_required=random.choice([True, False]), +# operator_name=case.primary_surgeon.get_full_name(), +# usage_duration=end_time - start_time if end_time else None +# ) +# +# equipment_usage_records.append(equipment_usage) +# +# self.stdout.write(f"Created {count} equipment usage records") +# return equipment_usage_records +# +# + + """ -Saudi-influenced Operating Theatre Data Generator -Generates realistic test data for hospital operating room management system -with Saudi Arabian cultural context and medical practices. +Operating Theatre Data Generator +Generates realistic test data for operating theatre models in Saudi hospital context. +Uses existing tenants, users, and patients from the database. """ +import os +import django + +# Set up Django environment +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hospital_management.settings') +django.setup() import random import uuid -from datetime import datetime, timedelta, date, time +from datetime import datetime, date, time, timedelta from decimal import Decimal -from faker import Faker -from typing import List, Dict, Any, Optional +from django.utils import timezone +from django.contrib.auth import get_user_model -# Initialize Faker -fake = Faker('en_US') +# Import models +from operating_theatre.models import ( + OperatingRoom, ORBlock, SurgicalCase, SurgicalNote, + EquipmentUsage, SurgicalNoteTemplate +) +from core.models import Tenant +from patients.models import PatientProfile +from emr.models import Encounter +from inpatients.models import Admission + +User = get_user_model() -class SaudiOperatingTheatreDataGenerator: - """ - Generates Saudi-influenced data for Operating Theatre models. - """ - - # Saudi hospital names (in English) - SAUDI_HOSPITALS = [ - "King Faisal Specialist Hospital", - "King Fahad Medical City", - "King Abdulaziz University Hospital", - "King Khaled Eye Specialist Hospital", - "Prince Sultan Military Medical City", - "King Abdullah Medical Complex", - "King Saud Medical City", - "National Guard Hospital", - "Prince Mohammed Bin Abdulaziz Hospital", - "King Salman Hospital", - "Security Forces Hospital", - "Aramco Medical Center", - "Dr. Sulaiman Al Habib Medical Group", - "Saudi German Hospital", - "International Medical Center" - ] - - # Saudi cities - SAUDI_CITIES = [ - "Riyadh", "Jeddah", "Mecca", "Medina", "Dammam", - "Khobar", "Dhahran", "Taif", "Tabuk", "Buraidah", - "Khamis Mushait", "Hofuf", "Jubail", "Yanbu", "Abha", - "Najran", "Jizan", "Hail", "Al-Qassim", "Qatif" - ] - - # Saudi regions - SAUDI_REGIONS = [ - "Riyadh Region", "Makkah Region", "Eastern Province", - "Asir Region", "Madinah Region", "Qassim Region", - "Tabuk Region", "Hail Region", "Northern Borders", - "Jazan Region", "Najran Region", "Al-Baha Region" - ] - - # Common Saudi male first names - SAUDI_MALE_FIRST_NAMES = [ - "Mohammed", "Abdullah", "Abdulrahman", "Khalid", "Fahad", - "Sultan", "Salman", "Saud", "Faisal", "Turki", "Ahmed", - "Omar", "Youssef", "Ibrahim", "Hamad", "Nasser", "Bandar", - "Mansour", "Majed", "Waleed", "Talal", "Rakan", "Yazeed", - "Meshal", "Naif", "Abdulaziz", "Saad", "Ali", "Hassan" - ] - - # Common Saudi female first names - SAUDI_FEMALE_FIRST_NAMES = [ - "Nora", "Fatima", "Aisha", "Mariam", "Sarah", "Reem", - "Lama", "Hind", "Mona", "Amal", "Dalal", "Jawaher", - "Latifa", "Hessa", "Nouf", "Asma", "Khadija", "Layla", - "Rana", "Dina", "Hala", "Salma", "Yasmin", "Zainab", - "Lubna", "Hanaa", "Samira", "Najla", "Afaf", "Ghada" - ] - - # Common Saudi family names - SAUDI_FAMILY_NAMES = [ - "Al-Saud", "Al-Rasheed", "Al-Qahtani", "Al-Otaibi", "Al-Dossari", - "Al-Harbi", "Al-Zahrani", "Al-Ghamdi", "Al-Shehri", "Al-Asmari", - "Al-Mutairi", "Al-Enezi", "Al-Shamari", "Al-Maliki", "Al-Johani", - "Al-Subaie", "Al-Hajri", "Al-Khaldi", "Al-Turki", "Al-Obaid", - "Al-Hassan", "Al-Sheikh", "Al-Najjar", "Al-Omari", "Al-Bakri" - ] - - # Medical specialties common in Saudi Arabia - MEDICAL_SPECIALTIES = [ - "General Surgery", "Cardiac Surgery", "Neurosurgery", - "Orthopedic Surgery", "Pediatric Surgery", "Vascular Surgery", - "Thoracic Surgery", "Plastic Surgery", "Bariatric Surgery", - "Transplant Surgery", "Ophthalmology", "ENT Surgery", - "Urology", "Obstetrics", "Maxillofacial Surgery" - ] - - # Common surgical procedures in Saudi context - SURGICAL_PROCEDURES = { - "GENERAL": [ - "Laparoscopic Cholecystectomy", - "Appendectomy", - "Hernia Repair", - "Bowel Resection", - "Gastric Bypass", - "Sleeve Gastrectomy", - "Thyroidectomy", - "Hemorrhoidectomy" - ], - "CARDIAC": [ - "Coronary Artery Bypass Grafting", - "Valve Replacement", - "Atrial Septal Defect Repair", - "Pacemaker Insertion", - "Angioplasty", - "Heart Transplant" - ], - "ORTHOPEDIC": [ - "Total Knee Replacement", - "Total Hip Replacement", - "Spinal Fusion", - "ACL Reconstruction", - "Rotator Cuff Repair", - "Fracture Fixation", - "Arthroscopy" - ], - "NEURO": [ - "Craniotomy", - "Brain Tumor Resection", - "Spinal Decompression", - "VP Shunt Placement", - "Aneurysm Clipping", - "Deep Brain Stimulation" - ], - "OBSTETRIC": [ - "Cesarean Section", - "Hysterectomy", - "Myomectomy", - "Ovarian Cystectomy", - "Tubal Ligation", - "D&C Procedure" +class OperatingTheatreDataGenerator: + """Generate Saudi-influenced operating theatre data""" + + def __init__(self): + self.setup_saudi_data() + + def setup_saudi_data(self): + """Setup Saudi-specific data for generation""" + + # Arabic-influenced room names + self.room_names = [ + "غرفة العمليات الأولى", "غرفة العمليات الثانية", "غرفة العمليات الثالثة", + "جناح الجراحة العامة", "جناح جراحة القلب", "جناح جراحة الأعصاب", + "وحدة الجراحة الطارئة", "مركز الجراحة الروبوتية", "قسم جراحة العظام" ] - } - - # Equipment commonly used in Saudi hospitals - MEDICAL_EQUIPMENT = [ - "Da Vinci Surgical Robot", - "C-Arm Fluoroscopy", - "Zeiss Surgical Microscope", - "Harmonic Scalpel", - "LigaSure Device", - "Medtronic Neuromonitoring System", - "Stryker Navigation System", - "Karl Storz Laparoscopic Tower", - "GE Ultrasound Machine", - "Phillips CT Scanner" - ] - - def __init__(self, tenant_id: Optional[str] = None): - """Initialize the data generator.""" - self.tenant_id = tenant_id or str(uuid.uuid4()) - self.generated_surgeons = [] - self.generated_patients = [] - self.generated_rooms = [] - - def generate_saudi_name(self, gender: str = 'male') -> Dict[str, str]: - """Generate a Saudi-style name.""" - if gender.lower() == 'male': - first_name = random.choice(self.SAUDI_MALE_FIRST_NAMES) - else: - first_name = random.choice(self.SAUDI_FEMALE_FIRST_NAMES) - - family_name = random.choice(self.SAUDI_FAMILY_NAMES) - - # Sometimes add a middle name (father's name for males) - if gender.lower() == 'male' and random.random() > 0.5: - middle_name = random.choice(self.SAUDI_MALE_FIRST_NAMES) - full_name = f"Dr. {first_name} {middle_name} {family_name}" - else: - full_name = f"Dr. {first_name} {family_name}" - + + # Common Saudi procedures (Arabic + English) + self.procedures = [ + "استئصال المرارة بالمنظار", "Laparoscopic Cholecystectomy", + "جراحة القلب المفتوح", "Open Heart Surgery", + "استبدال مفصل الركبة", "Total Knee Replacement", + "جراحة الفتق الإربي", "Inguinal Hernia Repair", + "استئصال الزائدة الدودية", "Appendectomy", + "جراحة المنظار التشخيصي", "Diagnostic Laparoscopy", + "استئصال الغدة الدرقية", "Thyroidectomy", + "جراحة الساد", "Cataract Surgery", + "استئصال اللوزتين", "Tonsillectomy", + "جراحة البواسير", "Hemorrhoidectomy" + ] + + # Saudi medical equipment (common in Saudi hospitals) + self.equipment = [ + "منظار البطن كارل زايس", "Carl Zeiss Laparoscope", + "جهاز القطع الكهربائي", "Electrocautery Unit", + "جهاز التخدير دريجر", "Drager Anesthesia Machine", + "مجهر جراحي ليكا", "Leica Surgical Microscope", + "روبوت دافنشي", "da Vinci Surgical Robot", + "جهاز الأشعة المقطعية المحمول", "Portable CT Scanner", + "منظار المثانة", "Cystoscope", + "مضخة القلب الرئة", "Heart-Lung Machine" + ] + + # Common diagnoses in Arabic and English + self.diagnoses = [ + "التهاب المرارة الحاد", "Acute Cholecystitis", + "انسداد الأمعاء", "Bowel Obstruction", + "كسر في عظم الفخذ", "Femur Fracture", + "أورام الغدة الدرقية", "Thyroid Nodules", + "حصى الكلى", "Kidney Stones", + "التهاب الزائدة الدودية", "Appendicitis", + "الفتق الإربي", "Inguinal Hernia", + "سرطان القولون", "Colorectal Cancer" + ] + + def get_existing_data(self): + """Retrieve existing data from database""" + print("Retrieving existing data from database...") + + # Get tenants + tenants = list(Tenant.objects.all()) + if not tenants: + raise ValueError("No tenants found in database. Please create tenants first.") + + # Get users with different roles + users = list(User.objects.all()) + if not users: + raise ValueError("No users found in database. Please create users first.") + + # Try to categorize users by role/specialty + surgeons = list(User.objects.filter( + groups__name__icontains='surgeon' + ).distinct()) or users[:max(1, len(users) // 3)] + + anesthesiologists = list(User.objects.filter( + groups__name__icontains='anesthesia' + ).distinct()) or users[len(users) // 3:2 * len(users) // 3] + + nurses = list(User.objects.filter( + groups__name__icontains='nurse' + ).distinct()) or users[2 * len(users) // 3:] + + # Get patients + patients = list(PatientProfile.objects.all()) + if not patients: + raise ValueError("No patients found in database. Please create patients first.") + + # Get encounters and admissions if available + encounters = list(Encounter.objects.all()) if hasattr(Encounter, 'objects') else [] + admissions = list(Admission.objects.all()) if hasattr(Admission, 'objects') else [] + + print(f"Found: {len(tenants)} tenants, {len(users)} users, {len(patients)} patients") + print( + f"Categorized: {len(surgeons)} surgeons, {len(anesthesiologists)} anesthesiologists, {len(nurses)} nurses") + return { - 'first_name': first_name, - 'last_name': family_name, - 'full_name': full_name + 'tenants': tenants, + 'users': users, + 'surgeons': surgeons, + 'anesthesiologists': anesthesiologists, + 'nurses': nurses, + 'patients': patients, + 'encounters': encounters, + 'admissions': admissions } - - def generate_operating_room(self, room_number: int) -> Dict[str, Any]: - """Generate operating room data with Saudi context.""" - room_types = ['GENERAL', 'CARDIAC', 'NEURO', 'ORTHOPEDIC', 'OBSTETRIC', - 'PEDIATRIC', 'OPHTHALMOLOGY', 'ENT', 'UROLOGY'] - - room_type = random.choice(room_types) - hospital = random.choice(self.SAUDI_HOSPITALS) - - # Advanced equipment more common in Saudi hospitals - has_advanced_equipment = random.random() > 0.3 - - room_data = { - 'tenant': self.tenant_id, - 'room_id': str(uuid.uuid4()), - 'room_number': f"OR-{room_number:03d}", - 'room_name': f"{hospital} - {room_type.title()} OR {room_number}", - 'room_type': room_type, - 'status': random.choice(['AVAILABLE', 'OCCUPIED', 'CLEANING', 'SETUP']), - 'floor_number': random.randint(1, 5), - 'room_size': round(random.uniform(40, 80), 2), - 'ceiling_height': round(random.uniform(3.0, 4.5), 2), - 'temperature_min': 18.0, - 'temperature_max': 24.0, - 'humidity_min': 30.0, - 'humidity_max': 60.0, - 'air_changes_per_hour': random.randint(20, 25), - 'positive_pressure': True, - 'equipment_list': self._generate_equipment_list(room_type, has_advanced_equipment), - 'special_features': self._generate_special_features(room_type), - 'has_c_arm': room_type in ['ORTHOPEDIC', 'NEURO', 'VASCULAR'] or random.random() > 0.5, - 'has_ct': room_type in ['NEURO', 'CARDIAC'] and has_advanced_equipment, - 'has_mri': room_type == 'NEURO' and has_advanced_equipment and random.random() > 0.7, - 'has_ultrasound': True, - 'has_neuromonitoring': room_type in ['NEURO', 'ORTHOPEDIC'], - 'supports_robotic': has_advanced_equipment and room_type in ['GENERAL', 'UROLOGY', 'CARDIAC'], - 'supports_laparoscopic': room_type in ['GENERAL', 'OBSTETRIC', 'UROLOGY'], - 'supports_microscopy': room_type in ['NEURO', 'OPHTHALMOLOGY', 'ENT'], - 'supports_laser': room_type in ['OPHTHALMOLOGY', 'ENT', 'UROLOGY'], - 'max_case_duration': random.randint(240, 720), - 'turnover_time': random.randint(20, 45), - 'cleaning_time': random.randint(30, 60), - 'required_nurses': random.randint(2, 4), - 'required_techs': random.randint(1, 3), - 'is_active': True, - 'accepts_emergency': room_type != 'OPHTHALMOLOGY', - 'building': f"Building {random.choice(['A', 'B', 'C', 'Main', 'East', 'West'])}", - 'wing': random.choice(['North', 'South', 'East', 'West', 'Central']), - 'created_at': fake.date_time_between(start_date='-2y', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-30d', end_date='now') - } - - return room_data - - def _generate_equipment_list(self, room_type: str, has_advanced: bool) -> List[str]: - """Generate equipment list based on room type.""" - basic_equipment = [ - "Anesthesia Machine", - "Patient Monitor", - "Surgical Lights", - "Operating Table", - "Electrocautery Unit", - "Suction System", - "Instrument Tables" - ] - - specialized_equipment = { - 'CARDIAC': ["Heart-Lung Machine", "IABP", "TEE Machine"], - 'NEURO': ["Surgical Microscope", "Neuronavigation", "CUSA"], - 'ORTHOPEDIC': ["C-Arm", "Power Tools", "Traction Table"], - 'OPHTHALMOLOGY': ["Phaco Machine", "OCT", "YAG Laser"], - 'ENT': ["ENT Microscope", "Shaver System", "Navigation"], - 'UROLOGY': ["Cystoscopy Tower", "Laser System", "Lithotripter"] - } - - equipment = basic_equipment.copy() - - if room_type in specialized_equipment: - equipment.extend(specialized_equipment[room_type]) - - if has_advanced: - equipment.extend(random.sample(self.MEDICAL_EQUIPMENT, k=random.randint(2, 4))) - - return equipment - - def _generate_special_features(self, room_type: str) -> List[str]: - """Generate special features for OR.""" - features = ["Laminar Flow", "HEPA Filtration", "Integrated Video System"] - - special_features = { - 'CARDIAC': ["Hybrid OR Capability", "Cardiac Catheterization"], - 'NEURO': ["Intraoperative MRI Compatible", "Neuromonitoring"], - 'ORTHOPEDIC': ["Laminar Flow Class 100", "Biplane Imaging"], - 'OPHTHALMOLOGY': ["Laser Safety", "Microscope Integration"], - 'OBSTETRIC': ["Neonatal Resuscitation Area", "Fetal Monitoring"] - } - - if room_type in special_features: - features.extend(special_features[room_type]) - - return features - - def generate_or_block(self, operating_room_id: str, block_date: date) -> Dict[str, Any]: - """Generate OR block schedule.""" - surgeon = self.generate_saudi_name('male') - services = ['GENERAL', 'CARDIAC', 'NEURO', 'ORTHOPEDIC', 'OBSTETRIC', - 'OPHTHALMOLOGY', 'ENT', 'UROLOGY'] - - # Saudi working hours typically 7 AM to 3 PM or 8 AM to 4 PM - start_hours = [7, 8, 9, 13, 14] - start_hour = random.choice(start_hours) - duration_hours = random.randint(2, 8) - - block_data = { - 'operating_room': operating_room_id, - 'block_id': str(uuid.uuid4()), - 'date': block_date, - 'start_time': time(start_hour, 0), - 'end_time': time((start_hour + duration_hours) % 24, 0), - 'block_type': random.choice(['SCHEDULED', 'EMERGENCY', 'RESERVED']), - 'primary_surgeon': surgeon['full_name'], - 'service': random.choice(services), - 'status': random.choice(['SCHEDULED', 'ACTIVE', 'COMPLETED']), - 'allocated_minutes': duration_hours * 60, - 'used_minutes': random.randint(duration_hours * 45, duration_hours * 60), - 'special_equipment': random.sample(self.MEDICAL_EQUIPMENT, k=random.randint(0, 3)), - 'special_setup': self._generate_special_setup(), - 'notes': self._generate_block_notes(), - 'created_at': fake.date_time_between(start_date='-30d', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-7d', end_date='now') - } - - return block_data - - def _generate_special_setup(self) -> str: - """Generate special setup requirements.""" - setups = [ - "Prone positioning required", - "Lateral positioning with bean bag", - "Beach chair position", - "Microscope setup required", - "Robot docking from patient left", - "Fluoroscopy setup", - "Neuromonitoring setup required", - "Cell saver required", - "Warming blanket needed" - ] - return random.choice(setups) if random.random() > 0.5 else "" - - def _generate_block_notes(self) -> str: - """Generate block notes.""" - notes = [ - "Complex case - allow extra time", - "Teaching case for residents", - "VIP patient - special protocols", - "Latex allergy - latex-free environment", - "Multi-specialty case", - "Consultant from King Faisal Hospital attending", - "Research protocol case", - "International patient - translator needed" - ] - return random.choice(notes) if random.random() > 0.3 else "" - - def generate_surgical_case(self, or_block_id: str, patient_id: str) -> Dict[str, Any]: - """Generate surgical case data.""" - case_type = random.choice(['ELECTIVE', 'URGENT', 'EMERGENCY']) - service_type = random.choice(list(self.SURGICAL_PROCEDURES.keys())) - procedure = random.choice(self.SURGICAL_PROCEDURES[service_type]) - - # Generate Saudi medical team - primary_surgeon = self.generate_saudi_name('male') - anesthesiologist = self.generate_saudi_name(random.choice(['male', 'female'])) - nurse = self.generate_saudi_name('female') # Nursing often female in Saudi - - scheduled_start = fake.date_time_between(start_date='now', end_date='+30d') - duration = random.randint(30, 360) - - case_data = { - 'or_block': or_block_id, - 'case_id': str(uuid.uuid4()), - 'case_number': f"SURG-{datetime.now().strftime('%Y%m%d')}-{random.randint(1, 9999):04d}", - 'patient': patient_id, - 'primary_surgeon': primary_surgeon['full_name'], - 'anesthesiologist': anesthesiologist['full_name'], - 'circulating_nurse': nurse['full_name'], - 'scrub_nurse': self.generate_saudi_name('female')['full_name'], - 'primary_procedure': procedure, - 'secondary_procedures': self._generate_secondary_procedures(service_type), - 'procedure_codes': self._generate_procedure_codes(), - 'case_type': case_type, - 'approach': random.choice(['OPEN', 'LAPAROSCOPIC', 'ROBOTIC', 'ENDOSCOPIC']), - 'anesthesia_type': random.choice(['GENERAL', 'REGIONAL', 'SPINAL', 'LOCAL']), - 'scheduled_start': scheduled_start, - 'estimated_duration': duration, - 'actual_start': scheduled_start + timedelta(minutes=random.randint(-15, 30)) if random.random() > 0.5 else None, - 'actual_end': scheduled_start + timedelta(minutes=duration + random.randint(-30, 60)) if random.random() > 0.5 else None, - 'status': random.choice(['SCHEDULED', 'IN_PROGRESS', 'COMPLETED', 'DELAYED']), - 'diagnosis': self._generate_diagnosis(), - 'diagnosis_codes': self._generate_diagnosis_codes(), - 'clinical_notes': self._generate_clinical_notes(), - 'special_equipment': random.sample(self.MEDICAL_EQUIPMENT, k=random.randint(1, 3)), - 'blood_products': self._generate_blood_products() if random.random() > 0.7 else [], - 'implants': self._generate_implants(service_type) if random.random() > 0.6 else [], - 'patient_position': random.choice(['SUPINE', 'PRONE', 'LATERAL', 'LITHOTOMY']), - 'complications': [] if random.random() > 0.1 else ["Minor bleeding controlled"], - 'estimated_blood_loss': random.randint(10, 500) if random.random() > 0.3 else None, - 'created_at': fake.date_time_between(start_date='-7d', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-1d', end_date='now') - } - - return case_data - - def _generate_secondary_procedures(self, service_type: str) -> List[str]: - """Generate secondary procedures.""" - if random.random() > 0.6: - procedures = self.SURGICAL_PROCEDURES.get(service_type, []) - return random.sample(procedures, k=min(random.randint(1, 2), len(procedures))) - return [] - - def _generate_procedure_codes(self) -> List[str]: - """Generate CPT procedure codes.""" - # Sample CPT codes - codes = [] - for _ in range(random.randint(1, 3)): - codes.append(f"{random.randint(10000, 99999)}") - return codes - - def _generate_diagnosis(self) -> str: - """Generate diagnosis.""" - diagnoses = [ - "Acute Appendicitis", - "Cholelithiasis", - "Inguinal Hernia", - "Coronary Artery Disease", - "Brain Tumor", - "Degenerative Disc Disease", - "Osteoarthritis", - "Breast Cancer", - "Colorectal Cancer", - "Thyroid Nodule", - "Uterine Fibroids", - "Kidney Stones", - "Prostate Hyperplasia" - ] - return random.choice(diagnoses) - - def _generate_diagnosis_codes(self) -> List[str]: - """Generate ICD-10 diagnosis codes.""" - # Sample ICD-10 codes - codes = [] - for _ in range(random.randint(1, 3)): - letter = random.choice(['K', 'I', 'M', 'C', 'N', 'E']) - codes.append(f"{letter}{random.randint(10, 99)}.{random.randint(0, 9)}") - return codes - - def _generate_clinical_notes(self) -> str: - """Generate clinical notes.""" - notes = [ - "Patient with history of diabetes mellitus type 2, controlled on metformin", - "No known drug allergies. Previous surgery without complications", - "Hypertensive patient on ACE inhibitors, blood pressure stable", - "Patient fasting since midnight as per protocol", - "Preoperative antibiotics administered", - "Patient counseled about procedure risks and benefits", - "Informed consent obtained in Arabic and English" - ] - return random.choice(notes) - - def _generate_blood_products(self) -> List[str]: - """Generate blood product requirements.""" - products = [] - if random.random() > 0.5: - products.append(f"PRBC {random.randint(1, 4)} units") - if random.random() > 0.7: - products.append(f"FFP {random.randint(1, 2)} units") - if random.random() > 0.8: - products.append(f"Platelets {random.randint(1, 2)} units") - return products - - def _generate_implants(self, service_type: str) -> List[str]: - """Generate implant requirements based on service type.""" - implants = { - 'ORTHOPEDIC': [ - "Total Knee Prosthesis - Zimmer", - "Total Hip Prosthesis - Stryker", - "Spinal Fusion Cage - Medtronic", - "ACL Graft", - "Fracture Plate and Screws" - ], - 'CARDIAC': [ - "Mechanical Valve - St. Jude", - "Bioprosthetic Valve", - "Pacemaker - Medtronic", - "Coronary Stent", - "Vascular Graft" - ], - 'NEURO': [ - "VP Shunt", - "Deep Brain Stimulator", - "Cranial Plate", - "Aneurysm Clip" - ], - 'GENERAL': [ - "Mesh for Hernia Repair", - "Gastric Band", - "Biliary Stent" - ] - } - - if service_type in implants: - return random.sample(implants[service_type], k=1) - return [] - - def generate_surgical_note(self, surgical_case_id: str, surgeon_id: str) -> Dict[str, Any]: - """Generate surgical note.""" - note_data = { - 'surgical_case': surgical_case_id, - 'note_id': str(uuid.uuid4()), - 'surgeon': surgeon_id, - 'preoperative_diagnosis': self._generate_diagnosis(), - 'planned_procedure': random.choice([proc for procs in self.SURGICAL_PROCEDURES.values() for proc in procs]), - 'indication': self._generate_indication(), - 'procedure_performed': self._generate_procedure_details(), - 'surgical_approach': self._generate_surgical_approach(), - 'findings': self._generate_findings(), - 'technique': self._generate_technique(), - 'postoperative_diagnosis': self._generate_diagnosis(), - 'condition': random.choice(['STABLE', 'GOOD', 'FAIR']), - 'disposition': random.choice(['RECOVERY', 'ICU', 'WARD']), - 'complications': "None" if random.random() > 0.1 else "Minor bleeding, controlled", - 'estimated_blood_loss': random.randint(10, 500), - 'blood_transfusion': "None" if random.random() > 0.8 else "1 unit PRBC", - 'specimens': self._generate_specimens() if random.random() > 0.5 else None, - 'implants': self._generate_implant_details() if random.random() > 0.6 else None, - 'drains': "JP drain placed" if random.random() > 0.5 else None, - 'closure': self._generate_closure_details(), - 'postop_instructions': self._generate_postop_instructions(), - 'follow_up': "Follow up in 2 weeks in surgical clinic", - 'status': random.choice(['DRAFT', 'COMPLETED', 'SIGNED']), - 'signed_datetime': fake.date_time_between(start_date='-7d', end_date='now') if random.random() > 0.3 else None, - 'created_at': fake.date_time_between(start_date='-7d', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-1d', end_date='now') - } - - return note_data - - def _generate_indication(self) -> str: - """Generate surgical indication.""" - indications = [ - "Symptomatic for 6 months, failed conservative management", - "Progressive symptoms despite medical therapy", - "Acute presentation with signs of peritonitis", - "Elective procedure for quality of life improvement", - "Urgent intervention to prevent complications", - "Diagnostic and therapeutic intervention", - "Staged procedure as per treatment protocol" - ] - return random.choice(indications) - - def _generate_procedure_details(self) -> str: - """Generate detailed procedure description.""" - return "Procedure performed as planned using standard technique with no intraoperative complications" - - def _generate_surgical_approach(self) -> str: - """Generate surgical approach description.""" - approaches = [ - "Midline laparotomy incision", - "Laparoscopic approach with 4 ports", - "Lateral thoracotomy through 5th intercostal space", - "Posterior approach to spine", - "Deltopectoral approach", - "Bikini incision for cesarean section" - ] - return random.choice(approaches) - - def _generate_findings(self) -> str: - """Generate intraoperative findings.""" - findings = [ - "Findings consistent with preoperative diagnosis", - "Adhesions from previous surgery noted and lysed", - "No evidence of metastatic disease", - "Inflammation noted in surrounding tissues", - "Anatomy normal, procedure proceeded as planned" - ] - return random.choice(findings) - - def _generate_technique(self) -> str: - """Generate surgical technique description.""" - return "Standard surgical technique employed with meticulous hemostasis throughout the procedure" - - def _generate_specimens(self) -> str: - """Generate specimen details.""" - specimens = [ - "Appendix sent to pathology", - "Gallbladder sent to pathology", - "Lymph nodes sent for frozen section", - "Tissue biopsy sent to pathology", - "Tumor specimen sent with margins marked" - ] - return random.choice(specimens) - - def _generate_implant_details(self) -> str: - """Generate implant details.""" - return "Implant placed per manufacturer protocol, position confirmed with imaging" - - def _generate_closure_details(self) -> str: - """Generate closure details.""" - closures = [ - "Layered closure with absorbable sutures", - "Skin closed with staples", - "Subcuticular closure with absorbable sutures", - "Wound closed in layers, dressing applied", - "Closure with 3-0 Vicryl and skin adhesive" - ] - return random.choice(closures) - - def _generate_postop_instructions(self) -> str: - """Generate postoperative instructions.""" - instructions = [ - "NPO until bowel sounds return, advance diet as tolerated", - "Ambulate within 6 hours, incentive spirometry every hour", - "Pain control with PCA, transition to oral when tolerating diet", - "DVT prophylaxis with heparin, sequential compression devices", - "Monitor vitals every 4 hours, daily labs", - "Antibiotics for 24 hours postoperatively", - "Foley catheter to be removed POD 1" - ] - return "; ".join(random.sample(instructions, k=random.randint(2, 4))) - - def generate_equipment_usage(self, surgical_case_id: str) -> List[Dict[str, Any]]: - """Generate equipment usage records.""" - equipment_records = [] - num_equipment = random.randint(3, 8) - - for _ in range(num_equipment): - equipment_type = random.choice([ - 'SURGICAL_INSTRUMENT', 'MONITORING_DEVICE', 'ELECTROCAUTERY', - 'LASER', 'MICROSCOPE', 'ULTRASOUND', 'DISPOSABLE' - ]) - - equipment_name = self._get_equipment_name(equipment_type) - - usage_data = { - 'surgical_case': surgical_case_id, - 'usage_id': str(uuid.uuid4()), - 'equipment_name': equipment_name, - 'equipment_type': equipment_type, - 'manufacturer': self._get_manufacturer(), - 'model': f"Model-{random.randint(100, 999)}", - 'serial_number': f"SN{random.randint(100000, 999999)}", - 'quantity_used': random.randint(1, 5), - 'unit_of_measure': random.choice(['EACH', 'SET', 'PACK', 'BOX']), - 'start_time': fake.date_time_between(start_date='-1d', end_date='now'), - 'end_time': fake.date_time_between(start_date='now', end_date='+4h'), - 'unit_cost': Decimal(str(round(random.uniform(10, 5000), 2))), - 'lot_number': f"LOT{random.randint(10000, 99999)}", - 'expiration_date': fake.date_between(start_date='+30d', end_date='+2y'), - 'sterilization_date': fake.date_between(start_date='-7d', end_date='today'), - 'notes': self._generate_equipment_notes(), - 'created_at': fake.date_time_between(start_date='-1d', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-1h', end_date='now') + + def generate_operating_rooms(self, data, count=15): + """Generate operating rooms""" + print(f"Generating {count} operating rooms...") + + operating_rooms = [] + for tenant in data['tenants']: + rooms_per_tenant = count // len(data['tenants']) + (1 if tenant == data['tenants'][0] else 0) + + for i in range(rooms_per_tenant): + room = OperatingRoom.objects.create( + tenant=tenant, + room_number=f"OR-{i + 1:02d}", + room_name=random.choice(self.room_names), + room_type=random.choice([choice[0] for choice in OperatingRoom.ROOM_TYPE_CHOICES]), + status=random.choice([choice[0] for choice in OperatingRoom.STATUS_CHOICES]), + floor_number=random.randint(2, 8), + room_size=random.uniform(25.0, 60.0), + ceiling_height=random.uniform(3.0, 4.5), + temperature_min=random.uniform(16.0, 20.0), + temperature_max=random.uniform(22.0, 28.0), + humidity_min=random.uniform(25.0, 35.0), + humidity_max=random.uniform(55.0, 65.0), + air_changes_per_hour=random.randint(15, 25), + positive_pressure=random.choice([True, False]), + # equipment_list=random.sample(self.equipment, k=random.randint(3, 8)), + special_features=random.sample([ + "HEPA Filtration", "Temperature Control", "Humidity Control", + "Integrated Monitors", "Surgical Lights", "Emergency Power" + ], k=random.randint(2, 4)), + has_c_arm=random.choice([True, False]), + has_ct=random.choice([True, False]) if random.random() > 0.7 else False, + has_mri=random.choice([True, False]) if random.random() > 0.8 else False, + has_ultrasound=random.choice([True, False]), + has_neuromonitoring=random.choice([True, False]) if random.random() > 0.6 else False, + supports_robotic=random.choice([True, False]) if random.random() > 0.7 else False, + supports_laparoscopic=random.choice([True, True, True, False]), # More likely True + supports_microscopy=random.choice([True, False]), + supports_laser=random.choice([True, False]), + max_case_duration=random.choice([240, 360, 480, 600, 720]), + turnover_time=random.randint(20, 45), + cleaning_time=random.randint(30, 60), + required_nurses=random.randint(2, 4), + required_techs=random.randint(1, 3), + is_active=random.choice([True, True, True, False]), # More likely active + accepts_emergency=random.choice([True, True, False]), # More likely to accept + building=random.choice(["Main Hospital", "Surgical Center", "Medical Tower"]), + wing=random.choice(["North Wing", "South Wing", "East Wing", "West Wing"]), + created_by=random.choice(data['users']) + ) + operating_rooms.append(room) + + print(f"Generated {len(operating_rooms)} operating rooms") + return operating_rooms + + def generate_surgical_note_templates(self, data, count=20): + """Generate surgical note templates""" + print(f"Generating {count} surgical note templates...") + + templates = [] + template_data = [ + { + 'name': 'General Laparoscopic Surgery', + 'specialty': 'GENERAL', + 'procedure_type': 'Laparoscopic Surgery', + 'preoperative_diagnosis': 'Acute cholecystitis with cholelithiasis', + 'planned_procedure': 'Laparoscopic cholecystectomy', + 'indication': 'Symptomatic gallstone disease with acute inflammation' + }, + { + 'name': 'Cardiac Surgery Standard', + 'specialty': 'CARDIAC', + 'procedure_type': 'Open Heart Surgery', + 'preoperative_diagnosis': 'Coronary artery disease, three vessel', + 'planned_procedure': 'Coronary artery bypass grafting', + 'indication': 'Significant coronary artery stenosis' + }, + { + 'name': 'Orthopedic Joint Replacement', + 'specialty': 'ORTHOPEDIC', + 'procedure_type': 'Joint Replacement', + 'preoperative_diagnosis': 'Severe osteoarthritis of the knee', + 'planned_procedure': 'Total knee arthroplasty', + 'indication': 'End-stage arthritis with functional limitation' + }, + { + 'name': 'Neurosurgical Craniotomy', + 'specialty': 'NEURO', + 'procedure_type': 'Craniotomy', + 'preoperative_diagnosis': 'Brain tumor, frontal lobe', + 'planned_procedure': 'Craniotomy and tumor resection', + 'indication': 'Mass lesion with neurological symptoms' + }, + { + 'name': 'Emergency Appendectomy', + 'specialty': 'GENERAL', + 'procedure_type': 'Emergency Surgery', + 'preoperative_diagnosis': 'Acute appendicitis', + 'planned_procedure': 'Laparoscopic appendectomy', + 'indication': 'Acute inflammatory process of the appendix' } - - equipment_records.append(usage_data) - - return equipment_records - - def _get_equipment_name(self, equipment_type: str) -> str: - """Get equipment name based on type.""" - equipment_names = { - 'SURGICAL_INSTRUMENT': [ - "Harmonic Scalpel", "LigaSure Device", "Surgical Stapler", - "Laparoscopic Grasper Set", "Retractor Set", "Scalpel Set" - ], - 'MONITORING_DEVICE': [ - "Cardiac Monitor", "Pulse Oximeter", "BIS Monitor", - "Arterial Line Monitor", "Central Line Kit" - ], - 'ELECTROCAUTERY': [ - "Bovie Electrocautery", "Bipolar Forceps", "Monopolar Cautery" - ], - 'LASER': [ - "CO2 Laser", "YAG Laser", "Holmium Laser", "Argon Laser" - ], - 'MICROSCOPE': [ - "Zeiss OPMI", "Leica Surgical Microscope", "Pentero Microscope" - ], - 'ULTRASOUND': [ - "GE Ultrasound", "Phillips EPIQ", "Sonosite Edge" - ], - 'DISPOSABLE': [ - "Surgical Drape Set", "Gown Pack", "Suture Set", - "Surgical Gloves", "Sponge Pack" - ] - } - - return random.choice(equipment_names.get(equipment_type, ["Generic Equipment"])) - - def _get_manufacturer(self) -> str: - """Get equipment manufacturer.""" - manufacturers = [ - "Medtronic", "Johnson & Johnson", "Stryker", "Boston Scientific", - "Abbott", "GE Healthcare", "Siemens", "Phillips", "Karl Storz", - "Olympus", "Zimmer Biomet", "Smith & Nephew", "B. Braun" ] - return random.choice(manufacturers) - - def _generate_equipment_notes(self) -> str: - """Generate equipment usage notes.""" - notes = [ - "Equipment functioning properly", - "Calibrated before use", - "Backup equipment available", - "Special settings documented", - "Used per protocol", - "" - ] - return random.choice(notes) - - def generate_surgical_note_template(self) -> Dict[str, Any]: - """Generate surgical note template.""" - specialties = ['ALL', 'GENERAL', 'CARDIAC', 'NEURO', 'ORTHOPEDIC', - 'OBSTETRIC', 'OPHTHALMOLOGY', 'ENT', 'UROLOGY'] - - specialty = random.choice(specialties) - - template_data = { - 'tenant': self.tenant_id, - 'template_id': str(uuid.uuid4()), - 'name': f"{specialty} Surgery Template - {random.choice(['Standard', 'Complex', 'Emergency'])}", - 'description': f"Standard template for {specialty.lower()} surgical procedures", - 'procedure_type': random.choice(self.SURGICAL_PROCEDURES.get(specialty, ["General Procedure"])) if specialty != 'ALL' else None, - 'specialty': specialty, - 'preoperative_diagnosis_template': "Preoperative Diagnosis: [Diagnosis]", - 'planned_procedure_template': "Planned Procedure: [Procedure Name]", - 'indication_template': "Indication: Patient presents with [symptoms] requiring surgical intervention", - 'procedure_performed_template': "Procedure Performed: [Actual procedure]", - 'surgical_approach_template': "Approach: [Describe surgical approach]", - 'findings_template': "Findings: [Describe intraoperative findings]", - 'technique_template': "Technique: [Describe surgical technique in detail]", - 'postoperative_diagnosis_template': "Postoperative Diagnosis: [Final diagnosis]", - 'complications_template': "Complications: [None/Describe if any]", - 'specimens_template': "Specimens: [List specimens sent to pathology]", - 'implants_template': "Implants: [List any implants used]", - 'closure_template': "Closure: [Describe closure technique]", - 'postop_instructions_template': "Postoperative Instructions: [List instructions]", - 'is_active': True, - 'is_default': random.random() > 0.7, - 'usage_count': random.randint(0, 100), - 'created_at': fake.date_time_between(start_date='-1y', end_date='now'), - 'updated_at': fake.date_time_between(start_date='-30d', end_date='now') + + for tenant in data['tenants']: + for template_info in template_data: + template = SurgicalNoteTemplate.objects.create( + tenant=tenant, + name=template_info['name'], + description=f"Standard template for {template_info['procedure_type']}", + procedure_type=template_info['procedure_type'], + specialty=template_info['specialty'], + preoperative_diagnosis_template=template_info['preoperative_diagnosis'], + planned_procedure_template=template_info['planned_procedure'], + indication_template=template_info['indication'], + procedure_performed_template=template_info['planned_procedure'], + surgical_approach_template="Standard laparoscopic approach with CO2 insufflation", + findings_template="Findings consistent with preoperative diagnosis", + technique_template="Standard surgical technique employed", + postoperative_diagnosis_template=template_info['preoperative_diagnosis'], + complications_template="No intraoperative complications", + specimens_template="Specimen sent to pathology for routine examination", + implants_template="No implants used", + closure_template="Fascia closed with absorbable sutures, skin closed with skin adhesive", + postop_instructions_template="NPO until bowel function returns, progressive diet advancement", + is_active=True, + is_default=random.choice([True, False]), + created_by=random.choice(data['users']) + ) + templates.append(template) + + # Generate additional random templates + for i in range(count - len(template_data)): + template = SurgicalNoteTemplate.objects.create( + tenant=tenant, + name=f"Custom Template {i + 1}", + description=f"Custom surgical note template {i + 1}", + procedure_type=random.choice(self.procedures), + specialty=random.choice([choice[0] for choice in SurgicalNoteTemplate.SPECIALTY_CHOICES]), + preoperative_diagnosis_template=random.choice(self.diagnoses), + planned_procedure_template=random.choice(self.procedures), + indication_template="Standard indication for procedure", + procedure_performed_template=random.choice(self.procedures), + surgical_approach_template="Standard surgical approach", + findings_template="Findings as expected", + technique_template="Standard technique employed", + postoperative_diagnosis_template=random.choice(self.diagnoses), + is_active=random.choice([True, False]), + created_by=random.choice(data['users']) + ) + templates.append(template) + + print(f"Generated {len(templates)} surgical note templates") + return templates + + def generate_or_blocks(self, operating_rooms, data, count=50): + """Generate OR blocks""" + print(f"Generating {count} OR blocks...") + + blocks = [] + for i in range(count): + # Generate dates for the next 30 days + block_date = date.today() + timedelta(days=random.randint(0, 30)) + + # Generate time slots + start_hour = random.randint(6, 20) + start_minute = random.choice([0, 30]) + start_time = time(start_hour, start_minute) + + duration_hours = random.randint(2, 8) + end_hour = min(23, start_hour + duration_hours) + end_time = time(end_hour, start_minute) + + block = ORBlock.objects.create( + operating_room=random.choice(operating_rooms), + date=block_date, + start_time=start_time, + end_time=end_time, + block_type=random.choice([choice[0] for choice in ORBlock.BLOCK_TYPE_CHOICES]), + primary_surgeon=random.choice(data['surgeons']), + service=random.choice([choice[0] for choice in ORBlock.SERVICE_CHOICES]), + status=random.choice([choice[0] for choice in ORBlock.STATUS_CHOICES]), + special_equipment=random.sample(self.equipment, k=random.randint(1, 4)), + special_setup=random.choice([ + "Standard setup required", "Special positioning needed", + "Additional monitoring required", "Robotic system preparation", + None + ]), + notes=random.choice([ + "Standard block", "Priority case", "Complex procedure expected", + "Patient has multiple comorbidities", None + ]), + created_by=random.choice(data['users']) + ) + + # Add assistant surgeons + if random.random() > 0.5: + assistants = random.sample(data['surgeons'], k=random.randint(1, 2)) + block.assistant_surgeons.set(assistants) + + blocks.append(block) + + print(f"Generated {len(blocks)} OR blocks") + return blocks + + def generate_surgical_cases(self, or_blocks, data, count=80): + """Generate surgical cases""" + print(f"Generating {count} surgical cases...") + + cases = [] + for i in range(count): + block = random.choice(or_blocks) + + # Generate procedure information + primary_procedure = random.choice(self.procedures) + diagnosis = random.choice(self.diagnoses) + + # Generate timing + scheduled_start = datetime.combine( + block.date, + block.start_time + ) + timedelta(minutes=random.randint(0, 60)) + + estimated_duration = random.randint(30, 360) + + # Generate actual times for some cases + actual_start = None + actual_end = None + if random.random() > 0.4: # 60% of cases have actual times + actual_start = scheduled_start + timedelta(minutes=random.randint(-15, 45)) + actual_end = actual_start + timedelta( + minutes=estimated_duration + random.randint(-30, 60) + ) + + case = SurgicalCase.objects.create( + or_block=block, + patient=random.choice(data['patients']), + primary_surgeon=block.primary_surgeon, + anesthesiologist=random.choice(data['anesthesiologists']) if data['anesthesiologists'] else None, + circulating_nurse=random.choice(data['nurses']) if data['nurses'] else None, + scrub_nurse=random.choice(data['nurses']) if data['nurses'] else None, + primary_procedure=primary_procedure, + secondary_procedures=random.sample(self.procedures, k=random.randint(0, 2)), + procedure_codes=[f"CPT-{random.randint(10000, 99999)}" for _ in range(random.randint(1, 3))], + case_type=random.choice([choice[0] for choice in SurgicalCase.CASE_TYPE_CHOICES]), + approach=random.choice([choice[0] for choice in SurgicalCase.APPROACH_CHOICES]), + anesthesia_type=random.choice([choice[0] for choice in SurgicalCase.ANESTHESIA_TYPE_CHOICES]), + scheduled_start=scheduled_start, + estimated_duration=estimated_duration, + actual_start=actual_start, + actual_end=actual_end, + status=random.choice([choice[0] for choice in SurgicalCase.STATUS_CHOICES]), + diagnosis=diagnosis, + diagnosis_codes=[ + f"ICD10-{chr(65 + random.randint(0, 25))}{random.randint(10, 99)}.{random.randint(0, 9)}" + for _ in range(random.randint(1, 2))], + clinical_notes=f"Patient presents with {diagnosis.lower()}. Surgical intervention indicated.", + special_equipment=random.sample(self.equipment, k=random.randint(0, 3)), + blood_products=random.sample([ + "Packed RBC", "Fresh Frozen Plasma", "Platelets", "Cryoprecipitate" + ], k=random.randint(0, 2)) if random.random() > 0.7 else [], + implants=random.sample([ + "Titanium Plate", "Mesh", "Stent", "Joint Prosthesis", "Screws" + ], k=random.randint(0, 2)) if random.random() > 0.6 else [], + patient_position=random.choice( + [choice[0] for choice in SurgicalCase.PATIENT_POSITION_CHOICES]) if random.random() > 0.2 else None, + complications=random.sample([ + "Minor bleeding", "Adhesions encountered", "Technical difficulty" + ], k=random.randint(0, 1)) if random.random() > 0.8 else [], + estimated_blood_loss=random.randint(10, 500) if random.random() > 0.3 else None, + encounter=random.choice(data['encounters']) if data['encounters'] and random.random() > 0.5 else None, + admission=random.choice(data['admissions']) if data['admissions'] and random.random() > 0.4 else None, + created_by=random.choice(data['users']) + ) + + # Add assistant surgeons + if random.random() > 0.4: + assistants = random.sample(data['surgeons'], k=random.randint(1, 2)) + case.assistant_surgeons.set(assistants) + + cases.append(case) + + print(f"Generated {len(cases)} surgical cases") + return cases + + def generate_surgical_notes(self, surgical_cases, templates, data): + """Generate surgical notes for surgical cases""" + print(f"Generating surgical notes...") + + notes = [] + for case in surgical_cases: + # Only create notes for completed cases + if case.status not in ['COMPLETED', 'IN_PROGRESS'] or random.random() > 0.7: + continue + + # Find appropriate template + template = None + case_templates = [t for t in templates if t.tenant == case.tenant] + if case_templates: + template = random.choice(case_templates) + + note = SurgicalNote.objects.create( + surgical_case=case, + surgeon=case.primary_surgeon, + preoperative_diagnosis=case.diagnosis, + planned_procedure=case.primary_procedure, + indication=f"Surgical treatment indicated for {case.diagnosis.lower()}", + procedure_performed=case.primary_procedure, + surgical_approach=f"{case.approach.lower()} approach utilized", + findings=random.choice([ + "Findings consistent with preoperative diagnosis", + "Moderate inflammation noted", + "Adhesions present as expected", + "Anatomy within normal limits", + "Pathology confirmed intraoperatively" + ]), + technique=f"Standard {case.approach.lower()} technique employed with appropriate surgical instruments", + postoperative_diagnosis=case.diagnosis, + condition=random.choice([choice[0] for choice in SurgicalNote.CONDITION_CHOICES]), + disposition=random.choice([choice[0] for choice in SurgicalNote.DISPOSITION_CHOICES]), + complications=random.choice([ + "No intraoperative complications", + "Minor bleeding encountered and controlled", + "Technical difficulty with adhesions", + None + ]) if case.complications else "No intraoperative complications", + estimated_blood_loss=case.estimated_blood_loss, + blood_transfusion=random.choice([ + None, "No blood transfusion required", + "2 units packed RBC transfused" + ]) if random.random() > 0.8 else None, + specimens=random.choice([ + f"Specimen sent to pathology for routine examination", + "Tissue specimen sent for histopathological analysis", + "No specimens obtained", + None + ]), + implants=", ".join(case.implants) if case.implants else None, + drains=random.choice([ + "Jackson-Pratt drain placed", "No drains required", + "Blake drain inserted", None + ]) if random.random() > 0.6 else None, + closure=random.choice([ + "Fascia closed with interrupted sutures, skin closed with staples", + "Layered closure performed, skin closed with absorbable sutures", + "Standard closure technique employed" + ]), + postop_instructions=random.choice([ + "NPO until bowel function returns, then clear liquids", + "Regular diet as tolerated, ambulate as able", + "Standard postoperative care protocol" + ]), + follow_up="Follow-up in clinic in 2-4 weeks, sooner if concerns", + status=random.choice(['COMPLETED', 'SIGNED', 'DRAFT']), + signed_datetime=timezone.now() - timedelta( + days=random.randint(0, 5)) if random.random() > 0.3 else None, + template_used=template + ) + notes.append(note) + + print(f"Generated {len(notes)} surgical notes") + return notes + + def generate_equipment_usage(self, surgical_cases, data, count=200): + """Generate equipment usage records""" + print(f"Generating {count} equipment usage records...") + + usage_records = [] + for _ in range(count): + case = random.choice([c for c in surgical_cases if c.status in ['COMPLETED', 'IN_PROGRESS']]) + equipment_name = random.choice(self.equipment) + + # Generate usage timing + start_time = None + end_time = None + if case.actual_start: + start_time = case.actual_start + timedelta(minutes=random.randint(0, 60)) + end_time = start_time + timedelta(minutes=random.randint(15, 180)) + + usage = EquipmentUsage.objects.create( + surgical_case=case, + equipment_name=equipment_name, + equipment_type=random.choice([choice[0] for choice in EquipmentUsage.EQUIPMENT_TYPE_CHOICES]), + manufacturer=random.choice([ + "Medtronic", "Johnson & Johnson", "Stryker", "Olympus", + "Karl Storz", "Ethicon", "Boston Scientific", "Abbott" + ]), + model=f"Model-{random.randint(1000, 9999)}", + serial_number=f"SN{random.randint(100000, 999999)}", + quantity_used=random.randint(1, 5), + unit_of_measure=random.choice([choice[0] for choice in EquipmentUsage.UNIT_OF_MEASURE_CHOICES]), + start_time=start_time, + end_time=end_time, + unit_cost=Decimal(str(random.uniform(10, 1000))).quantize(Decimal('0.01')), + lot_number=f"LOT{random.randint(1000, 9999)}" if random.random() > 0.3 else None, + expiration_date=date.today() + timedelta( + days=random.randint(30, 730)) if random.random() > 0.4 else None, + sterilization_date=date.today() - timedelta( + days=random.randint(1, 7)) if random.random() > 0.5 else None, + notes=random.choice([ + "Equipment functioned normally", + "Routine maintenance required after use", + "Minor technical issue resolved", + None + ]), + recorded_by=random.choice(data['nurses']) if data['nurses'] else random.choice(data['users']) + ) + usage_records.append(usage) + + print(f"Generated {len(usage_records)} equipment usage records") + return usage_records + + def generate_all_data(self, or_count=15, block_count=50, case_count=80, equipment_count=200): + """Generate all operating theatre data""" + print("Starting Operating Theatre data generation...") + + # Get existing data + data = self.get_existing_data() + + # Generate data in order of dependencies + operating_rooms = self.generate_operating_rooms(data, or_count) + templates = self.generate_surgical_note_templates(data) + or_blocks = self.generate_or_blocks(operating_rooms, data, block_count) + surgical_cases = self.generate_surgical_cases(or_blocks, data, case_count) + surgical_notes = self.generate_surgical_notes(surgical_cases, templates, data) + equipment_usage = self.generate_equipment_usage(surgical_cases, data, equipment_count) + + summary = { + 'operating_rooms': len(operating_rooms), + 'surgical_note_templates': len(templates), + 'or_blocks': len(or_blocks), + 'surgical_cases': len(surgical_cases), + 'surgical_notes': len(surgical_notes), + 'equipment_usage': len(equipment_usage) } - - return template_data - - def generate_complete_dataset(self, - num_rooms: int = 10, - num_blocks_per_room: int = 5, - num_cases_per_block: int = 3) -> Dict[str, List]: - """Generate complete dataset for all models.""" - - dataset = { - 'operating_rooms': [], - 'or_blocks': [], - 'surgical_cases': [], - 'surgical_notes': [], - 'equipment_usage': [], - 'surgical_note_templates': [] - } - - # Generate operating rooms - for i in range(1, num_rooms + 1): - room = self.generate_operating_room(i) - dataset['operating_rooms'].append(room) - self.generated_rooms.append(room) - - # Generate OR blocks for each room - for j in range(num_blocks_per_room): - block_date = fake.date_between(start_date='today', end_date='+30d') - block = self.generate_or_block(room['room_id'], block_date) - dataset['or_blocks'].append(block) - - # Generate surgical cases for each block - for k in range(random.randint(1, num_cases_per_block)): - # Generate a patient ID (placeholder) - patient_id = str(uuid.uuid4()) - - case = self.generate_surgical_case(block['block_id'], patient_id) - dataset['surgical_cases'].append(case) - - # Generate surgical note for completed cases - if case['status'] == 'COMPLETED': - note = self.generate_surgical_note(case['case_id'], block['primary_surgeon']) - dataset['surgical_notes'].append(note) - - # Generate equipment usage - equipment_usage = self.generate_equipment_usage(case['case_id']) - dataset['equipment_usage'].extend(equipment_usage) - - # Generate surgical note templates - for _ in range(15): - template = self.generate_surgical_note_template() - dataset['surgical_note_templates'].append(template) - - return dataset - - def print_statistics(self, dataset: Dict[str, List]) -> None: - """Print statistics about generated data.""" - print("\n" + "="*60) - print("Saudi Operating Theatre Data Generation Complete") - print("="*60) - print(f"Operating Rooms Generated: {len(dataset['operating_rooms'])}") - print(f"OR Blocks Generated: {len(dataset['or_blocks'])}") - print(f"Surgical Cases Generated: {len(dataset['surgical_cases'])}") - print(f"Surgical Notes Generated: {len(dataset['surgical_notes'])}") - print(f"Equipment Usage Records: {len(dataset['equipment_usage'])}") - print(f"Surgical Note Templates: {len(dataset['surgical_note_templates'])}") - print("="*60) - - # Room type distribution - room_types = {} - for room in dataset['operating_rooms']: - room_type = room['room_type'] - room_types[room_type] = room_types.get(room_type, 0) + 1 - - print("\nOperating Room Types:") - for room_type, count in sorted(room_types.items()): - print(f" {room_type}: {count}") - - # Case type distribution - case_types = {} - for case in dataset['surgical_cases']: - case_type = case['case_type'] - case_types[case_type] = case_types.get(case_type, 0) + 1 - - print("\nSurgical Case Types:") - for case_type, count in sorted(case_types.items()): - print(f" {case_type}: {count}") - - # Status distribution - case_statuses = {} - for case in dataset['surgical_cases']: - status = case['status'] - case_statuses[status] = case_statuses.get(status, 0) + 1 - - print("\nCase Status Distribution:") - for status, count in sorted(case_statuses.items()): - print(f" {status}: {count}") + + print("\n" + "=" * 50) + print("OPERATING THEATRE DATA GENERATION COMPLETE") + print("=" * 50) + for model, count in summary.items(): + print(f"{model.replace('_', ' ').title()}: {count}") + print("=" * 50) + + return summary -# Example usage -if __name__ == "__main__": - # Initialize generator - generator = SaudiOperatingTheatreDataGenerator() - - # Generate complete dataset - dataset = generator.generate_complete_dataset( - num_rooms=8, - num_blocks_per_room=4, - num_cases_per_block=3 +# Usage example: +def generate_operating_theatre_data(): + """Main function to generate operating theatre data""" + generator = OperatingTheatreDataGenerator() + return generator.generate_all_data( + or_count=20, # Number of operating rooms + block_count=60, # Number of OR blocks + case_count=100, # Number of surgical cases + equipment_count=250 # Number of equipment usage records ) - - # Print statistics - generator.print_statistics(dataset) - - # Example: Print first operating room - if dataset['operating_rooms']: - print("\n" + "="*60) - print("Sample Operating Room:") - print("="*60) - room = dataset['operating_rooms'][0] - for key, value in room.items(): - if key not in ['equipment_list', 'special_features']: - print(f"{key}: {value}") - - # Example: Print first surgical case - if dataset['surgical_cases']: - print("\n" + "="*60) - print("Sample Surgical Case:") - print("="*60) - case = dataset['surgical_cases'][0] - for key, value in case.items(): - if key not in ['special_equipment', 'blood_products', 'implants']: - print(f"{key}: {value}") \ No newline at end of file + + +if __name__ == "__main__": + # Run the generator + summary = generate_operating_theatre_data() + print("\nGeneration completed successfully!") \ No newline at end of file diff --git a/patients/.DS_Store b/patients/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2b809d88ab0a1f0a44aacc0f350cfb42dddcec52 GIT binary patch literal 6148 zcmeHK!D`z;5S?}0+Da((A%z?ldNtHBrLE~jxakj6Avv_cm5@n9<=tS(@xd5$PJgIh z((mb;-Hl1=^w`pb8JKzF*%?Xu26jC}q{fTM|>B zhV>uWWm#19VDMA5cG^##b~;gKuXC1M*kw|u^`aW5^UwV2*xE9?@zd<2m@X&1{SVgE zXwS5V|rqY7@T@Mcru9J6NsWjD~%E`0nkxuUDhtps!z#hU<0I zeev?u`%jZ^<;>V?d>cgZ9$21v*x2vz?%msO``;9ZBMb-w!oY)NAe@BVy$8Dk`EX%C z82DQZ@cE#jjB&umqdPia+z0?{BkTk|&k|gt1I7Uxk63{yUkdc4DvTJ)mm{u2UL3IT z=*vlk;X{Qtt1zJ`_jWvAyL3{qN3p_yFmRUvp8X&_zW+b|dH#1vVuS%<;Bhjb+DFOJ z7<&tM>((y$uGP@5P!`T>JZ?(hxT_esd=(!+ogl8+0mcCvkBC6zkAR~=j4<#|8TbW4 CT~|#2 literal 0 HcmV?d00001 diff --git a/patients/__pycache__/admin.cpython-312.pyc b/patients/__pycache__/admin.cpython-312.pyc index e6d0054094e90db3f7c9082f25328f59f99067fe..fed79fb44c1fbc4aa1596f636ab03e901dcd1996 100644 GIT binary patch literal 17048 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 Q>^uv<(^b diff --git a/patients/__pycache__/models.cpython-312.pyc b/patients/__pycache__/models.cpython-312.pyc index 56c5aca6a34c199597382229c39552330ae53cec..eb9fa811ab7457979e93fcb01fafc069bd75a83a 100644 GIT binary patch literal 45438 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 GNdG@tor^#K delta 9313 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 F{V%H?l7j#M diff --git a/patients/__pycache__/urls.cpython-312.pyc b/patients/__pycache__/urls.cpython-312.pyc index 0979de90720acd4fa2b6ea7bf4af91b02a616fdf..1670509406c4d87d15daacbcbb7225ebc9cef82a 100644 GIT binary patch literal 7685 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 UrvS_ji>#p0>_xim374+#Z>oMzA^-pY delta 5720 zcmbVQ30PBC7S4Sk4@_7hAUhISgj7I~f~DfHXt69JDs`)}NPNbxjMVAZemb_=TC}yTGxyvG!4yZn@$>t6=e~3AJ^ML% zm#^FY_?gt{l!Jp@LjR>!?ocphwfH zRH`LHHZE-wy~CV{*A9F(AnZiQLD+}Dq>}H#M})%=A3PYAhX-=IBtUXK;P2sA2tY)P zC-`OW1GPFtTpv-0GX64R_+v6gMFn`T#$%W&@$|`LqtBbK?UuPb%4Lw1xaex3S=1ZxTlYr$s+w*q(7pdR`lDB{V*YXnEt@pSS-Mpoh)g<-@yBCz&GR5xf|y2SJtJ0 zF=IRVXLkxbZm=-UBmw1WU-8wAS+;4%wX|q)teYF>t|I^Q6AM2(gv5a@A5K?8yTF< zi6pXy+%EC}?&Yq1O3ZD|i{!pWyVFvjlZgkCMADt2JM*LMzrl;q0S~-WjGb?gK@A#y zY7?dVmz_+r{${5*OJh&0W2>)3RLD_L1StpQ$u4kM8%5+$TH^`!1@%M$ZxwuJjxAfL zpEH)TBe3AQL z`A^Ux?2-kbN5zf$6e*9jLoEm8YnX?wqSq@iHY64%F5D#xVodgn+&D4{0v7+xybEqF z_M_8?yvo0)eT}G&B^#lr+GA!D9_G-iEp0^s!x8#wUzVoTA5T@+y24M@zgmwRmZV^f z3H)n9NUWGvvzB{$v-oBCcRi7IYh|oC(juP{X-sOS6RW%ZotL1x_MWxuEYf=Qi731} z3ihn>r#`r}Du6^a~`hc5V_KAY5viiXKtM6W(VPc|tG+TyaJJOiyb8Z{Bd z;2ClB1=SS)2rFUjhOs>B9Am_`4F@=KPF!!?LHI=EOoaGN2_#WmvS|gOeZh9~4}2=F zr^3U{kt7u&-dqZ=>~)4u-*kp+^+V(Zr9yFdp`o~_637-$QVHH$R{MA2JzpX8F{jYw z${={V$qlY;aqZnaoZtGA_?hQB?gYXLwVH?XJN;lnyc?vq1PnMv_X^`FGqlJ1g41qSa7b{KXX6nFpTO~! zFp^D!q*$E2*Ov4r5Z3K?gPBQAwpa0J^C%&n6SMLf?)#e+_^S=^3$8z@%O;3sweBJ&a(hhs}cUkv7 zOEtC3`tsRm5`;6l6|#~K%P*}cF$lk-#1F+KNBqgKa%2+_aJCl=6iiNr zLY-h(kfX_4pwG#hQ!21u67%8AQMIg+G7J=dJvyG_u1k#TN0J2a`}|et{8|pfPX&<( z;}AJGXzhIsH+qVofSTuojgbyn_=;Q3_U5m!gz42$*d~cV{w!6P7{8 zDL-SQGjRpwX?qV=j2Jgd#$}XIFGKDW7ZNCcjh>ZmLzim0t>g?RIvf+*J=Iq|BQJPH zUiEzLg6DH>O7}ZbiC64h3FpOs%R5#V*1oo};1VBnM<$WE|70hzcU~WS-aD;ra73Gn z*AFsj1|*yehK}Rk!ti6y2K1qaun4ta3M{A6RKl8L;dE-IqQjTRROaE^BJ~PT91oFK z(Ji?s?9#`C73UwXCVv0>j+NkcB9hdy^XHuS!}+yfJP|Cfrso^*{OZTfhsM)G#o&{< zB=9MBP(6fI(0nSA)X|ILt(B;Q(9^;48hS}BUb6DBOT@<0)1R({cSvqf)Z~z5sgt`mE9{ZHhdckkT9(*;LZdN;*=OmV@Oiv6F zfeI=Syb9gp)mkA6x^o%&Y z?Tj?057o@!jiS)Xf`TWjiHXlIEiTp>1alvTneCyxSyNcs9!NjMi0#of)F$u2t#-dz z>rn2YC05u?8+)3nHcP^EH2;HMp<^?|KWtiINu2$8?UAZKcb>AaoW> zGt@JTDL2Tw4km?WZeGcpQaaKY%8Yk!kVSHnoraDf23@h%Xt+rN?M!@esYY9*H*UE} z2HTosIC|)ftv5-0RRiA0KH#x0Wk->`jKDtquumGdk?cZXKey#5*+2w$1aE|3gfIj) z+_E7s5y?~poEccZW*wLH7y diff --git a/patients/admin.py b/patients/admin.py index c55d03f3..5fd29a14 100644 --- a/patients/admin.py +++ b/patients/admin.py @@ -4,10 +4,7 @@ Admin configuration for patients app. from django.contrib import admin from django.utils.html import format_html -from .models import ( - PatientProfile, EmergencyContact, InsuranceInfo, - ConsentTemplate, ConsentForm, PatientNote -) +from .models import * class EmergencyContactInline(admin.TabularInline): @@ -425,3 +422,136 @@ class PatientNoteAdmin(admin.ModelAdmin): def get_queryset(self, request): return super().get_queryset(request).select_related('patient', 'created_by') +class ClaimDocumentInline(admin.TabularInline): + """Inline admin for claim documents.""" + model = ClaimDocument + extra = 0 + readonly_fields = ['uploaded_at', 'file_size'] + + +class ClaimStatusHistoryInline(admin.TabularInline): + """Inline admin for claim status history.""" + model = ClaimStatusHistory + extra = 0 + readonly_fields = ['changed_at'] + ordering = ['-changed_at'] + fields = [ 'changed_at'] + + +@admin.register(InsuranceClaim) +class InsuranceClaimAdmin(admin.ModelAdmin): + """Admin interface for InsuranceClaim.""" + + list_display = [ + 'claim_number', 'patient', 'claim_type', 'priority', + 'billed_amount', 'approved_amount', 'service_date', 'submitted_date' + ] + list_filter = [ + 'claim_type', 'priority', 'service_date', + 'submitted_date', 'processed_date' + ] + search_fields = [ + 'claim_number', 'patient__first_name', 'patient__last_name', + 'service_provider', 'facility_name', 'primary_diagnosis_code' + ] + ordering = ['-created_at'] + + fieldsets = ( + ('Claim Information', { + 'fields': ('claim_number', 'patient', 'insurance_info', 'claim_type', 'status', 'priority') + }), + ('Service Information', { + 'fields': ( + 'service_date', 'service_provider', 'service_provider_license', + 'facility_name', 'facility_license' + ) + }), + ('Medical Codes', { + 'fields': ( + 'primary_diagnosis_code', 'primary_diagnosis_description', + 'secondary_diagnosis_codes', 'procedure_codes' + ) + }), + ('Financial Information', { + 'fields': ( + 'billed_amount', 'approved_amount', 'paid_amount', + 'patient_responsibility', 'discount_amount' + ) + }), + ('Processing Dates', { + 'fields': ('submitted_date', 'processed_date', 'payment_date') + }), + ('Saudi-specific Information', { + 'fields': ('saudi_id_number', 'insurance_card_number', 'authorization_number') + }), + ('Denial/Appeal Information', { + 'fields': ('denial_reason', 'denial_code', 'appeal_date', 'appeal_reason'), + 'classes': ('collapse',) + }), + ('Additional Information', { + 'fields': ('notes', 'attachments'), + 'classes': ('collapse',) + }) + ) + + readonly_fields = ['created_at', 'updated_at'] + inlines = [ClaimDocumentInline, ClaimStatusHistoryInline] + + def get_queryset(self, request): + """Optimize queryset with select_related.""" + return super().get_queryset(request).select_related('patient', 'insurance_info') + + def formfield_for_foreignkey(self, db_field, request, **kwargs): + """Optimize foreign key fields.""" + if db_field.name == "patient": + kwargs["queryset"] = PatientProfile.objects.select_related('tenant') + elif db_field.name == "insurance_info": + kwargs["queryset"] = InsuranceInfo.objects.select_related('patient') + return super().formfield_for_foreignkey(db_field, request, **kwargs) + + +@admin.register(ClaimDocument) +class ClaimDocumentAdmin(admin.ModelAdmin): + """Admin interface for ClaimDocument.""" + + list_display = [ + 'title', 'claim', 'document_type', 'file_size_display', + 'mime_type', 'uploaded_at', 'uploaded_by' + ] + list_filter = ['document_type', 'mime_type', 'uploaded_at'] + search_fields = ['title', 'claim__claim_number', 'description'] + ordering = ['-uploaded_at'] + + def file_size_display(self, obj): + """Display file size in human readable format.""" + size = obj.file_size + for unit in ['B', 'KB', 'MB', 'GB']: + if size < 1024.0: + return f"{size:.1f} {unit}" + size /= 1024.0 + return f"{size:.1f} TB" + + file_size_display.short_description = 'File Size' + + +@admin.register(ClaimStatusHistory) +class ClaimStatusHistoryAdmin(admin.ModelAdmin): + """Admin interface for ClaimStatusHistory.""" + + list_display = [ + 'claim', 'from_status', 'to_status', 'changed_at', 'changed_by' + ] + list_filter = ['from_status', 'to_status', 'changed_at'] + search_fields = ['claim__claim_number', 'reason', 'notes'] + ordering = ['-changed_at'] + + def get_queryset(self, request): + """Optimize queryset with select_related.""" + return super().get_queryset(request).select_related('claim', 'changed_by') + + +# Custom admin site configuration +admin.site.site_header = "Hospital Management System - Patients" +admin.site.site_title = "HMS Patients Admin" +admin.site.index_title = "Patients Administration" + diff --git a/patients/data_generators/__init__.py b/patients/data_generators/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/patients/data_generators/__pycache__/__init__.cpython-312.pyc b/patients/data_generators/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba2a132653c86918ad718e87e441c461c0f5a4bf GIT binary patch literal 197 zcmZ9Fy$u2}422U81VXw&Xh=he7y;2xTNW1`LHSdh<8+fS0~@dd8_+TVx{eB`^R z`()YAx?T#_{O~xJ`7Z5Wx4P*MF8VX23W`8wb;7QbXM=ujGsy_ MD&|v3DO1Jn2YR_T82|tP literal 0 HcmV?d00001 diff --git a/patients/data_generators/__pycache__/saudi_claims_generator.cpython-312.pyc b/patients/data_generators/__pycache__/saudi_claims_generator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b639a935df30d632a8d091764bca0b47c561263d GIT binary patch literal 24531 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 literal 0 HcmV?d00001 diff --git a/patients/data_generators/saudi_claims_generator.py b/patients/data_generators/saudi_claims_generator.py new file mode 100644 index 00000000..0c1bb5ab --- /dev/null +++ b/patients/data_generators/saudi_claims_generator.py @@ -0,0 +1,592 @@ +""" +Saudi-influenced Insurance Claims Data Generator + +This module generates realistic insurance claims data tailored for the Saudi healthcare system, +including local insurance providers, medical facilities, and healthcare practices. +""" + +import random +import uuid +from datetime import datetime, timedelta +from decimal import Decimal +from django.utils import timezone +from django.contrib.auth import get_user_model + +User = get_user_model() + + +class SaudiClaimsDataGenerator: + """ + Generates realistic insurance claims data for Saudi healthcare system. + """ + + # Saudi Insurance Companies + SAUDI_INSURANCE_COMPANIES = [ + 'Tawuniya (The Company for Cooperative Insurance)', + 'Bupa Arabia for Cooperative Insurance', + 'Malath Cooperative Insurance & Reinsurance Company', + 'Saudi Enaya Cooperative Insurance Company', + 'Allianz Saudi Fransi Cooperative Insurance Company', + 'AXA Cooperative Insurance Company', + 'Arabian Shield Cooperative Insurance Company', + 'Gulf Union Alahlia Cooperative Insurance Company', + 'Solidarity Saudi Takaful Company', + 'Al Rajhi Takaful', + 'Weqaya Takaful Insurance & Reinsurance Company', + 'Sanad Cooperative Insurance & Reinsurance Company', + 'United Cooperative Assurance Company', + 'Buruj Cooperative Insurance Company', + 'Wataniya Insurance Company', + 'Saudi Re for Cooperative Reinsurance Company', + 'Amana Cooperative Insurance Company', + 'Ace Arabia Cooperative Insurance Company', + 'Al-Ahlia Insurance Company', + 'Mediterranean & Gulf Insurance & Reinsurance Company', + ] + + # Saudi Healthcare Providers (Doctors) + SAUDI_HEALTHCARE_PROVIDERS = [ + 'د. أحمد محمد العبدالله', # Dr. Ahmed Mohammed Al-Abdullah + 'د. فاطمة علي الزهراني', # Dr. Fatima Ali Al-Zahrani + 'د. محمد عبدالرحمن القحطاني', # Dr. Mohammed Abdulrahman Al-Qahtani + 'د. نورا سعد الغامدي', # Dr. Nora Saad Al-Ghamdi + 'د. خالد يوسف الشهري', # Dr. Khalid Youssef Al-Shahri + 'د. عائشة حسن الحربي', # Dr. Aisha Hassan Al-Harbi + 'د. عبدالله سليمان المطيري', # Dr. Abdullah Sulaiman Al-Mutairi + 'د. مريم أحمد الدوسري', # Dr. Maryam Ahmed Al-Dosari + 'د. سعد محمد العتيبي', # Dr. Saad Mohammed Al-Otaibi + 'د. هند عبدالعزيز الراشد', # Dr. Hind Abdulaziz Al-Rashid + 'د. عمر فهد الخالدي', # Dr. Omar Fahad Al-Khalidi + 'د. سارة عبدالرحمن الفيصل', # Dr. Sarah Abdulrahman Al-Faisal + 'د. يوسف علي البقمي', # Dr. Youssef Ali Al-Baqami + 'د. ليلى محمد الجبير', # Dr. Layla Mohammed Al-Jubair + 'د. فيصل عبدالله السديري', # Dr. Faisal Abdullah Al-Sudairi + 'د. رنا سعود الأحمد', # Dr. Rana Saud Al-Ahmad + 'د. طارق حسام الدين الأنصاري', # Dr. Tariq Hussamuddin Al-Ansari + 'د. إيمان عبدالمحسن الشمري', # Dr. Iman Abdulmohsen Al-Shamri + 'د. ماجد فواز العسيري', # Dr. Majed Fawaz Al-Asiri + 'د. دانا محمد الفهد', # Dr. Dana Mohammed Al-Fahad + ] + + # Saudi Healthcare Facilities + SAUDI_HEALTHCARE_FACILITIES = [ + 'مستشفى الملك فيصل التخصصي ومركز الأبحاث', # King Faisal Specialist Hospital & Research Centre + 'مستشفى الملك فهد الطبي', # King Fahad Medical City + 'مستشفى الملك عبدالعزيز الجامعي', # King Abdulaziz University Hospital + 'مستشفى الملك خالد الجامعي', # King Khalid University Hospital + 'مستشفى الأمير سلطان العسكري', # Prince Sultan Military Hospital + 'المستشفى السعودي الألماني', # Saudi German Hospital + 'مستشفى دلة', # Dallah Hospital + 'مستشفى الحبيب', # Al Habib Medical Group + 'مستشفى المملكة', # Al Mamlaka Hospital + 'مستشفى الدكتور سليمان الحبيب', # Dr. Sulaiman Al Habib Hospital + 'مستشفى الموسى التخصصي', # Al Mouwasat Hospital + 'مستشفى بقشان', # Bagshan Hospital + 'مستشفى الأهلي', # Al Ahli Hospital + 'مستشفى سعد التخصصي', # Saad Specialist Hospital + 'مستشفى الملك فهد للحرس الوطني', # King Fahad Hospital - National Guard + 'مستشفى الأمير محمد بن عبدالعزيز', # Prince Mohammed bin Abdulaziz Hospital + 'مستشفى الملك سعود', # King Saud Hospital + 'مستشفى الولادة والأطفال', # Maternity and Children Hospital + 'مستشفى العيون التخصصي', # Specialized Eye Hospital + 'مركز الأورام الطبي', # Medical Oncology Center + ] + + # Common Saudi Medical Conditions (ICD-10 codes with Arabic descriptions) + SAUDI_MEDICAL_CONDITIONS = [ + { + 'code': 'E11.9', + 'description_en': 'Type 2 diabetes mellitus without complications', + 'description_ar': 'داء السكري من النوع الثاني بدون مضاعفات', + 'prevalence': 0.25 # High prevalence in Saudi Arabia + }, + { + 'code': 'I10', + 'description_en': 'Essential hypertension', + 'description_ar': 'ارتفاع ضغط الدم الأساسي', + 'prevalence': 0.20 + }, + { + 'code': 'E78.5', + 'description_en': 'Hyperlipidemia', + 'description_ar': 'ارتفاع الدهون في الدم', + 'prevalence': 0.18 + }, + { + 'code': 'M79.3', + 'description_en': 'Panniculitis, unspecified', + 'description_ar': 'التهاب النسيج الشحمي', + 'prevalence': 0.15 + }, + { + 'code': 'J45.9', + 'description_en': 'Asthma, unspecified', + 'description_ar': 'الربو غير المحدد', + 'prevalence': 0.12 + }, + { + 'code': 'K21.9', + 'description_en': 'Gastro-esophageal reflux disease', + 'description_ar': 'مرض الارتجاع المعدي المريئي', + 'prevalence': 0.10 + }, + { + 'code': 'M25.50', + 'description_en': 'Pain in unspecified joint', + 'description_ar': 'ألم في المفصل غير المحدد', + 'prevalence': 0.08 + }, + { + 'code': 'N18.6', + 'description_en': 'End stage renal disease', + 'description_ar': 'المرحلة الأخيرة من مرض الكلى', + 'prevalence': 0.06 + }, + { + 'code': 'F32.9', + 'description_en': 'Major depressive disorder', + 'description_ar': 'اضطراب الاكتئاب الشديد', + 'prevalence': 0.05 + }, + { + 'code': 'Z51.11', + 'description_en': 'Encounter for antineoplastic chemotherapy', + 'description_ar': 'مواجهة للعلاج الكيميائي المضاد للأورام', + 'prevalence': 0.04 + }, + ] + + # Common Procedures (CPT codes) + SAUDI_MEDICAL_PROCEDURES = [ + { + 'code': '99213', + 'description': 'Office visit - established patient', + 'description_ar': 'زيارة العيادة - مريض منتظم', + 'cost_range': (150, 300) + }, + { + 'code': '99214', + 'description': 'Office visit - established patient, moderate complexity', + 'description_ar': 'زيارة العيادة - مريض منتظم، تعقيد متوسط', + 'cost_range': (200, 400) + }, + { + 'code': '80053', + 'description': 'Comprehensive metabolic panel', + 'description_ar': 'فحص الأيض الشامل', + 'cost_range': (100, 200) + }, + { + 'code': '85025', + 'description': 'Blood count; complete (CBC)', + 'description_ar': 'تعداد الدم الكامل', + 'cost_range': (50, 120) + }, + { + 'code': '71020', + 'description': 'Chest X-ray', + 'description_ar': 'أشعة سينية للصدر', + 'cost_range': (80, 150) + }, + { + 'code': '93000', + 'description': 'Electrocardiogram', + 'description_ar': 'تخطيط القلب الكهربائي', + 'cost_range': (75, 150) + }, + { + 'code': '76700', + 'description': 'Abdominal ultrasound', + 'description_ar': 'الموجات فوق الصوتية للبطن', + 'cost_range': (200, 400) + }, + { + 'code': '45378', + 'description': 'Colonoscopy', + 'description_ar': 'تنظير القولون', + 'cost_range': (800, 1500) + }, + { + 'code': '47562', + 'description': 'Laparoscopic cholecystectomy', + 'description_ar': 'استئصال المرارة بالمنظار', + 'cost_range': (5000, 8000) + }, + { + 'code': '66984', + 'description': 'Cataract surgery', + 'description_ar': 'جراحة الساد', + 'cost_range': (3000, 6000) + }, + ] + + # Saudi Names for generating realistic patient data + SAUDI_FIRST_NAMES_MALE = [ + 'محمد', 'أحمد', 'عبدالله', 'عبدالرحمن', 'علي', 'سعد', 'فهد', 'خالد', + 'عبدالعزيز', 'سلطان', 'فيصل', 'عمر', 'يوسف', 'إبراهيم', 'حسن', 'طارق', + 'ماجد', 'نواف', 'بندر', 'تركي', 'مشعل', 'وليد', 'صالح', 'عادل' + ] + + SAUDI_FIRST_NAMES_FEMALE = [ + 'فاطمة', 'عائشة', 'نورا', 'سارة', 'مريم', 'هند', 'ليلى', 'رنا', 'دانا', + 'ريم', 'أمل', 'منى', 'سمر', 'لمى', 'غادة', 'نهى', 'إيمان', 'خديجة', + 'زينب', 'رقية', 'جواهر', 'شهد', 'روان', 'لين' + ] + + SAUDI_FAMILY_NAMES = [ + 'العبدالله', 'الأحمد', 'المحمد', 'العلي', 'الزهراني', 'الغامدي', 'القحطاني', + 'الشهري', 'الحربي', 'المطيري', 'الدوسري', 'العتيبي', 'الراشد', 'الخالدي', + 'الفيصل', 'البقمي', 'الجبير', 'السديري', 'الأنصاري', 'الشمري', 'العسيري', + 'الفهد', 'السعود', 'آل سعود', 'الملك', 'الأمير', 'الشيخ', 'العثمان', + 'الصالح', 'الحسن', 'الحسين', 'الطيار', 'الرشيد', 'الفارس' + ] + + def __init__(self): + """Initialize the Saudi claims data generator.""" + self.generated_claim_numbers = set() + + def generate_saudi_id(self): + """Generate a realistic Saudi ID or Iqama number.""" + # Saudi ID: 1 for Saudi, 2 for resident + prefix = random.choice(['1', '2']) + # Next 9 digits + middle = ''.join([str(random.randint(0, 9)) for _ in range(8)]) + # Check digit (simplified) + check_digit = str(random.randint(0, 9)) + return prefix + middle + check_digit + + def generate_claim_number(self): + """Generate a unique claim number.""" + while True: + year = datetime.now().year + sequence = random.randint(100000, 999999) + claim_number = f"CLM{year}{sequence}" + if claim_number not in self.generated_claim_numbers: + self.generated_claim_numbers.add(claim_number) + return claim_number + + def generate_authorization_number(self): + """Generate a prior authorization number.""" + return f"AUTH{random.randint(100000, 999999)}" + + def generate_provider_license(self): + """Generate a Saudi medical license number.""" + return f"SML{random.randint(10000, 99999)}" + + def generate_facility_license(self): + """Generate a MOH facility license number.""" + return f"MOH{random.randint(100000, 999999)}" + + def select_weighted_condition(self): + """Select a medical condition based on prevalence weights.""" + conditions = self.SAUDI_MEDICAL_CONDITIONS.copy() + weights = [condition['prevalence'] for condition in conditions] + return random.choices(conditions, weights=weights)[0] + + def generate_secondary_diagnoses(self, primary_condition, count=None): + """Generate secondary diagnoses related to primary condition.""" + if count is None: + count = random.choices([0, 1, 2, 3], weights=[0.4, 0.3, 0.2, 0.1])[0] + + secondary = [] + available_conditions = [c for c in self.SAUDI_MEDICAL_CONDITIONS + if c['code'] != primary_condition['code']] + + for _ in range(count): + if available_conditions: + condition = random.choice(available_conditions) + secondary.append({ + 'code': condition['code'], + 'description': condition['description_en'], + 'description_ar': condition['description_ar'] + }) + available_conditions.remove(condition) + + return secondary + + def generate_procedures(self, condition, count=None): + """Generate procedures based on the medical condition.""" + if count is None: + count = random.choices([1, 2, 3], weights=[0.6, 0.3, 0.1])[0] + + procedures = [] + for _ in range(count): + procedure = random.choice(self.SAUDI_MEDICAL_PROCEDURES) + procedures.append({ + 'code': procedure['code'], + 'description': procedure['description'], + 'description_ar': procedure['description_ar'], + 'cost': random.uniform(*procedure['cost_range']) + }) + + return procedures + + def calculate_saudi_costs(self, procedures, claim_type='MEDICAL'): + """Calculate costs in Saudi Riyals with realistic pricing.""" + base_cost = sum(proc['cost'] for proc in procedures) + + # Adjust for claim type + multipliers = { + 'EMERGENCY': 1.5, + 'INPATIENT': 2.0, + 'SURGICAL': 3.0, + 'MATERNITY': 2.5, + 'DENTAL': 0.8, + 'VISION': 0.6, + 'PHARMACY': 0.3, + 'PREVENTIVE': 0.5, + } + + multiplier = multipliers.get(claim_type, 1.0) + billed_amount = Decimal(str(base_cost * multiplier)) + + # Insurance approval rates (realistic for Saudi market) + approval_rates = { + 'PREVENTIVE': (0.95, 1.0), + 'MEDICAL': (0.80, 0.95), + 'EMERGENCY': (0.90, 1.0), + 'INPATIENT': (0.85, 0.95), + 'SURGICAL': (0.75, 0.90), + 'DENTAL': (0.70, 0.85), + 'VISION': (0.60, 0.80), + 'PHARMACY': (0.85, 0.95), + 'MATERNITY': (0.90, 1.0), + } + + min_rate, max_rate = approval_rates.get(claim_type, (0.75, 0.90)) + approval_rate = random.uniform(min_rate, max_rate) + approved_amount = billed_amount * Decimal(str(approval_rate)) + + # Patient responsibility (copay/deductible) + copay_percentage = random.uniform(0.10, 0.25) # 10-25% patient responsibility + patient_responsibility = approved_amount * Decimal(str(copay_percentage)) + + # Paid amount (usually same as approved for Saudi insurance) + paid_amount = approved_amount - patient_responsibility + + return { + 'billed_amount': round(billed_amount, 2), + 'approved_amount': round(approved_amount, 2), + 'paid_amount': round(paid_amount, 2), + 'patient_responsibility': round(patient_responsibility, 2), + 'discount_amount': round(billed_amount - approved_amount, 2) + } + + def generate_claim_status_progression(self): + """Generate realistic claim status progression with dates.""" + statuses = ['DRAFT', 'SUBMITTED', 'UNDER_REVIEW', 'APPROVED', 'PAID'] + + # Some claims may be denied or require appeals + if random.random() < 0.15: # 15% denial rate + statuses = ['DRAFT', 'SUBMITTED', 'UNDER_REVIEW', 'DENIED'] + if random.random() < 0.3: # 30% of denied claims are appealed + statuses.extend(['APPEALED', 'UNDER_REVIEW', 'APPROVED', 'PAID']) + + # Generate dates for each status + base_date = datetime.now() - timedelta(days=random.randint(1, 180)) + status_dates = {} + + for i, status in enumerate(statuses): + if i == 0: + status_dates[status] = base_date + else: + days_increment = random.randint(1, 14) # 1-14 days between status changes + status_dates[status] = status_dates[statuses[i-1]] + timedelta(days=days_increment) + + return statuses[-1], status_dates + + def generate_denial_info(self): + """Generate denial information for denied claims.""" + denial_reasons = [ + 'خدمة غير مغطاة بالبوليصة', # Service not covered by policy + 'مطلوب تصريح مسبق', # Prior authorization required + 'معلومات ناقصة', # Incomplete information + 'مقدم خدمة خارج الشبكة', # Out of network provider + 'تجاوز الحد الأقصى السنوي', # Annual limit exceeded + 'خدمة تجميلية غير ضرورية طبياً', # Cosmetic service not medically necessary + 'تكرار في المطالبة', # Duplicate claim + 'انتهاء صلاحية البوليصة', # Policy expired + 'خدمة مستثناة', # Excluded service + 'مطلوب تقرير طبي إضافي', # Additional medical report required + ] + + denial_codes = ['D001', 'D002', 'D003', 'D004', 'D005', 'D006', 'D007', 'D008', 'D009', 'D010'] + + return { + 'reason': random.choice(denial_reasons), + 'code': random.choice(denial_codes) + } + + def generate_attachments(self, claim_type): + """Generate realistic document attachments for claims.""" + base_attachments = [ + {'type': 'MEDICAL_REPORT', 'name': 'تقرير طبي.pdf'}, + {'type': 'INVOICE', 'name': 'فاتورة.pdf'}, + {'type': 'INSURANCE_CARD', 'name': 'بطاقة التأمين.pdf'}, + ] + + type_specific_attachments = { + 'SURGICAL': [ + {'type': 'OPERATIVE_REPORT', 'name': 'تقرير العملية.pdf'}, + {'type': 'AUTHORIZATION', 'name': 'تصريح مسبق.pdf'}, + ], + 'EMERGENCY': [ + {'type': 'DISCHARGE_SUMMARY', 'name': 'ملخص الخروج.pdf'}, + ], + 'PHARMACY': [ + {'type': 'PRESCRIPTION', 'name': 'وصفة طبية.pdf'}, + ], + 'RADIOLOGY': [ + {'type': 'RADIOLOGY_REPORT', 'name': 'تقرير الأشعة.pdf'}, + ], + 'DIAGNOSTIC': [ + {'type': 'LAB_RESULT', 'name': 'نتائج المختبر.pdf'}, + ], + } + + attachments = base_attachments.copy() + if claim_type in type_specific_attachments: + attachments.extend(type_specific_attachments[claim_type]) + + # Add random additional documents + additional_docs = [ + {'type': 'REFERRAL', 'name': 'خطاب تحويل.pdf'}, + {'type': 'ID_COPY', 'name': 'نسخة الهوية.pdf'}, + {'type': 'OTHER', 'name': 'مستند إضافي.pdf'}, + ] + + num_additional = random.randint(0, 2) + attachments.extend(random.sample(additional_docs, num_additional)) + + return attachments + + def generate_single_claim(self, patient, insurance_info, created_by=None): + """Generate a single realistic insurance claim.""" + # Select claim type with Saudi healthcare patterns + claim_types = [ + ('MEDICAL', 0.35), + ('OUTPATIENT', 0.25), + ('PHARMACY', 0.15), + ('DIAGNOSTIC', 0.10), + ('EMERGENCY', 0.05), + ('INPATIENT', 0.04), + ('PREVENTIVE', 0.03), + ('DENTAL', 0.02), + ('SURGICAL', 0.01), + ] + + claim_type = random.choices( + [ct[0] for ct in claim_types], + weights=[ct[1] for ct in claim_types] + )[0] + + # Generate medical information + primary_condition = self.select_weighted_condition() + secondary_conditions = self.generate_secondary_diagnoses(primary_condition) + procedures = self.generate_procedures(primary_condition) + + # Calculate costs + costs = self.calculate_saudi_costs(procedures, claim_type) + + # Generate status and dates + final_status, status_dates = self.generate_claim_status_progression() + + # Service date (1-180 days ago) + service_date = datetime.now().date() - timedelta(days=random.randint(1, 180)) + + # Generate claim data + claim_data = { + 'claim_number': self.generate_claim_number(), + 'patient': patient, + 'insurance_info': insurance_info, + 'claim_type': claim_type, + 'status': final_status, + 'priority': random.choices( + ['LOW', 'NORMAL', 'HIGH', 'URGENT', 'EMERGENCY'], + weights=[0.1, 0.6, 0.2, 0.08, 0.02] + )[0], + 'service_date': service_date, + 'service_provider': random.choice(self.SAUDI_HEALTHCARE_PROVIDERS), + 'service_provider_license': self.generate_provider_license(), + 'facility_name': random.choice(self.SAUDI_HEALTHCARE_FACILITIES), + 'facility_license': self.generate_facility_license(), + 'primary_diagnosis_code': primary_condition['code'], + 'primary_diagnosis_description': f"{primary_condition['description_en']} / {primary_condition['description_ar']}", + 'secondary_diagnosis_codes': secondary_conditions, + 'procedure_codes': procedures, + 'saudi_id_number': self.generate_saudi_id(), + 'insurance_card_number': f"IC{random.randint(100000000, 999999999)}", + 'authorization_number': self.generate_authorization_number() if random.random() < 0.3 else None, + 'notes': f"مطالبة تأمينية لـ {claim_type.lower()} - تم إنشاؤها تلقائياً", + 'attachments': self.generate_attachments(claim_type), + 'created_by': created_by, + **costs + } + + # Add status-specific dates + if 'SUBMITTED' in status_dates: + claim_data['submitted_date'] = timezone.make_aware( + datetime.combine(status_dates['SUBMITTED'].date(), datetime.min.time()) + ) + + if final_status in ['APPROVED', 'PARTIALLY_APPROVED', 'DENIED'] and 'UNDER_REVIEW' in status_dates: + claim_data['processed_date'] = timezone.make_aware( + datetime.combine(status_dates['UNDER_REVIEW'].date(), datetime.min.time()) + ) + timedelta(days=random.randint(1, 7)) + + if final_status == 'PAID' and 'PAID' in status_dates: + claim_data['payment_date'] = timezone.make_aware( + datetime.combine(status_dates['PAID'].date(), datetime.min.time()) + ) + + # Add denial information if claim is denied + if final_status == 'DENIED': + denial_info = self.generate_denial_info() + claim_data['denial_reason'] = denial_info['reason'] + claim_data['denial_code'] = denial_info['code'] + + return claim_data + + def generate_multiple_claims(self, patients_with_insurance, num_claims=100, created_by=None): + """Generate multiple realistic insurance claims.""" + claims_data = [] + + for _ in range(num_claims): + # Select random patient with insurance + patient, insurance_info = random.choice(patients_with_insurance) + + # Generate claim + claim_data = self.generate_single_claim(patient, insurance_info, created_by) + claims_data.append(claim_data) + + return claims_data + + def get_saudi_insurance_statistics(self, claims): + """Generate statistics specific to Saudi insurance market.""" + total_claims = len(claims) + if total_claims == 0: + return {} + + # Calculate statistics + approved_claims = len([c for c in claims if c['status'] in ['APPROVED', 'PARTIALLY_APPROVED', 'PAID']]) + denied_claims = len([c for c in claims if c['status'] == 'DENIED']) + pending_claims = len([c for c in claims if c['status'] in ['SUBMITTED', 'UNDER_REVIEW']]) + + total_billed = sum(float(c['billed_amount']) for c in claims) + total_approved = sum(float(c['approved_amount']) for c in claims) + total_paid = sum(float(c['paid_amount']) for c in claims) + + return { + 'total_claims': total_claims, + 'approved_claims': approved_claims, + 'denied_claims': denied_claims, + 'pending_claims': pending_claims, + 'approval_rate': (approved_claims / total_claims) * 100, + 'denial_rate': (denied_claims / total_claims) * 100, + 'total_billed_sar': total_billed, + 'total_approved_sar': total_approved, + 'total_paid_sar': total_paid, + 'average_claim_amount_sar': total_billed / total_claims, + 'average_processing_time_days': 7.5, # Typical for Saudi market + } + diff --git a/patients/forms.py b/patients/forms.py index 59f2e098..b649d554 100644 --- a/patients/forms.py +++ b/patients/forms.py @@ -163,7 +163,7 @@ class ConsentTemplateForm(forms.ModelForm): fields = [ 'name', 'description', 'category', 'content', 'version', 'is_active', 'requires_signature', 'requires_witness', 'requires_guardian', - 'effective_date', 'expiry_date' + 'effective_date', 'expiry_date', ] widgets = { 'name': forms.TextInput(attrs={'class': 'form-control'}), diff --git a/patients/management/.DS_Store b/patients/management/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4b9d3d3ca086a5aaed2f395f85282a5509f0c3a4 GIT binary patch literal 6148 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 10: + self.stdout.write(f" ... and {len(used_companies) - 10} more") + + def _get_system_user(self): + """Get or create a system user for created_by field.""" + try: + return User.objects.get(username='system') + except User.DoesNotExist: + # Try to get the first superuser + superuser = User.objects.filter(is_superuser=True).first() + if superuser: + return superuser + + # Try to get any user + user = User.objects.first() + if user: + return user + + # Create a system user if none exists + return User.objects.create_user( + username='system', + email='system@hospital.local', + first_name='System', + last_name='Generator', + is_active=True + ) + diff --git a/patients/migrations/0003_insuranceinfo_is_primary.py b/patients/migrations/0003_insuranceinfo_is_primary.py new file mode 100644 index 00000000..ba614859 --- /dev/null +++ b/patients/migrations/0003_insuranceinfo_is_primary.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.4 on 2025-09-03 12:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("patients", "0002_emergencycontact_authorization_number_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="insuranceinfo", + name="is_primary", + field=models.BooleanField(default=False, help_text="Primary insurance"), + ), + ] diff --git a/patients/migrations/0004_insuranceinfo_status.py b/patients/migrations/0004_insuranceinfo_status.py new file mode 100644 index 00000000..b74fc962 --- /dev/null +++ b/patients/migrations/0004_insuranceinfo_status.py @@ -0,0 +1,27 @@ +# Generated by Django 5.2.4 on 2025-09-03 13:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("patients", "0003_insuranceinfo_is_primary"), + ] + + operations = [ + migrations.AddField( + model_name="insuranceinfo", + name="status", + field=models.CharField( + choices=[ + ("PENDING", "Pending"), + ("APPROVED", "Approved"), + ("DENIED", "Denied"), + ], + default="PENDING", + help_text="Consent status", + max_length=20, + ), + ), + ] diff --git a/patients/migrations/0005_alter_insuranceinfo_status.py b/patients/migrations/0005_alter_insuranceinfo_status.py new file mode 100644 index 00000000..560088bf --- /dev/null +++ b/patients/migrations/0005_alter_insuranceinfo_status.py @@ -0,0 +1,27 @@ +# Generated by Django 5.2.4 on 2025-09-03 13:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("patients", "0004_insuranceinfo_status"), + ] + + operations = [ + migrations.AlterField( + model_name="insuranceinfo", + name="status", + field=models.CharField( + choices=[ + ("PENDING", "Pending"), + ("APPROVED", "Approved"), + ("DENIED", "Denied"), + ], + default="PENDING", + help_text="Insurance status", + max_length=20, + ), + ), + ] diff --git a/patients/migrations/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.py b/patients/migrations/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.py new file mode 100644 index 00000000..6e28ff99 --- /dev/null +++ b/patients/migrations/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.py @@ -0,0 +1,532 @@ +# Generated by Django 5.2.4 on 2025-09-03 14:41 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("patients", "0005_alter_insuranceinfo_status"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="InsuranceClaim", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "claim_number", + models.CharField( + help_text="Unique claim number", max_length=50, unique=True + ), + ), + ( + "claim_type", + models.CharField( + choices=[ + ("MEDICAL", "Medical"), + ("DENTAL", "Dental"), + ("VISION", "Vision"), + ("PHARMACY", "Pharmacy"), + ("EMERGENCY", "Emergency"), + ("INPATIENT", "Inpatient"), + ("OUTPATIENT", "Outpatient"), + ("PREVENTIVE", "Preventive Care"), + ("MATERNITY", "Maternity"), + ("MENTAL_HEALTH", "Mental Health"), + ("REHABILITATION", "Rehabilitation"), + ("DIAGNOSTIC", "Diagnostic"), + ("SURGICAL", "Surgical"), + ("CHRONIC_CARE", "Chronic Care"), + ], + default="MEDICAL", + help_text="Type of claim", + max_length=20, + ), + ), + ( + "status", + models.CharField( + choices=[ + ("DRAFT", "Draft"), + ("SUBMITTED", "Submitted"), + ("UNDER_REVIEW", "Under Review"), + ("APPROVED", "Approved"), + ("PARTIALLY_APPROVED", "Partially Approved"), + ("DENIED", "Denied"), + ("PAID", "Paid"), + ("CANCELLED", "Cancelled"), + ("APPEALED", "Appealed"), + ("RESUBMITTED", "Resubmitted"), + ], + default="DRAFT", + help_text="Current claim status", + max_length=20, + ), + ), + ( + "priority", + models.CharField( + choices=[ + ("LOW", "Low"), + ("NORMAL", "Normal"), + ("HIGH", "High"), + ("URGENT", "Urgent"), + ("EMERGENCY", "Emergency"), + ], + default="NORMAL", + help_text="Claim priority", + max_length=10, + ), + ), + ( + "service_date", + models.DateField(help_text="Date when service was provided"), + ), + ( + "service_provider", + models.CharField( + help_text="Healthcare provider who provided the service", + max_length=200, + ), + ), + ( + "service_provider_license", + models.CharField( + blank=True, + help_text="Provider license number (Saudi Medical License)", + max_length=50, + null=True, + ), + ), + ( + "facility_name", + models.CharField( + blank=True, + help_text="Healthcare facility name", + max_length=200, + null=True, + ), + ), + ( + "facility_license", + models.CharField( + blank=True, + help_text="Facility license number (MOH License)", + max_length=50, + null=True, + ), + ), + ( + "primary_diagnosis_code", + models.CharField( + help_text="Primary diagnosis code (ICD-10)", max_length=20 + ), + ), + ( + "primary_diagnosis_description", + models.TextField(help_text="Primary diagnosis description"), + ), + ( + "secondary_diagnosis_codes", + models.JSONField( + blank=True, + default=list, + help_text="Secondary diagnosis codes and descriptions", + ), + ), + ( + "procedure_codes", + models.JSONField( + blank=True, + default=list, + help_text="Procedure codes (CPT/HCPCS) and descriptions", + ), + ), + ( + "billed_amount", + models.DecimalField( + decimal_places=2, + help_text="Total amount billed (SAR)", + max_digits=12, + ), + ), + ( + "approved_amount", + models.DecimalField( + decimal_places=2, + default=0, + help_text="Amount approved by insurance (SAR)", + max_digits=12, + ), + ), + ( + "paid_amount", + models.DecimalField( + decimal_places=2, + default=0, + help_text="Amount actually paid (SAR)", + max_digits=12, + ), + ), + ( + "patient_responsibility", + models.DecimalField( + decimal_places=2, + default=0, + help_text="Patient copay/deductible amount (SAR)", + max_digits=12, + ), + ), + ( + "discount_amount", + models.DecimalField( + decimal_places=2, + default=0, + help_text="Discount applied (SAR)", + max_digits=12, + ), + ), + ( + "submitted_date", + models.DateTimeField( + blank=True, + help_text="Date claim was submitted to insurance", + null=True, + ), + ), + ( + "processed_date", + models.DateTimeField( + blank=True, help_text="Date claim was processed", null=True + ), + ), + ( + "payment_date", + models.DateTimeField( + blank=True, help_text="Date payment was received", null=True + ), + ), + ( + "saudi_id_number", + models.CharField( + blank=True, + help_text="Saudi National ID or Iqama number", + max_length=10, + null=True, + ), + ), + ( + "insurance_card_number", + models.CharField( + blank=True, + help_text="Insurance card number", + max_length=50, + null=True, + ), + ), + ( + "authorization_number", + models.CharField( + blank=True, + help_text="Prior authorization number if required", + max_length=50, + null=True, + ), + ), + ( + "denial_reason", + models.TextField( + blank=True, + help_text="Reason for denial if applicable", + null=True, + ), + ), + ( + "denial_code", + models.CharField( + blank=True, + help_text="Insurance denial code", + max_length=20, + null=True, + ), + ), + ( + "appeal_date", + models.DateTimeField( + blank=True, help_text="Date appeal was filed", null=True + ), + ), + ( + "appeal_reason", + models.TextField( + blank=True, help_text="Reason for appeal", null=True + ), + ), + ( + "notes", + models.TextField( + blank=True, + help_text="Additional notes about the claim", + null=True, + ), + ), + ( + "attachments", + models.JSONField( + blank=True, default=list, help_text="List of attached documents" + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="created_claims", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "insurance_info", + models.ForeignKey( + help_text="Insurance policy used for this claim", + on_delete=django.db.models.deletion.CASCADE, + related_name="claims", + to="patients.insuranceinfo", + ), + ), + ( + "patient", + models.ForeignKey( + help_text="Patient associated with this claim", + on_delete=django.db.models.deletion.CASCADE, + related_name="insurance_claims", + to="patients.patientprofile", + ), + ), + ], + options={ + "verbose_name": "Insurance Claim", + "verbose_name_plural": "Insurance Claims", + "db_table": "patients_insurance_claim", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="ClaimStatusHistory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "from_status", + models.CharField( + blank=True, + choices=[ + ("DRAFT", "Draft"), + ("SUBMITTED", "Submitted"), + ("UNDER_REVIEW", "Under Review"), + ("APPROVED", "Approved"), + ("PARTIALLY_APPROVED", "Partially Approved"), + ("DENIED", "Denied"), + ("PAID", "Paid"), + ("CANCELLED", "Cancelled"), + ("APPEALED", "Appealed"), + ("RESUBMITTED", "Resubmitted"), + ], + help_text="Previous status", + max_length=20, + null=True, + ), + ), + ( + "to_status", + models.CharField( + choices=[ + ("DRAFT", "Draft"), + ("SUBMITTED", "Submitted"), + ("UNDER_REVIEW", "Under Review"), + ("APPROVED", "Approved"), + ("PARTIALLY_APPROVED", "Partially Approved"), + ("DENIED", "Denied"), + ("PAID", "Paid"), + ("CANCELLED", "Cancelled"), + ("APPEALED", "Appealed"), + ("RESUBMITTED", "Resubmitted"), + ], + help_text="New status", + max_length=20, + ), + ), + ( + "reason", + models.TextField( + blank=True, help_text="Reason for status change", null=True + ), + ), + ( + "notes", + models.TextField( + blank=True, help_text="Additional notes", null=True + ), + ), + ("changed_at", models.DateTimeField(auto_now_add=True)), + ( + "changed_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "claim", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="status_history", + to="patients.insuranceclaim", + ), + ), + ], + options={ + "verbose_name": "Claim Status History", + "verbose_name_plural": "Claim Status Histories", + "db_table": "patients_claim_status_history", + "ordering": ["-changed_at"], + }, + ), + migrations.CreateModel( + name="ClaimDocument", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "document_type", + models.CharField( + choices=[ + ("MEDICAL_REPORT", "Medical Report"), + ("LAB_RESULT", "Laboratory Result"), + ("RADIOLOGY_REPORT", "Radiology Report"), + ("PRESCRIPTION", "Prescription"), + ("INVOICE", "Invoice"), + ("RECEIPT", "Receipt"), + ("AUTHORIZATION", "Prior Authorization"), + ("REFERRAL", "Referral Letter"), + ("DISCHARGE_SUMMARY", "Discharge Summary"), + ("OPERATIVE_REPORT", "Operative Report"), + ("PATHOLOGY_REPORT", "Pathology Report"), + ("INSURANCE_CARD", "Insurance Card Copy"), + ("ID_COPY", "ID Copy"), + ("OTHER", "Other"), + ], + help_text="Type of document", + max_length=20, + ), + ), + ("title", models.CharField(help_text="Document title", max_length=200)), + ( + "description", + models.TextField( + blank=True, help_text="Document description", null=True + ), + ), + ( + "file_path", + models.CharField( + help_text="Path to the document file", max_length=500 + ), + ), + ( + "file_size", + models.PositiveIntegerField(help_text="File size in bytes"), + ), + ( + "mime_type", + models.CharField(help_text="MIME type of the file", max_length=100), + ), + ("uploaded_at", models.DateTimeField(auto_now_add=True)), + ( + "uploaded_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "claim", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="documents", + to="patients.insuranceclaim", + ), + ), + ], + options={ + "verbose_name": "Claim Document", + "verbose_name_plural": "Claim Documents", + "db_table": "patients_claim_document", + "ordering": ["-uploaded_at"], + }, + ), + migrations.AddIndex( + model_name="insuranceclaim", + index=models.Index( + fields=["claim_number"], name="patients_in_claim_n_3b3114_idx" + ), + ), + migrations.AddIndex( + model_name="insuranceclaim", + index=models.Index( + fields=["patient", "service_date"], + name="patients_in_patient_5d8b72_idx", + ), + ), + migrations.AddIndex( + model_name="insuranceclaim", + index=models.Index( + fields=["status", "priority"], name="patients_in_status_41f139_idx" + ), + ), + migrations.AddIndex( + model_name="insuranceclaim", + index=models.Index( + fields=["submitted_date"], name="patients_in_submitt_75aa55_idx" + ), + ), + migrations.AddIndex( + model_name="insuranceclaim", + index=models.Index( + fields=["insurance_info"], name="patients_in_insuran_f48b26_idx" + ), + ), + ] diff --git a/patients/migrations/0007_alter_consenttemplate_category.py b/patients/migrations/0007_alter_consenttemplate_category.py new file mode 100644 index 00000000..765e6a82 --- /dev/null +++ b/patients/migrations/0007_alter_consenttemplate_category.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.4 on 2025-09-04 15:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("patients", "0006_insuranceclaim_claimstatushistory_claimdocument_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="consenttemplate", + name="category", + field=models.CharField( + choices=[ + ("TREATMENT", "Treatment Consent"), + ("PROCEDURE", "Procedure Consent"), + ("SURGERY", "Surgical Consent"), + ("ANESTHESIA", "Anesthesia Consent"), + ("RESEARCH", "Research Consent"), + ("PRIVACY", "Privacy Consent"), + ("FINANCIAL", "Financial Consent"), + ("ADMISSION", "Admission Consent"), + ("DISCHARGE", "Discharge Consent"), + ("OTHER", "Other"), + ], + help_text="Consent category", + max_length=50, + ), + ), + ] diff --git a/patients/migrations/__pycache__/0003_insuranceinfo_is_primary.cpython-312.pyc b/patients/migrations/__pycache__/0003_insuranceinfo_is_primary.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fc1cfb6289588a6e46456089522603f1137fb4e GIT binary patch literal 850 zcmY*YF>ezw6t?d!*Sk}T+6bwj7Kx#$l!2zAjHsv#MM9-QAeJna6Tc)E-TAJzkCILx zbztn)zW{1~06QBjR6=Uym5D7NFjU9P|V+=MXU$aNnOaO}{7Z2shn?Lj-^inbM@h3aJ@J}8es zc#*b15Xu=zGXZ)o=CTl!w;|@8Oh>UKxrkFL2HOV<&qwI)b&c6?hCzoGiPB*YlAI`b zqw20P$r?jAO+kBQtaM^X*shTqkTOq*j)>Wm6$uzTOUPb96I*K;gB&{LhM*BYHG})&~YzQyxiLySlRil^5 zJXSOzCQZA>DXxedNChc*{h%>1vN65zhOu;mTp!AL06y UKa2gN=zM;?@Yp#FKBfY(O{Jx8L{Xy_avlH{VMo2f_1o^;_qQhR_d1 z@~3bGE>-{>A%+>q-pZAMOe+SBJWPe0TUuIrM7&V+5*oI+7w$yF6C_T& zfF^xe`sYNNBBg0hxH`-zZm&1$n~eYq++wNR}r=I)p%7&*y+|5%RW2eO0R%<1r}bVawwpQR@WN zj6GE|5@n>c*E%%GxOAeJUoG}Cx`0FUC$7B`JP|c8YLAB0-=n?T-i;T5wGhC0Uh Yw~4TOY2L-=p>sA-J)NljLO`M}R+)Z1b!f+t^+hE_0;m+$-Ly_YZVTv5c-jl z;woK$vt@)6*G{ZB3TDz0mD)AR6m^?36Olz!O zuj(J3#rKQ;ZPCG literal 0 HcmV?d00001 diff --git a/patients/migrations/__pycache__/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.cpython-312.pyc b/patients/migrations/__pycache__/0006_insuranceclaim_claimstatushistory_claimdocument_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd38f36632b866e344497e0b82824e7118803412 GIT binary patch literal 11620 zcmd^F+ix3JdM7E8A}NWICCZks8qty^I=1AC6g!vAnkFfc4n@)=CB<&DlM&B|8inLA zGegOoq|IK^Hr?&ENxN;*cH3sRExHTq57@`N6fn@DrBDMR1}GY!PkvK3>Pw&copWZ$ z;YHe{P5M$Bpw680`!46Zo$n0!4+8@p3;g?G<`@F@XHi6aLC!T9SS&vM;q&)_|3?;{X!OvAtTqeZ zv*j{F=@>NW@0@*XrE_`P!(Ku;)QLg1JnRov-CKrK6A0PizXLgUdmr2B^oH$2D{>M1 zNfS^XA~*6N`);3M1A^{93JsD6eriQtG>C?FPqauFK89ulXnbh2gXZKhG^c=O44p=2 z+T@%iG-F+Ma&Gs$VL!5q3rBHBKObb#DGOx@zclP zXS(nY9EraSR&3S%If6aY#UfYQEOM0~&vilC`9UGAn`j;_ z>^|SZ`_?h&+vo+rzu02$myX51+=2hbvG`Xy@ZUTZf2RW}3KL)?t1)m`JZqaB*$qwyP$8f)ohB~xQ z6MT2OXF9lNkI`kN1HF0-daVQf8bKeGOAp$ztzV!NMNyKg+!&ty_{xg)h&|6l4f+eN1wLc4rRrPw%9e*SBa zzlnr4`CI5sR6xbN6_tK$-xZBI09y5Ibvw<=U+yeNZ;}0V&38DR@kuL@ypfw;LCR4y zIzWXD*X%WC0eYL@{?8)&h`4^I8CU2xj?(CB zh^gO1@9uuP>5aS#eFuFPeGk3&g=6ZszGO`OHrZX5n1cBD9f+v++v4MQkHVwxw{}+O z2L#zYl76o(I(~R0*WX8fVD5R)2LySoOFj6|-0`44Jd)!dp&zwy{9}Ur)sgup1o!_n zGCyjIOb_}P{VDo0^ygh8^F|l{{FvBpzRQXWc>KlgUm9Kc?q3-rpy=89a=bRs*}M&X z@)dC#Mkj&WPrf21rY}{Mn66-3%4VEt{vNnG0 z+O-9iD=56g3MIKBaittDlr}_GRyd_1Yu=bK8!B)@QL_msyQtY>;ecK1=PHWG<|Lj| zc%=1}C85YkRrXE3s<~xe61ak(@>>5kFRhC*&z86%JmoMOwp1yu^O8EUQWD;(@C=z` z=;Sl(;y{n)-sB5qR^cBhaOvhAu?4=AS2i_gg^*|-%1Eh}`G6Pp)VmxB$3nq440t5u zxB|>M!;wT5rkr8eES*`6Wn#&M=3EtIxWi*xq@uy}axnA&Mw^^e0zS4HQ3q2JzYVGg z+dLEEBpx$d4rU|iL@Wz}mcfovNl>t$fn}mP8;u0x*{C|OOm@ITdGOUHtb5auXz*?< z9?OC{upw`n-{jVXf&gx#8}o!?!KFkplZ}NmPgvmcB~ey{9MHNlE9oU-D_5o><#l8A zhob3ZA{Jsp!E{9J4{b_fNyrgBrBmP%bs!72X2cEZt!Mb10|Y^DZc`L;ysY&ieuJwN z6lnw&B)qCQX%GcGAk+~~2N$#ON8&aVcy?!2?k>l&*+>|MmGz>aKoG%v|4JepNwZ+I zSY%D@UnwD8V$%G!!0%wygQ-+Hxe7$CV7V-b+k|E~6-;Mi!Fc=uYpkooDNa%#1PfKh zgv1dM18N)*0-?31g0Zk>PjLd4?hXYLp-4QAwF==}C=>_^%LPy9a={5?wl5uN?xHWv z%f>#W1#B>1s3J+=H$A-djB-Jqh!Xa)0|fTOlWXuH;>|e|Nr*%U*Mtahhy&OjjV(pt zQ^;eVJHc%@@|-I;9u;XE8~PrWV+_TGCP}miP7ho z9Zm)kaa%yJ8!PdfHe?X#3zB+;##|2K)j&(YM>HM~qipg9&u33Sa=>Pafw6XmYyosC z$-Fw3qOv7MpV12dGn3&eNMQ6lX5thdfM9d17r4@!Chqo9rBKiYHnX=Dm zV}&8rXUKSLC^5CDlXfVvoQyU^YbTB3hG-%QGMj^!f9iOO7Cojh&)|7xCKd``y?!mA zo$n+>yquGSGEP(Vd?&qWSvxKBIkALrRc#0$f@Sq`##m~TEi+sRUOY90$blYd1&7K_ z{DHGm8wBs>cvO*io!b@g1)U)J%gjtDm7R-*QlU(sgP%44g$6Q!<%(jZq&%|$OZ9YC zgc8fpDTV^TlfiW08GgSB1>KAI9GnmZwp`$#U{Fm+X-7g{fWv5z(^Fb!ED^^3Ad$it zi_ChJX&hBlLclJ)0Wz8!lsI^V6A6-9=cS%8*yNN7sS0?Jl7n~YdB{qPSV2< zCu3uoQN-pR4fm0{x{5dECGL}DZ~@8fu{J)9Wvw6dE<&xKxYGouPm%POcsTB%h-!l} z&N&wBr60``Gzk;rI047T!i*>}vA4J)r{}3Q+HeC4)uBN-+GrUVJZ+$T&@F62;Zq4m zL(C;e0N~rQX4C;;gOT{RDuM+14In7k5IfLp$dEVVY4VrZ09v}j0Ge1k$AN>iJ{?c8 z)TEIP#?x9K;GvXL+l&(1&>3Qy4FN)28_+Sj+!H3bbVYNNM1_}CCWw%La~f<#W*BZ= ztSF>75)XqoMd5Or*d4NZCN9VdK1}H(ga{II6|x4c4M>C2kmVHk_JMX;C2@!45YjxA zGIqJX<{}*!tTk!YtD4uKCvxS0gQh*V7Z2fp$11*7j{Y~muK|>#60$xI@r`Xgj-E@sBJ>l#thnK%S+j+eOC?B zf$8lMeodo|nEO|#UC<*JG#6TD6%uGJQGyNyz8!)JXD60)ZU}q^x8ZT?ZM3D?> zsH5O^QL1Wv80*q2;D1)sx_N42mA96|6b+h#fOU zETv;|n_MZ+t3&M(3qeFyaBwxp>s7D>IX|#`iMWw?&_P_Gc_~*GyoGnBHa*jD8UaEX zYYhSDkFbN74B0cITSh(EWmbUx@_fT6c2sGHm(a^{ki~+ zW-6J^s$QepNb_Y;!VRh?9=r>ynU#1}JrRdwhOhl#f6$A{(B%SPC>;#PlJVry1B1y> znnQwE5c3$Nv+0NaKNCvFQlw4qhZ{iS^amcjvBYXJ7K*^2w2k{{JeQ7yB7lbhuFhpF zYaqCijV9BvhoswAM`+aynky=xT*iA& z)c4lSdt(W>Yv7g|-zviDh$$EG(GU{LSY&T3%!ZPw2PzDVIY%-Zjifb461q!C9Ww47 zh9@O6LHB_3s`&tw z+HJ^`jTYX}SRJHkU_8rOBd=(!VhvKY|EigPvxbv2(JnO7Mkwi&CHCg}&Fk0a;k17Q zz507Nt-l8!;0X`;N}FEQ9Rl3F9 zPu_t;8JA@^GH|tAPKG0Kt-pc5#icJqj@)Hv3knkc7DMa5 zE94=+#6?`p;W7wmq7QMSpbxX~c0wQC%On$YXfHq|)cV7;+of{@m?#U;LLWVgqQndN z(yQ>Q#EG_`9E+L_t;4Z`k7j5h;Eo>2vWb;Ayw3;)GofHOqWMyy3?0TcA1f(*p4ZiJ zK^2b?M>*&pk4Uo>`q-aaK8LMX{_96`D{u>w=ODv(IA~CI;LQv?lqxa{$L1EFQ|2~B zxeV_P3M@=>d7ku)a#dFNBD+05XT;E4^Vbh^@a70SWV{`sHJNlrtZgsL$_n}=bNniZ+&|AiE`Lu!!QTHMhVPs8J#e}erX$=ICH>QCN9_g z*XtLj4ySz>e+uvu1fRBAM$fkp^Z~(`WdiiLjS0qwFu@2A+_w@66)47AD4amywM+!+ z{u`KLv=38wfuc$&;H$qT>!? zrw-oOuqNKGI*8KW0yONe1N~wv`gMvf1A40No54vjv*(+^h69g5C^WYyQs^CL2edXD zZAqYaDKZX7$TTz4+H9~%pfqE%>2==oI-p4P<`rZ z9e6a;>}|>;;kJxkXyLJV43As&v-2h%%Wh)6b+={WMt%B)`nl)p=P!Sp{11@gJ>=bw z>~7D2-7QO4xy267INhvx?| zY#3lOt%nfUzCAg;9U)Vjz4NL0{Oj-T|Id7&K+_Sw!mACJHr)aHg+H&>DrmgA79!(b9wK~<=R4|mR@;!X0 z;cS`P^Uc*>Y@TYKR?6DkVlA`!)VD^@JV?Xw8Z-ZibDx>tW9C1de9A1#oqsGonXcJ2zzl{MRa>?d%d`y6iH&hEL+)=y2>hcA3^ z>7y$jUa5~=s-2py%_hJ$Bi=)Y1HjPg9f6(r1_im=kUI(OnEwg$CCqD>)b%pG5xpWkg-86eVHy7_;h@KAwSMljSSS9~ d!u*?M=Fk~;S)Ctv_J=0-h9>{hf}aSN{|5Ep6@dT% literal 0 HcmV?d00001 diff --git a/patients/migrations/__pycache__/0007_alter_consenttemplate_category.cpython-312.pyc b/patients/migrations/__pycache__/0007_alter_consenttemplate_category.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9468fe7936d1c64cf89e8a864f5fdeae74b7f15 GIT binary patch literal 1195 zcmZ8gO>f&q5M5FdMY2sSDGAcTbrBd&5FHvBMUfox0T426tBqxYk^@AS#fG~jDeyzt zrILuJ6v&~++;Z=&Nd7>7Lr*^0*lSO@3AKv?J#|Q#uo40q&6}CG`*wEr&r6p~1mFGl zfA~99g#OAw`PI&y(?{UELljXZM3FL5B6XxHNJTq{s&5djFlDTjq>KOem4!d5%&P6$ z#~id(X-0v^Ng5=vkXn>b77F)*gOG6!PJM9RA%;c@MI)6eo-(Sah*igh;AIK|88pvn z$mej7~XQ%GU>n&W`Oo%^HI#_X3xMOG(q} z+k@e*J?L3k%ZiyueI^33RG~Zez_y(3Zq{&^V1&E=Qnr5J^qyGVr`gH@4_**=wv;or zdwr|l?OBhr=5`Q6Yl2VqHmt3^-eAz%?`KVmMu8A;;miE3-k`f{f%vSs6$sZS+*>|a zZ6Aa?vbGPJdDb}Z$c?gjAHRo-ZC7O7^^?G5LK;2`CpcxVQW!Au3WqHAQXeYJV#IJv zA||Vat^FLZkoMb#)Nv8VSeh8Fi%vrZ{+Ad(pOP@I%@Ji27E=ZXWP;}tEln#-8Q;!V z;qYXTG`b+az|u@6?0mX^N2icP|7D#+!MNx|guf&)315;h01!_Fp73PM+_d8-ViKez z#1JMPD@I7n1Pl#+@k6Ja#m>dc>A+Op!z9;%KbtUI_UO)J#`9NMnA{ORfq8@G8Zw?J z^NM;^d;NHBBIDa%&0~G-NMAd-e*2`kdeT~dd+WHhe$-n3Tm9ne*8D59`rXOu+S%I5 zmCI-KD~36*Tx)5+{K#*XtM}VgY0xo=z2pvkR&=T8%wqqIysW6b1)kI&EL#1D-v+3_ hPkaMrUQra~UkxekGi_DT-kQgajibiKKL|j<{vV%)TRZ>& literal 0 HcmV?d00001 diff --git a/patients/models.py b/patients/models.py index 9fb6d7b0..b84168ca 100644 --- a/patients/models.py +++ b/patients/models.py @@ -14,7 +14,60 @@ class PatientProfile(models.Model): """ Patient profile with comprehensive demographics and healthcare information. """ - + GENDER_CHOICES = [ + ('MALE', 'Male'), + ('FEMALE', 'Female'), + ('OTHER', 'Other'), + ('UNKNOWN', 'Unknown'), + ('PREFER_NOT_TO_SAY', 'Prefer not to say'), + ] + SEX_ASSIGNED_AT_BIRTH_CHOICES = [ + ('MALE', 'Male'), + ('FEMALE', 'Female'), + ('INTERSEX', 'Intersex'), + ('UNKNOWN', 'Unknown'), + ] + RACE_CHOICES = [ + ('AMERICAN_INDIAN', 'American Indian or Alaska Native'), + ('ASIAN', 'Asian'), + ('BLACK', 'Black or African American'), + ('PACIFIC_ISLANDER', 'Native Hawaiian or Other Pacific Islander'), + ('WHITE', 'White'), + ('OTHER', 'Other'), + ('UNKNOWN', 'Unknown'), + ('DECLINED', 'Patient Declined'), + ] + ETHNICITY_CHOICES = [ + ('HISPANIC', 'Hispanic or Latino'), + ('NON_HISPANIC', 'Not Hispanic or Latino'), + ('UNKNOWN', 'Unknown'), + ('DECLINED', 'Patient Declined'), + ] + MARITAL_STATUS_CHOICES = [ + ('SINGLE', 'Single'), + ('MARRIED', 'Married'), + ('DIVORCED', 'Divorced'), + ('WIDOWED', 'Widowed'), + ('SEPARATED', 'Separated'), + ('DOMESTIC_PARTNER', 'Domestic Partner'), + ('OTHER', 'Other'), + ('UNKNOWN', 'Unknown'), + ] + COMMUNICATION_PREFERENCE_CHOICES = [ + ('PHONE', 'Phone'), + ('EMAIL', 'Email'), + ('SMS', 'SMS'), + ('MAIL', 'Mail'), + ('PORTAL', 'Patient Portal'), + ] + ADVANCE_DIRECTIVE_TYPE_CHOICES = [ + ('LIVING_WILL', 'Living Will'), + ('HEALTHCARE_PROXY', 'Healthcare Proxy'), + ('DNR', 'Do Not Resuscitate'), + ('POLST', 'POLST'), + ('OTHER', 'Other'), + ] + # Basic Identifiers patient_id = models.UUIDField( default=uuid.uuid4, @@ -72,23 +125,12 @@ class PatientProfile(models.Model): ) gender = models.CharField( max_length=20, - choices=[ - ('MALE', 'Male'), - ('FEMALE', 'Female'), - ('OTHER', 'Other'), - ('UNKNOWN', 'Unknown'), - ('PREFER_NOT_TO_SAY', 'Prefer not to say'), - ], + choices=GENDER_CHOICES, help_text='Gender' ) sex_assigned_at_birth = models.CharField( max_length=20, - choices=[ - ('MALE', 'Male'), - ('FEMALE', 'Female'), - ('INTERSEX', 'Intersex'), - ('UNKNOWN', 'Unknown'), - ], + choices=SEX_ASSIGNED_AT_BIRTH_CHOICES, blank=True, null=True, help_text='Sex assigned at birth' @@ -97,28 +139,14 @@ class PatientProfile(models.Model): # Race and Ethnicity race = models.CharField( max_length=50, - choices=[ - ('AMERICAN_INDIAN', 'American Indian or Alaska Native'), - ('ASIAN', 'Asian'), - ('BLACK', 'Black or African American'), - ('PACIFIC_ISLANDER', 'Native Hawaiian or Other Pacific Islander'), - ('WHITE', 'White'), - ('OTHER', 'Other'), - ('UNKNOWN', 'Unknown'), - ('DECLINED', 'Patient Declined'), - ], + choices=RACE_CHOICES, blank=True, null=True, help_text='Race' ) ethnicity = models.CharField( max_length=50, - choices=[ - ('HISPANIC', 'Hispanic or Latino'), - ('NON_HISPANIC', 'Not Hispanic or Latino'), - ('UNKNOWN', 'Unknown'), - ('DECLINED', 'Patient Declined'), - ], + choices=ETHNICITY_CHOICES, blank=True, null=True, help_text='Ethnicity' @@ -215,16 +243,7 @@ class PatientProfile(models.Model): # Marital Status and Family marital_status = models.CharField( max_length=20, - choices=[ - ('SINGLE', 'Single'), - ('MARRIED', 'Married'), - ('DIVORCED', 'Divorced'), - ('WIDOWED', 'Widowed'), - ('SEPARATED', 'Separated'), - ('DOMESTIC_PARTNER', 'Domestic Partner'), - ('OTHER', 'Other'), - ('UNKNOWN', 'Unknown'), - ], + choices=MARITAL_STATUS_CHOICES, blank=True, null=True, help_text='Marital status' @@ -242,13 +261,7 @@ class PatientProfile(models.Model): ) communication_preference = models.CharField( max_length=20, - choices=[ - ('PHONE', 'Phone'), - ('EMAIL', 'Email'), - ('SMS', 'SMS'), - ('MAIL', 'Mail'), - ('PORTAL', 'Patient Portal'), - ], + choices=COMMUNICATION_PREFERENCE_CHOICES, default='PHONE', help_text='Preferred communication method' ) @@ -300,13 +313,7 @@ class PatientProfile(models.Model): ) advance_directive_type = models.CharField( max_length=50, - choices=[ - ('LIVING_WILL', 'Living Will'), - ('HEALTHCARE_PROXY', 'Healthcare Proxy'), - ('DNR', 'Do Not Resuscitate'), - ('POLST', 'POLST'), - ('OTHER', 'Other'), - ], + choices=ADVANCE_DIRECTIVE_TYPE_CHOICES, blank=True, null=True, help_text='Type of advance directive' @@ -445,7 +452,21 @@ class EmergencyContact(models.Model): """ Emergency contact information for patients. """ - + RELATIONSHIP_CHOICES = [ + ('SPOUSE', 'Spouse'), + ('PARENT', 'Parent'), + ('CHILD', 'Child'), + ('SIBLING', 'Sibling'), + ('GRANDPARENT', 'Grandparent'), + ('GRANDCHILD', 'Grandchild'), + ('AUNT_UNCLE', 'Aunt/Uncle'), + ('COUSIN', 'Cousin'), + ('FRIEND', 'Friend'), + ('NEIGHBOR', 'Neighbor'), + ('CAREGIVER', 'Caregiver'), + ('GUARDIAN', 'Guardian'), + ('OTHER', 'Other'), + ] # Patient relationship patient = models.ForeignKey( PatientProfile, @@ -464,21 +485,7 @@ class EmergencyContact(models.Model): ) relationship = models.CharField( max_length=50, - choices=[ - ('SPOUSE', 'Spouse'), - ('PARENT', 'Parent'), - ('CHILD', 'Child'), - ('SIBLING', 'Sibling'), - ('GRANDPARENT', 'Grandparent'), - ('GRANDCHILD', 'Grandchild'), - ('AUNT_UNCLE', 'Aunt/Uncle'), - ('COUSIN', 'Cousin'), - ('FRIEND', 'Friend'), - ('NEIGHBOR', 'Neighbor'), - ('CAREGIVER', 'Caregiver'), - ('GUARDIAN', 'Guardian'), - ('OTHER', 'Other'), - ], + choices=RELATIONSHIP_CHOICES, help_text='Relationship to patient' ) @@ -607,7 +614,36 @@ class InsuranceInfo(models.Model): """ Insurance information for patients. """ - + INSURANCE_TYPE_CHOICES = [ + ('PRIMARY', 'Primary'), + ('SECONDARY', 'Secondary'), + ('TERTIARY', 'Tertiary'), + ] + PLAN_TYPE_CHOICES = [ + ('HMO', 'Health Maintenance Organization'), + ('PPO', 'Preferred Provider Organization'), + ('EPO', 'Exclusive Provider Organization'), + ('POS', 'Point of Service'), + ('HDHP', 'High Deductible Health Plan'), + ('MEDICARE', 'Medicare'), + ('MEDICAID', 'Medicaid'), + ('TRICARE', 'TRICARE'), + ('WORKERS_COMP', 'Workers Compensation'), + ('AUTO', 'Auto Insurance'), + ('OTHER', 'Other'), + ] + SUBSCRIBER_RELATIONSHIP_CHOICES = [ + ('SELF', 'Self'), + ('SPOUSE', 'Spouse'), + ('CHILD', 'Child'), + ('PARENT', 'Parent'), + ('OTHER', 'Other'), + ] + STATUS_CHOICES = [ + ('PENDING', 'Pending'), + ('APPROVED', 'Approved'), + ('DENIED', 'Denied'), + ] # Patient relationship patient = models.ForeignKey( PatientProfile, @@ -618,11 +654,7 @@ class InsuranceInfo(models.Model): # Insurance Details insurance_type = models.CharField( max_length=20, - choices=[ - ('PRIMARY', 'Primary'), - ('SECONDARY', 'Secondary'), - ('TERTIARY', 'Tertiary'), - ], + choices=INSURANCE_TYPE_CHOICES, default='PRIMARY', help_text='Insurance type' ) @@ -640,24 +672,17 @@ class InsuranceInfo(models.Model): ) plan_type = models.CharField( max_length=50, - choices=[ - ('HMO', 'Health Maintenance Organization'), - ('PPO', 'Preferred Provider Organization'), - ('EPO', 'Exclusive Provider Organization'), - ('POS', 'Point of Service'), - ('HDHP', 'High Deductible Health Plan'), - ('MEDICARE', 'Medicare'), - ('MEDICAID', 'Medicaid'), - ('TRICARE', 'TRICARE'), - ('WORKERS_COMP', 'Workers Compensation'), - ('AUTO', 'Auto Insurance'), - ('OTHER', 'Other'), - ], + choices=PLAN_TYPE_CHOICES, blank=True, null=True, help_text='Plan type' ) - + status = models.CharField( + max_length=20, + choices=STATUS_CHOICES, + default='PENDING', + help_text='Insurance status' + ) # Policy Information policy_number = models.CharField( max_length=100, @@ -677,13 +702,7 @@ class InsuranceInfo(models.Model): ) subscriber_relationship = models.CharField( max_length=20, - choices=[ - ('SELF', 'Self'), - ('SPOUSE', 'Spouse'), - ('CHILD', 'Child'), - ('PARENT', 'Parent'), - ('OTHER', 'Other'), - ], + choices=SUBSCRIBER_RELATIONSHIP_CHOICES, default='SELF', help_text='Relationship to subscriber' ) @@ -777,6 +796,10 @@ class InsuranceInfo(models.Model): default=True, help_text='Insurance is active' ) + is_primary = models.BooleanField( + default=False, + help_text='Primary insurance' + ) # Notes notes = models.TextField( @@ -814,11 +837,498 @@ class InsuranceInfo(models.Model): return today >= self.effective_date and self.is_active +class InsuranceClaim(models.Model): + """ + Insurance claims for patient services and treatments. + Designed for Saudi healthcare system with local insurance providers. + """ + + # Claim Status Choices + STATUS_CHOICES = [ + ('DRAFT', 'Draft'), + ('SUBMITTED', 'Submitted'), + ('UNDER_REVIEW', 'Under Review'), + ('APPROVED', 'Approved'), + ('PARTIALLY_APPROVED', 'Partially Approved'), + ('DENIED', 'Denied'), + ('PAID', 'Paid'), + ('CANCELLED', 'Cancelled'), + ('APPEALED', 'Appealed'), + ('RESUBMITTED', 'Resubmitted'), + ] + + # Claim Type Choices + CLAIM_TYPE_CHOICES = [ + ('MEDICAL', 'Medical'), + ('DENTAL', 'Dental'), + ('VISION', 'Vision'), + ('PHARMACY', 'Pharmacy'), + ('EMERGENCY', 'Emergency'), + ('INPATIENT', 'Inpatient'), + ('OUTPATIENT', 'Outpatient'), + ('PREVENTIVE', 'Preventive Care'), + ('MATERNITY', 'Maternity'), + ('MENTAL_HEALTH', 'Mental Health'), + ('REHABILITATION', 'Rehabilitation'), + ('DIAGNOSTIC', 'Diagnostic'), + ('SURGICAL', 'Surgical'), + ('CHRONIC_CARE', 'Chronic Care'), + ] + + # Priority Choices + PRIORITY_CHOICES = [ + ('LOW', 'Low'), + ('NORMAL', 'Normal'), + ('HIGH', 'High'), + ('URGENT', 'Urgent'), + ('EMERGENCY', 'Emergency'), + ] + + # Basic Information + claim_number = models.CharField( + max_length=50, + unique=True, + help_text='Unique claim number' + ) + + # Relationships + patient = models.ForeignKey( + PatientProfile, + on_delete=models.CASCADE, + related_name='insurance_claims', + help_text='Patient associated with this claim' + ) + + insurance_info = models.ForeignKey( + InsuranceInfo, + on_delete=models.CASCADE, + related_name='claims', + help_text='Insurance policy used for this claim' + ) + + # Claim Details + claim_type = models.CharField( + max_length=20, + choices=CLAIM_TYPE_CHOICES, + default='MEDICAL', + help_text='Type of claim' + ) + + status = models.CharField( + max_length=20, + choices=STATUS_CHOICES, + default='DRAFT', + help_text='Current claim status' + ) + + priority = models.CharField( + max_length=10, + choices=PRIORITY_CHOICES, + default='NORMAL', + help_text='Claim priority' + ) + + # Service Information + service_date = models.DateField( + help_text='Date when service was provided' + ) + + service_provider = models.CharField( + max_length=200, + help_text='Healthcare provider who provided the service' + ) + + service_provider_license = models.CharField( + max_length=50, + blank=True, + null=True, + help_text='Provider license number (Saudi Medical License)' + ) + + facility_name = models.CharField( + max_length=200, + blank=True, + null=True, + help_text='Healthcare facility name' + ) + + facility_license = models.CharField( + max_length=50, + blank=True, + null=True, + help_text='Facility license number (MOH License)' + ) + + # Medical Codes (Saudi/International Standards) + primary_diagnosis_code = models.CharField( + max_length=20, + help_text='Primary diagnosis code (ICD-10)' + ) + + primary_diagnosis_description = models.TextField( + help_text='Primary diagnosis description' + ) + + secondary_diagnosis_codes = models.JSONField( + default=list, + blank=True, + help_text='Secondary diagnosis codes and descriptions' + ) + + procedure_codes = models.JSONField( + default=list, + blank=True, + help_text='Procedure codes (CPT/HCPCS) and descriptions' + ) + + # Financial Information (Saudi Riyal) + billed_amount = models.DecimalField( + max_digits=12, + decimal_places=2, + help_text='Total amount billed (SAR)' + ) + + approved_amount = models.DecimalField( + max_digits=12, + decimal_places=2, + default=0, + help_text='Amount approved by insurance (SAR)' + ) + + paid_amount = models.DecimalField( + max_digits=12, + decimal_places=2, + default=0, + help_text='Amount actually paid (SAR)' + ) + + patient_responsibility = models.DecimalField( + max_digits=12, + decimal_places=2, + default=0, + help_text='Patient copay/deductible amount (SAR)' + ) + + discount_amount = models.DecimalField( + max_digits=12, + decimal_places=2, + default=0, + help_text='Discount applied (SAR)' + ) + + # Claim Processing + submitted_date = models.DateTimeField( + blank=True, + null=True, + help_text='Date claim was submitted to insurance' + ) + + processed_date = models.DateTimeField( + blank=True, + null=True, + help_text='Date claim was processed' + ) + + payment_date = models.DateTimeField( + blank=True, + null=True, + help_text='Date payment was received' + ) + + # Saudi-specific fields + saudi_id_number = models.CharField( + max_length=10, + blank=True, + null=True, + help_text='Saudi National ID or Iqama number' + ) + + insurance_card_number = models.CharField( + max_length=50, + blank=True, + null=True, + help_text='Insurance card number' + ) + + authorization_number = models.CharField( + max_length=50, + blank=True, + null=True, + help_text='Prior authorization number if required' + ) + + # Denial/Appeal Information + denial_reason = models.TextField( + blank=True, + null=True, + help_text='Reason for denial if applicable' + ) + + denial_code = models.CharField( + max_length=20, + blank=True, + null=True, + help_text='Insurance denial code' + ) + + appeal_date = models.DateTimeField( + blank=True, + null=True, + help_text='Date appeal was filed' + ) + + appeal_reason = models.TextField( + blank=True, + null=True, + help_text='Reason for appeal' + ) + + # Additional Information + notes = models.TextField( + blank=True, + null=True, + help_text='Additional notes about the claim' + ) + + attachments = models.JSONField( + default=list, + blank=True, + help_text='List of attached documents' + ) + + # Tracking + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + created_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='created_claims' + ) + + class Meta: + db_table = 'patients_insurance_claim' + verbose_name = 'Insurance Claim' + verbose_name_plural = 'Insurance Claims' + ordering = ['-created_at'] + indexes = [ + models.Index(fields=['claim_number']), + models.Index(fields=['patient', 'service_date']), + models.Index(fields=['status', 'priority']), + models.Index(fields=['submitted_date']), + models.Index(fields=['insurance_info']), + ] + + def __str__(self): + return f"Claim {self.claim_number} - {self.patient.get_full_name()}" + + @property + def is_approved(self): + """Check if claim is approved.""" + return self.status in ['APPROVED', 'PARTIALLY_APPROVED', 'PAID'] + + @property + def is_denied(self): + """Check if claim is denied.""" + return self.status == 'DENIED' + + @property + def is_paid(self): + """Check if claim is paid.""" + return self.status == 'PAID' + + @property + def days_since_submission(self): + """Calculate days since submission.""" + if self.submitted_date: + return (timezone.now() - self.submitted_date).days + return None + + @property + def processing_time_days(self): + """Calculate processing time in days.""" + if self.submitted_date and self.processed_date: + return (self.processed_date - self.submitted_date).days + return None + + @property + def approval_percentage(self): + """Calculate approval percentage.""" + if self.billed_amount > 0: + return (self.approved_amount / self.billed_amount) * 100 + return 0 + + def save(self, *args, **kwargs): + # Generate claim number if not provided + if not self.claim_number: + import random + from datetime import datetime + year = datetime.now().year + random_num = random.randint(100000, 999999) + self.claim_number = f"CLM{year}{random_num}" + + # Auto-set dates based on status changes + if self.status == 'SUBMITTED' and not self.submitted_date: + self.submitted_date = timezone.now() + elif self.status in ['APPROVED', 'PARTIALLY_APPROVED', 'DENIED'] and not self.processed_date: + self.processed_date = timezone.now() + elif self.status == 'PAID' and not self.payment_date: + self.payment_date = timezone.now() + + super().save(*args, **kwargs) + + +class ClaimDocument(models.Model): + """ + Documents attached to insurance claims. + """ + + DOCUMENT_TYPE_CHOICES = [ + ('MEDICAL_REPORT', 'Medical Report'), + ('LAB_RESULT', 'Laboratory Result'), + ('RADIOLOGY_REPORT', 'Radiology Report'), + ('PRESCRIPTION', 'Prescription'), + ('INVOICE', 'Invoice'), + ('RECEIPT', 'Receipt'), + ('AUTHORIZATION', 'Prior Authorization'), + ('REFERRAL', 'Referral Letter'), + ('DISCHARGE_SUMMARY', 'Discharge Summary'), + ('OPERATIVE_REPORT', 'Operative Report'), + ('PATHOLOGY_REPORT', 'Pathology Report'), + ('INSURANCE_CARD', 'Insurance Card Copy'), + ('ID_COPY', 'ID Copy'), + ('OTHER', 'Other'), + ] + + claim = models.ForeignKey( + InsuranceClaim, + on_delete=models.CASCADE, + related_name='documents' + ) + + document_type = models.CharField( + max_length=20, + choices=DOCUMENT_TYPE_CHOICES, + help_text='Type of document' + ) + + title = models.CharField( + max_length=200, + help_text='Document title' + ) + + description = models.TextField( + blank=True, + null=True, + help_text='Document description' + ) + + file_path = models.CharField( + max_length=500, + help_text='Path to the document file' + ) + + file_size = models.PositiveIntegerField( + help_text='File size in bytes' + ) + + mime_type = models.CharField( + max_length=100, + help_text='MIME type of the file' + ) + + uploaded_at = models.DateTimeField(auto_now_add=True) + uploaded_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.SET_NULL, + null=True, + blank=True + ) + + class Meta: + db_table = 'patients_claim_document' + verbose_name = 'Claim Document' + verbose_name_plural = 'Claim Documents' + ordering = ['-uploaded_at'] + + def __str__(self): + return f"{self.title} - {self.claim.claim_number}" + + +class ClaimStatusHistory(models.Model): + """ + Track status changes for insurance claims. + """ + + claim = models.ForeignKey( + InsuranceClaim, + on_delete=models.CASCADE, + related_name='status_history' + ) + + from_status = models.CharField( + max_length=20, + choices=InsuranceClaim.STATUS_CHOICES, + blank=True, + null=True, + help_text='Previous status' + ) + + to_status = models.CharField( + max_length=20, + choices=InsuranceClaim.STATUS_CHOICES, + help_text='New status' + ) + + reason = models.TextField( + blank=True, + null=True, + help_text='Reason for status change' + ) + + notes = models.TextField( + blank=True, + null=True, + help_text='Additional notes' + ) + + changed_at = models.DateTimeField(auto_now_add=True) + changed_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.SET_NULL, + null=True, + blank=True + ) + + class Meta: + db_table = 'patients_claim_status_history' + verbose_name = 'Claim Status History' + verbose_name_plural = 'Claim Status Histories' + ordering = ['-changed_at'] + + def __str__(self): + return f"{self.claim.claim_number}: {self.from_status} → {self.to_status}" + + + class ConsentTemplate(models.Model): """ Templates for consent forms. """ - + CATEGORY_CHOICES = [ + ('TREATMENT', 'Treatment Consent'), + ('PROCEDURE', 'Procedure Consent'), + ('SURGERY', 'Surgical Consent'), + ('ANESTHESIA', 'Anesthesia Consent'), + ('RESEARCH', 'Research Consent'), + ('PRIVACY', 'Privacy Consent'), + ('FINANCIAL', 'Financial Consent'), + ('ADMISSION', 'Admission Consent'), + ('DISCHARGE', 'Discharge Consent'), + ('OTHER', 'Other'), + ] + # Tenant relationship tenant = models.ForeignKey( 'core.Tenant', @@ -838,17 +1348,7 @@ class ConsentTemplate(models.Model): ) category = models.CharField( max_length=50, - choices=[ - ('TREATMENT', 'Treatment Consent'), - ('PROCEDURE', 'Procedure Consent'), - ('SURGERY', 'Surgical Consent'), - ('ANESTHESIA', 'Anesthesia Consent'), - ('RESEARCH', 'Research Consent'), - ('PRIVACY', 'Privacy Consent'), - ('FINANCIAL', 'Financial Consent'), - ('DISCHARGE', 'Discharge Consent'), - ('OTHER', 'Other'), - ], + choices=CATEGORY_CHOICES, help_text='Consent category' ) @@ -921,7 +1421,13 @@ class ConsentForm(models.Model): """ Patient consent forms. """ - + STATUS_CHOICES = [ + ('PENDING', 'Pending'), + ('SIGNED', 'Signed'), + ('DECLINED', 'Declined'), + ('EXPIRED', 'Expired'), + ('REVOKED', 'Revoked'), + ] # Patient relationship patient = models.ForeignKey( PatientProfile, @@ -947,13 +1453,7 @@ class ConsentForm(models.Model): # Status status = models.CharField( max_length=20, - choices=[ - ('PENDING', 'Pending'), - ('SIGNED', 'Signed'), - ('DECLINED', 'Declined'), - ('EXPIRED', 'Expired'), - ('REVOKED', 'Revoked'), - ], + choices=STATUS_CHOICES, default='PENDING', help_text='Consent status' ) @@ -1136,7 +1636,25 @@ class PatientNote(models.Model): """ General notes and comments about patients. """ - + CATEGORY_CHOICES = [ + ('GENERAL', 'General'), + ('ADMINISTRATIVE', 'Administrative'), + ('CLINICAL', 'Clinical'), + ('BILLING', 'Billing'), + ('INSURANCE', 'Insurance'), + ('SOCIAL', 'Social'), + ('DISCHARGE', 'Discharge Planning'), + ('FOLLOW_UP', 'Follow-up'), + ('ALERT', 'Alert'), + ('OTHER', 'Other'), + ] + PRIORITY_CHOICES = [ + ('LOW', 'Low'), + ('NORMAL', 'Normal'), + ('HIGH', 'High'), + ('URGENT', 'Urgent'), + ] + # Patient relationship patient = models.ForeignKey( PatientProfile, @@ -1164,18 +1682,7 @@ class PatientNote(models.Model): # Category category = models.CharField( max_length=50, - choices=[ - ('GENERAL', 'General'), - ('ADMINISTRATIVE', 'Administrative'), - ('CLINICAL', 'Clinical'), - ('BILLING', 'Billing'), - ('INSURANCE', 'Insurance'), - ('SOCIAL', 'Social'), - ('DISCHARGE', 'Discharge Planning'), - ('FOLLOW_UP', 'Follow-up'), - ('ALERT', 'Alert'), - ('OTHER', 'Other'), - ], + choices=CATEGORY_CHOICES, default='GENERAL', help_text='Note category' ) @@ -1183,12 +1690,7 @@ class PatientNote(models.Model): # Priority priority = models.CharField( max_length=20, - choices=[ - ('LOW', 'Low'), - ('NORMAL', 'Normal'), - ('HIGH', 'High'), - ('URGENT', 'Urgent'), - ], + choices=PRIORITY_CHOICES, default='NORMAL', help_text='Note priority' ) diff --git a/patients/urls.py b/patients/urls.py index 68fba43f..39bc5f3b 100644 --- a/patients/urls.py +++ b/patients/urls.py @@ -14,14 +14,14 @@ urlpatterns = [ path('register/', views.PatientCreateView.as_view(), name='patient_registration'), path('update//', views.PatientUpdateView.as_view(), name='patient_update'), path('delete//', views.PatientDeleteView.as_view(), name='patient_delete'), - path('consents/', views.ConsentFormListView.as_view(), name='consent_management'), + path('consents/', views.ConsentManagementView.as_view(), name='consent_management'), path('consent//', views.ConsentFormDetailView.as_view(), name='consent_management_detail'), path('emergency-contacts/', views.EmergencyContactListView.as_view(), name='emergency_contact_management'), path('emergency-contact//', views.EmergencyContactDetailView.as_view(), name='emergency_contact_management_detail'), path('emergency-contacts/delete//', views.EmergencyContactDeleteView.as_view(), name='emergency_contact_delete'), path('emergency-contacts/update//', views.EmergencyContactUpdateView.as_view(), name='emergency_contact_update'), path('emergency-contacts/create//', views.EmergencyContactCreateView.as_view(), name='emergency_contact_create'), - path('insurance-info//', views.InsuranceInfoListView.as_view(), name='insurance_list'), + path('insurance-info/', views.InsuranceInfoListView.as_view(), name='insurance_list'), path('insurance-info//', views.InsuranceInfoDetailView.as_view(), name='insurance_detail'), path('insurance-info/delete//', views.InsuranceInfoDeleteView.as_view(), name='insurance_delete'), path('insurance-info/update//', views.InsuranceInfoUpdateView.as_view(), name='insurance_update'), @@ -40,10 +40,33 @@ urlpatterns = [ path('emergency-contacts//', views.emergency_contacts_list, name='emergency_contacts_list'), path('insurance-info//', views.insurance_info_list, name='insurance_info_list'), path('consent-forms//', views.consent_forms_list, name='consent_forms_list'), + path('consent-forms/detail//', views.ConsentFormDetailView.as_view(), name='consent_form_detail'), + path('consent-forms/update//', views.ConsentFormUpdateView.as_view(), name='consent_form_update'), + path('patient-notes//', views.patient_notes_list, name='patient_notes_list'), path('add-patient-note//', views.add_patient_note, name='add_patient_note'), path('sign-consent//', views.sign_consent_form, name='sign_consent_form'), path('appointments//', views.patient_appointment_list, name='patient_appointments'), - path('patient-info//', views.get_patient_info, name='get_patient_info') + path('patient-info//', views.get_patient_info, name='get_patient_info'), + path('verify-insurance//', views.verify_insurance, name='verify_insurance'), + path('check-eligibility//', views.check_eligibility, name='check_eligibility'), + path('renew-insurance//', views.renew_insurance, name='renew_insurance'), + path('bulk-renew-insurance/', views.bulk_renew_insurance, name='bulk_renew_insurance'), + path('insurance-claims-history//', views.insurance_claims_history, name='insurance_claims_history'), + path('check-primary-insurance/', views.check_primary_insurance, name='check_primary_insurance'), + path('validate-policy-number/', views.validate_policy_number, name='validate_policy_number'), + path('save-insurance-draft/', views.save_insurance_draft, name='save_insurance_draft'), + path('verify-with-provider/', views.verify_with_provider, name='verify_with_provider'), + + # Insurance Claims URLs + path('claims/', views.insurance_claims_list, name='insurance_claims_list'), + path('claims/dashboard/', views.claims_dashboard, name='claims_dashboard'), + path('claims/new/', views.insurance_claim_form, name='insurance_claim_create'), + path('claims//', views.insurance_claim_detail, name='insurance_claim_detail'), + path('claims//edit/', views.insurance_claim_form, name='insurance_claim_edit'), + path('claims//delete/', views.insurance_claim_delete, name='insurance_claim_delete'), + path('claims//update-status/', views.update_claim_status, name='update_claim_status'), + path('claims/bulk-actions/', views.bulk_claim_actions, name='bulk_claim_actions'), + path('patient//insurance/', views.get_patient_insurance, name='get_patient_insurance'), ] diff --git a/patients/views.py b/patients/views.py index d3361b39..f6983794 100644 --- a/patients/views.py +++ b/patients/views.py @@ -115,7 +115,7 @@ class PatientDetailView(LoginRequiredMixin, DetailView): Patient detail view. """ model = PatientProfile - template_name = 'patients/patient_detail.html' + template_name = 'patients/profiles/patient_detail.html' context_object_name = 'patient' def get_queryset(self): @@ -567,7 +567,7 @@ class InsuranceInfoUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Updat return kwargs def get_success_url(self): - return reverse('patients:insurance_info_detail', kwargs={'pk': self.object.pk}) + return reverse('patients:insurance_detail', kwargs={'pk': self.object.pk}) def form_valid(self, form): response = super().form_valid(form) @@ -595,7 +595,7 @@ class InsuranceInfoDeleteView(LoginRequiredMixin, PermissionRequiredMixin, Delet model = InsuranceInfo template_name = 'patients/insurance/insurance_confirm_delete.html' permission_required = 'patients.delete_insuranceinfo' - success_url = reverse_lazy('patients:insurance_info_list') + success_url = reverse_lazy('patients:insurance_list') def get_queryset(self): tenant = getattr(self.request, 'tenant', None) @@ -632,7 +632,7 @@ class ConsentTemplateListView(LoginRequiredMixin, ListView): List consent templates. """ model = ConsentTemplate - template_name = 'patients/consent_template_list.html' + template_name = 'patients/consents/consent_template_list.html' context_object_name = 'consent_templates' paginate_by = 25 @@ -682,7 +682,7 @@ class ConsentTemplateDetailView(LoginRequiredMixin, DetailView): Display consent template details. """ model = ConsentTemplate - template_name = 'patients/consent_template_detail.html' + template_name = 'patients/consents/consent_template_detail.html' context_object_name = 'consent_template' def get_queryset(self): @@ -698,7 +698,7 @@ class ConsentTemplateCreateView(LoginRequiredMixin, PermissionRequiredMixin, Cre """ model = ConsentTemplate form_class = ConsentTemplateForm - template_name = 'patients/consent_template_form.html' + template_name = 'patients/consents/consent_template_form.html' permission_required = 'patients.add_consenttemplate' success_url = reverse_lazy('patients:consent_template_list') @@ -729,7 +729,7 @@ class ConsentTemplateUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Upd """ model = ConsentTemplate form_class = ConsentTemplateForm - template_name = 'patients/consent_template_form.html' + template_name = 'patients/consents/consent_template_form.html' permission_required = 'patients.change_consenttemplate' def get_queryset(self): @@ -765,7 +765,7 @@ class ConsentTemplateDeleteView(LoginRequiredMixin, PermissionRequiredMixin, Del Delete consent template. """ model = ConsentTemplate - template_name = 'patients/consent_template_confirm_delete.html' + template_name = 'patients/consents/consent_template_confirm_delete.html' permission_required = 'patients.delete_consenttemplate' success_url = reverse_lazy('patients:consent_template_list') @@ -898,6 +898,40 @@ class ConsentFormCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateV return response +class ConsentFormUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): + """ + Create new consent form. + """ + model = ConsentForm + form_class = ConsentFormForm + template_name = 'patients/consents/consent_form_form.html' + permission_required = 'patients.change_consentform' + success_url = reverse_lazy('patients:consent_form_list') + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['user'] = self.request.user + return kwargs + + def form_valid(self, form): + response = super().form_valid(form) + + # Log consent form creation + AuditLogger.log_event( + tenant=getattr(self.request, 'tenant', None), + event_type='CREATE', + event_category='PATIENT_MANAGEMENT', + action='Create Consent Form', + description=f'Created consent form: {self.object.template.name} for {self.object.patient}', + user=self.request.user, + content_object=self.object, + request=self.request + ) + + messages.success(self.request, f'Consent form "{self.object.template.name}" updated successfully.') + return response + + # ============================================================================ # PATIENT NOTE VIEWS (APPEND-ONLY - Clinical Records) # ============================================================================ @@ -1097,24 +1131,24 @@ def patient_stats(request): return render(request, 'patients/partials/patient_stats.html', {'stats': stats}) -@login_required -def emergency_contacts_list(request, patient_id): - """ - HTMX view for emergency contacts list. - """ - tenant = getattr(request, 'tenant', None) - if not tenant: - return JsonResponse({'error': 'No tenant found'}, status=400) - - patient = get_object_or_404(PatientProfile, id=patient_id, tenant=tenant) - emergency_contacts = EmergencyContact.objects.filter( - patient=patient - ).order_by('-is_primary', 'name') - - return render(request, 'patients/partials/emergency_contacts_list.html', { - 'emergency_contacts': emergency_contacts, - 'patient': patient - }) +# @login_required +# def emergency_contacts_list(request, patient_id): +# """ +# HTMX view for emergency contacts list. +# """ +# tenant = getattr(request, 'tenant', None) +# if not tenant: +# return JsonResponse({'error': 'No tenant found'}, status=400) +# +# patient = get_object_or_404(PatientProfile, id=patient_id, tenant=tenant) +# emergency_contacts = EmergencyContact.objects.filter( +# patient=patient +# ).order_by('-is_primary', 'name') +# +# return render(request, 'patients/partials/emergency_contacts_list.html', { +# 'emergency_contacts': emergency_contacts, +# 'patient': patient +# }) @login_required @@ -2215,204 +2249,205 @@ def get_patient_info(request, pk): # return context # # -# class ConsentManagementView(LoginRequiredMixin, PermissionRequiredMixin, TemplateView): -# """ -# View for managing consent templates and patient consent forms. -# -# This view provides functionality to: -# 1. Create and manage consent templates -# 2. View consent status across patients -# 3. Generate consent forms from templates -# 4. Track consent expirations -# """ -# template_name = 'patients/consent_management.html' -# permission_required = 'patients.view_consenttemplate' -# -# def get_context_data(self, **kwargs): -# """Prepare comprehensive context for consent management""" -# context = super().get_context_data(**kwargs) -# -# # Get active consent templates -# templates = ConsentTemplate.objects.filter( -# tenant=self.request.user.tenant, -# is_active=True -# ).order_by('category', 'name') -# -# # Count consents by category -# category_counts = ConsentTemplate.objects.filter( -# tenant=self.request.user.tenant -# ).values('category').annotate(count=Count('id')) -# -# # Get recent consent forms -# recent_consents = ConsentForm.objects.filter( -# tenant=self.request.user.tenant -# ).select_related('patient', 'template').order_by('-created_at')[:10] -# -# # Get expired/expiring consents -# today = timezone.now().date() -# expiry_threshold = today + timezone.timedelta(days=30) -# -# expiring_consents = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='SIGNED', -# expiry_date__lte=expiry_threshold, -# expiry_date__gt=today -# ).select_related('patient', 'template').order_by('expiry_date') -# -# expired_consents = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='SIGNED', -# expiry_date__lt=today -# ).select_related('patient', 'template').order_by('-expiry_date')[:20] -# -# # Get unsigned consents -# unsigned_consents = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='PENDING' -# ).select_related('patient', 'template').order_by('-created_at')[:20] -# -# # Calculate consent statistics -# total_consents = ConsentForm.objects.filter(tenant=self.request.user.tenant).count() -# signed_count = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='SIGNED' -# ).count() -# -# expired_count = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='SIGNED', -# expiry_date__lt=today -# ).count() -# -# pending_count = ConsentForm.objects.filter( -# tenant=self.request.user.tenant, -# status='PENDING' -# ).count() -# -# # Check if we have a template to create -# template_form = None -# if self.request.user.has_perm('patients.add_consenttemplate'): -# template_form = ConsentTemplateForm( -# user=self.request.user, -# tenant=self.request.user.tenant -# ) -# -# # Prepare context -# context.update({ -# 'title': 'Consent Management', -# 'templates': templates, -# 'category_counts': category_counts, -# 'recent_consents': recent_consents, -# 'expiring_consents': expiring_consents, -# 'expired_consents': expired_consents, -# 'unsigned_consents': unsigned_consents, -# 'total_consents': total_consents, -# 'signed_count': signed_count, -# 'expired_count': expired_count, -# 'pending_count': pending_count, -# 'template_form': template_form, -# 'consent_categories': ConsentTemplate._meta.get_field('category').choices, -# }) -# -# return context -# -# def post(self, request, *args, **kwargs): -# """Handle form submissions for template creation""" -# # Check permission for template creation -# if not request.user.has_perm('patients.add_consenttemplate'): -# messages.error(request, "You don't have permission to create consent templates.") -# return redirect('patients:consent_management') -# -# # Process template form -# template_form = ConsentTemplateForm( -# request.POST, -# user=request.user, -# tenant=request.user.tenant -# ) -# -# if template_form.is_valid(): -# template = template_form.save() -# messages.success( -# request, -# f"Consent template '{template.name}' created successfully." -# ) -# return redirect('patients:consent_management') -# else: -# # Re-render page with form errors -# context = self.get_context_data() -# context['template_form'] = template_form -# return self.render_to_response(context) -# -# def get_template(self, template_id): -# """Get a consent template by ID""" -# return get_object_or_404( -# ConsentTemplate, -# pk=template_id, -# tenant=self.request.user.tenant -# ) -# -# def generate_consent_form(self, patient_id, template_id): -# """Generate a consent form for a patient from a template""" -# # Validate permissions -# if not self.request.user.has_perm('patients.add_consentform'): -# messages.error(self.request, "You don't have permission to generate consent forms.") -# return redirect('patients:consent_management') -# -# # Get the patient and template -# patient = get_object_or_404( -# PatientProfile, -# pk=patient_id, -# tenant=self.request.user.tenant -# ) -# -# template = self.get_template(template_id) -# -# # Check if a consent form already exists -# existing_form = ConsentForm.objects.filter( -# patient=patient, -# template=template, -# status='PENDING' -# ).first() -# -# if existing_form: -# messages.info( -# self.request, -# f"A pending consent form already exists for {patient.get_full_name()}." -# ) -# return redirect('patients:consent_form_detail', pk=existing_form.pk) -# -# # Create the consent form -# consent_form = ConsentForm.objects.create( -# consent_id=uuid.uuid4(), -# patient=patient, -# template=template, -# tenant=self.request.user.tenant, -# status='PENDING', -# created_by=self.request.user, -# effective_date=timezone.now().date(), -# expiry_date=template.expiry_date -# ) -# -# # Log the creation -# AuditLogEntry.objects.create( -# tenant=self.request.user.tenant, -# user=self.request.user, -# action='CREATE', -# entity_type='ConsentForm', -# entity_id=str(consent_form.consent_id), -# details={ -# 'patient': patient.get_full_name(), -# 'template': template.name, -# 'status': 'PENDING' -# } -# ) -# -# messages.success( -# self.request, -# f"Consent form generated for {patient.get_full_name()}" -# ) -# -# return redirect('patients:consent_form_detail', pk=consent_form.pk) +class ConsentManagementView(LoginRequiredMixin, PermissionRequiredMixin, TemplateView): + """ + View for managing consent templates and patient consent forms. + + This view provides functionality to: + 1. Create and manage consent templates + 2. View consent status across patients + 3. Generate consent forms from templates + 4. Track consent expirations + """ + template_name = 'patients/consent_management.html' + permission_required = 'patients.view_consenttemplate' + + def get_context_data(self, **kwargs): + """Prepare comprehensive context for consent management""" + context = super().get_context_data(**kwargs) + + # Get active consent templates + templates = ConsentTemplate.objects.filter( + tenant=self.request.user.tenant, + is_active=True + ).order_by('category', 'name') + + # Count consents by category + category_counts = ConsentTemplate.objects.filter( + tenant=self.request.user.tenant + ).values('category').annotate(count=Count('id')) + + # Get recent consent forms + recent_consents = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant + ).select_related('patient', 'template').order_by('-created_at') + + # consent_forms = ConsentForm.objects.filter( + # patient__tenant=self.request.user.tenant + # ) + + # Get expired/expiring consents + today = timezone.now().date() + expiry_threshold = today + timezone.timedelta(days=30) + + expiring_consents = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='SIGNED', + expiry_date__lte=expiry_threshold, + expiry_date__gt=today + ).select_related('patient', 'template').order_by('expiry_date') + + expired_consents = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='SIGNED', + expiry_date__lt=today + ).select_related('patient', 'template').order_by('-expiry_date')[:20] + + # Get unsigned consents + unsigned_consents = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='PENDING' + ).select_related('patient', 'template').order_by('-created_at')[:20] + + # Calculate consent statistics + total_consents = ConsentForm.objects.filter(patient__tenant=self.request.user.tenant).count() + signed_count = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='SIGNED' + ).count() + + expired_count = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='SIGNED', + expiry_date__lt=today + ).count() + + pending_count = ConsentForm.objects.filter( + patient__tenant=self.request.user.tenant, + status='PENDING' + ).count() + + # Check if we have a template to create + template_form = None + if self.request.user.has_perm('patients.add_consenttemplate'): + template_form = ConsentTemplateForm + + # Prepare context + context.update({ + 'title': 'Consent Management', + 'templates': templates, + 'category_counts': category_counts, + 'consents': recent_consents, + 'expiring_consents': expiring_consents, + 'expired_consents': expired_consents, + 'unsigned_consents': unsigned_consents, + 'total_consents': total_consents, + 'signed_count': signed_count, + 'expired_count': expired_count, + 'pending_count': pending_count, + 'template_form': template_form, + 'consent_categories': ConsentTemplate._meta.get_field('category').choices, + }) + + return context + + def post(self, request, *args, **kwargs): + """Handle form submissions for template creation""" + # Check permission for template creation + if not request.user.has_perm('patients.add_consenttemplate'): + messages.error(request, "You don't have permission to create consent templates.") + return redirect('patients:consent_management') + + # Process template form + template_form = ConsentTemplateForm( + request.POST, + user=request.user, + tenant=request.user.tenant + ) + + if template_form.is_valid(): + template = template_form.save() + messages.success( + request, + f"Consent template '{template.name}' created successfully." + ) + return redirect('patients:consent_management') + else: + # Re-render page with form errors + context = self.get_context_data() + context['template_form'] = template_form + return self.render_to_response(context) + + def get_template(self, template_id): + """Get a consent template by ID""" + return get_object_or_404( + ConsentTemplate, + pk=template_id, + tenant=self.request.user.tenant + ) + + def generate_consent_form(self, patient_id, template_id): + """Generate a consent form for a patient from a template""" + # Validate permissions + if not self.request.user.has_perm('patients.add_consentform'): + messages.error(self.request, "You don't have permission to generate consent forms.") + return redirect('patients:consent_management') + + # Get the patient and template + patient = get_object_or_404( + PatientProfile, + pk=patient_id, + tenant=self.request.user.tenant + ) + + template = self.get_template(template_id) + + # Check if a consent form already exists + existing_form = ConsentForm.objects.filter( + patient=patient, + template=template, + status='PENDING' + ).first() + + if existing_form: + messages.info( + self.request, + f"A pending consent form already exists for {patient.get_full_name()}." + ) + return redirect('patients:consent_form_detail', pk=existing_form.pk) + + # Create the consent form + consent_form = ConsentForm.objects.create( + consent_id=uuid.uuid4(), + patient=patient, + template=template, + tenant=self.request.user.tenant, + status='PENDING', + created_by=self.request.user, + effective_date=timezone.now().date(), + expiry_date=template.expiry_date + ) + + # Log the creation + AuditLogEntry.objects.create( + tenant=self.request.user.tenant, + user=self.request.user, + action='CREATE', + entity_type='ConsentForm', + entity_id=str(consent_form.consent_id), + details={ + 'patient': patient.get_full_name(), + 'template': template.name, + 'status': 'PENDING' + } + ) + + messages.success( + self.request, + f"Consent form generated for {patient.get_full_name()}" + ) + + return redirect('patients:consent_form_detail', pk=consent_form.pk) # # # class ConsentFormDetailView(LoginRequiredMixin, DetailView): @@ -2873,158 +2908,158 @@ def get_patient_info(request, pk): # 'form': form, # 'patient': patient # }) -# -# -# @login_required -# def patient_demographics_update(request, patient_id): -# """ -# HTMX view for updating patient demographics. -# """ -# tenant = getattr(request, 'tenant', None) -# patient = get_object_or_404(PatientProfile, pk=patient_id, tenant=tenant) -# -# if request.method == 'POST': -# form = PatientProfileForm(request.POST, instance=patient) -# if form.is_valid(): -# form.save() -# -# # Log the update -# from core.models import AuditLogEntry -# AuditLogEntry.objects.create( -# tenant=tenant, -# user=request.user, -# action='UPDATE', -# entity_type='PatientProfile', -# entity_id=str(patient.patient_id), -# details={ -# 'name': patient.get_full_name(), -# 'mrn': patient.mrn, -# 'fields_updated': list(form.changed_data) -# } -# ) -# -# messages.success(request, 'Patient demographics updated successfully.') -# return JsonResponse({'status': 'success'}) -# else: -# return JsonResponse({'status': 'error', 'errors': form.errors}) -# else: -# form = PatientProfileForm(instance=patient) -# -# return render(request, 'patients/partials/demographics_form.html', { -# 'form': form, -# 'patient': patient -# }) -# -# -# @login_required -# def verify_insurance(request, insurance_id): -# """ -# HTMX view for verifying insurance information. -# """ -# tenant = getattr(request, 'tenant', None) -# insurance = get_object_or_404(InsuranceInfo, pk=insurance_id, patient__tenant=tenant) -# -# if request.method == 'POST': -# insurance.is_verified = True -# insurance.verification_date = timezone.now() -# insurance.verified_by = request.user -# insurance.save() -# -# # Log the verification -# from core.models import AuditLogEntry -# AuditLogEntry.objects.create( -# tenant=tenant, -# user=request.user, -# action='UPDATE', -# entity_type='InsuranceInfo', -# entity_id=str(insurance.id), -# details={ -# 'patient': insurance.patient.get_full_name(), -# 'mrn': insurance.patient.mrn, -# 'insurance': insurance.insurance_company, -# 'policy': insurance.policy_number, -# 'verification_date': str(insurance.verification_date) -# } -# ) -# -# messages.success(request, 'Insurance information verified successfully.') -# -# # Fetch all insurance records for this patient to refresh the list -# insurance_records = InsuranceInfo.objects.filter( -# patient=insurance.patient -# ).order_by('-is_active', '-effective_date') -# -# return render(request, 'patients/partials/insurance_info_list.html', { -# 'insurance_records': insurance_records, -# 'patient': insurance.patient -# }) -# -# return JsonResponse({'status': 'error', 'message': 'Invalid request method'}) -# -# -# @login_required -# def emergency_contacts_list(request, patient_id): -# """ -# HTMX view for listing emergency contacts. -# """ -# tenant = getattr(request, 'tenant', None) -# patient = get_object_or_404(PatientProfile, pk=patient_id, tenant=tenant) -# -# contacts = EmergencyContact.objects.filter( -# patient=patient -# ).order_by('-is_active', 'priority') -# -# # Handle form submission for adding a new contact -# if request.method == 'POST': -# form = EmergencyContactForm(request.POST, user=request.user) -# if form.is_valid(): -# contact = form.save(commit=False) -# contact.patient = patient -# contact.save() -# -# # Log the addition -# from core.models import AuditLogEntry -# AuditLogEntry.objects.create( -# tenant=tenant, -# user=request.user, -# action='CREATE', -# entity_type='EmergencyContact', -# entity_id=str(contact.id), -# details={ -# 'patient': patient.get_full_name(), -# 'mrn': patient.mrn, -# 'contact': contact.get_full_name(), -# 'relationship': contact.relationship -# } -# ) -# -# messages.success(request, 'Emergency contact added successfully.') -# -# # Refresh contacts list -# contacts = EmergencyContact.objects.filter( -# patient=patient -# ).order_by('-is_active', 'priority') -# -# return render(request, 'patients/partials/emergency_contacts_list.html', { -# 'contacts': contacts, -# 'patient': patient -# }) -# else: -# # Return form with errors -# return render(request, 'patients/partials/emergency_contact_form.html', { -# 'form': form, -# 'patient': patient -# }) -# else: -# # Initial form for adding new contact -# initial_data = {'patient': patient.pk} -# form = EmergencyContactForm(initial=initial_data, user=request.user) -# -# return render(request, 'patients/partials/emergency_contacts_list.html', { -# 'contacts': contacts, -# 'patient': patient, -# 'form': form -# }) + + +@login_required +def patient_demographics_update(request, patient_id): + """ + HTMX view for updating patient demographics. + """ + tenant = getattr(request, 'tenant', None) + patient = get_object_or_404(PatientProfile, pk=patient_id, tenant=tenant) + + if request.method == 'POST': + form = PatientProfileForm(request.POST, instance=patient) + if form.is_valid(): + form.save() + + # Log the update + from core.models import AuditLogEntry + AuditLogEntry.objects.create( + tenant=tenant, + user=request.user, + action='UPDATE', + entity_type='PatientProfile', + entity_id=str(patient.patient_id), + details={ + 'name': patient.get_full_name(), + 'mrn': patient.mrn, + 'fields_updated': list(form.changed_data) + } + ) + + messages.success(request, 'Patient demographics updated successfully.') + return JsonResponse({'status': 'success'}) + else: + return JsonResponse({'status': 'error', 'errors': form.errors}) + else: + form = PatientProfileForm(instance=patient) + + return render(request, 'patients/partials/demographics_form.html', { + 'form': form, + 'patient': patient + }) + + +@login_required +def verify_insurance(request, insurance_id): + """ + HTMX view for verifying insurance information. + """ + tenant = getattr(request, 'tenant', None) + insurance = get_object_or_404(InsuranceInfo, pk=insurance_id, patient__tenant=tenant) + + if request.method == 'POST': + insurance.is_verified = True + insurance.verification_date = timezone.now() + insurance.verified_by = request.user + insurance.save() + + # Log the verification + from core.models import AuditLogEntry + AuditLogEntry.objects.create( + tenant=tenant, + user=request.user, + action='UPDATE', + entity_type='InsuranceInfo', + entity_id=str(insurance.id), + details={ + 'patient': insurance.patient.get_full_name(), + 'mrn': insurance.patient.mrn, + 'insurance': insurance.insurance_company, + 'policy': insurance.policy_number, + 'verification_date': str(insurance.verification_date) + } + ) + + messages.success(request, 'Insurance information verified successfully.') + + # Fetch all insurance records for this patient to refresh the list + insurance_records = InsuranceInfo.objects.filter( + patient=insurance.patient + ).order_by('-is_active', '-effective_date') + + return render(request, 'patients/partials/insurance_info_list.html', { + 'insurance_records': insurance_records, + 'patient': insurance.patient + }) + + return JsonResponse({'status': 'error', 'message': 'Invalid request method'}) + + +@login_required +def emergency_contacts_list(request, patient_id): + """ + HTMX view for listing emergency contacts. + """ + tenant = getattr(request, 'tenant', None) + patient = get_object_or_404(PatientProfile, pk=patient_id, tenant=tenant) + + contacts = EmergencyContact.objects.filter( + patient=patient + ).order_by('-is_active', 'priority') + + # Handle form submission for adding a new contact + if request.method == 'POST': + form = EmergencyContactForm(request.POST, user=request.user) + if form.is_valid(): + contact = form.save(commit=False) + contact.patient = patient + contact.save() + + # Log the addition + from core.models import AuditLogEntry + AuditLogEntry.objects.create( + tenant=tenant, + user=request.user, + action='CREATE', + entity_type='EmergencyContact', + entity_id=str(contact.id), + details={ + 'patient': patient.get_full_name(), + 'mrn': patient.mrn, + 'contact': contact.get_full_name(), + 'relationship': contact.relationship + } + ) + + messages.success(request, 'Emergency contact added successfully.') + + # Refresh contacts list + contacts = EmergencyContact.objects.filter( + patient=patient + ).order_by('-is_active', 'priority') + + return render(request, 'patients/partials/emergency_contacts_list.html', { + 'contacts': contacts, + 'patient': patient + }) + else: + # Return form with errors + return render(request, 'patients/emergency_contacts/emergency_contact_form.html', { + 'form': form, + 'patient': patient + }) + else: + # Initial form for adding new contact + initial_data = {'patient': patient.pk} + form = EmergencyContactForm(initial=initial_data, user=request.user) + + return render(request, 'patients/partials/emergency_contacts_list.html', { + 'contacts': contacts, + 'patient': patient, + 'form': form + }) # # # @login_required @@ -3112,3 +3147,1460 @@ def get_patient_info(request, pk): # # # + +@login_required +def check_eligibility(request, pk): + """ + AJAX view to check insurance eligibility for a patient. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + # Get insurance info object + from .models import InsuranceInfo + insurance = get_object_or_404(InsuranceInfo, id=pk, patient__tenant=tenant) + + if request.method == 'POST': + # Simulate eligibility check (in real implementation, this would call insurance API) + import random + from datetime import datetime, timedelta + + # Simulate API call delay + import time + time.sleep(1) + + # Generate mock eligibility data + eligibility_status = random.choice(['active', 'inactive', 'pending', 'expired']) + coverage_types = ['medical', 'dental', 'vision', 'prescription'] + active_coverage = random.sample(coverage_types, random.randint(1, 4)) + + # Calculate mock deductible and copay amounts + deductible_remaining = random.randint(0, 5000) + copay_amount = random.choice([10, 15, 20, 25, 30, 35, 40, 50]) + + # Generate mock effective dates + effective_date = datetime.now() - timedelta(days=random.randint(30, 365)) + expiration_date = effective_date + timedelta(days=365) + + eligibility_data = { + 'status': eligibility_status, + 'effective_date': effective_date.strftime('%Y-%m-%d'), + 'expiration_date': expiration_date.strftime('%Y-%m-%d'), + 'coverage_types': active_coverage, + 'deductible_remaining': deductible_remaining, + 'copay_amount': copay_amount, + 'last_checked': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + 'verification_id': f'VER{random.randint(100000, 999999)}', + 'group_number': insurance.group_number or f'GRP{random.randint(10000, 99999)}', + 'prior_authorization_required': random.choice([True, False]), + 'network_status': random.choice(['in-network', 'out-of-network', 'preferred']), + } + + # Log eligibility check + AuditLogger.log_event( + tenant=tenant, + event_type='READ', + event_category='PATIENT_MANAGEMENT', + action='Check Insurance Eligibility', + description=f'Checked eligibility for {insurance.patient} - {insurance.insurance_company}', + user=request.user, + content_object=insurance, + request=request + ) + + # Render the eligibility results template + html = render(request, 'patients/partials/eligibility_results.html', { + 'insurance': insurance, + 'eligibility': eligibility_data + }).content.decode('utf-8') + + return JsonResponse({ + 'status': 'success', + 'html': html, + 'eligibility_status': eligibility_status + }) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def renew_insurance(request, pk): + """ + AJAX view to renew/mark insurance for renewal. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + # Get insurance info object + from .models import InsuranceInfo + insurance = get_object_or_404(InsuranceInfo, id=pk, patient__tenant=tenant) + + if request.method == 'POST': + try: + # Update insurance renewal status + insurance.renewal_requested = True + insurance.renewal_requested_date = timezone.now() + insurance.renewal_requested_by = request.user + + # If expired, extend expiration date by 1 year + if insurance.expiration_date and insurance.is_expired: + from datetime import timedelta + insurance.expiration_date = insurance.expiration_date + timedelta(days=365) + elif not insurance.expiration_date: + # Set expiration date to 1 year from now if not set + from datetime import timedelta + insurance.expiration_date = timezone.now().date() + timedelta(days=365) + + # Update status if needed + if hasattr(insurance, 'status'): + insurance.status = 'renewal_pending' + + insurance.save() + + # Log insurance renewal request + AuditLogger.log_event( + tenant=tenant, + event_type='UPDATE', + event_category='PATIENT_MANAGEMENT', + action='Request Insurance Renewal', + description=f'Requested renewal for {insurance.patient} - {insurance.insurance_company}', + user=request.user, + content_object=insurance, + request=request + ) + + # Create notification for insurance team (if notification system exists) + try: + from notifications.models import Notification + Notification.objects.create( + tenant=tenant, + title='Insurance Renewal Request', + message=f'Renewal requested for {insurance.patient.get_full_name()} - {insurance.insurance_company}', + notification_type='insurance_renewal', + created_by=request.user, + target_users=['insurance_team'], # This would be configured based on your notification system + ) + except ImportError: + # Notification system not available + pass + + return JsonResponse({ + 'status': 'success', + 'message': 'Insurance marked for renewal successfully', + 'renewal_date': insurance.renewal_requested_date.strftime( + '%Y-%m-%d %H:%M:%S') if insurance.renewal_requested_date else None, + 'expiration_date': insurance.expiration_date.strftime('%Y-%m-%d') if insurance.expiration_date else None + }) + + except Exception as e: + return JsonResponse({ + 'status': 'error', + 'message': f'Failed to process renewal request: {str(e)}' + }, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def bulk_renew_insurance(request): + """ + AJAX view to bulk renew multiple insurance records. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + if request.method == 'POST': + insurance_ids = request.POST.getlist('insurance_ids[]') + + if not insurance_ids: + return JsonResponse({'error': 'No insurance records selected'}, status=400) + + try: + from .models import InsuranceInfo + from datetime import timedelta + + updated_count = 0 + errors = [] + + for insurance_id in insurance_ids: + try: + insurance = InsuranceInfo.objects.get( + id=insurance_id, + patient__tenant=tenant + ) + + # Update insurance renewal status + insurance.renewal_requested = True + insurance.renewal_requested_date = timezone.now() + insurance.renewal_requested_by = request.user + + # If expired, extend expiration date by 1 year + if insurance.expiration_date and insurance.is_expired: + insurance.expiration_date = insurance.expiration_date + timedelta(days=365) + elif not insurance.expiration_date: + # Set expiration date to 1 year from now if not set + insurance.expiration_date = timezone.now().date() + timedelta(days=365) + + # Update status if needed + if hasattr(insurance, 'status'): + insurance.status = 'renewal_pending' + + insurance.save() + updated_count += 1 + + # Log individual renewal request + AuditLogger.log_event( + tenant=tenant, + event_type='UPDATE', + event_category='PATIENT_MANAGEMENT', + action='Bulk Request Insurance Renewal', + description=f'Bulk renewal requested for {insurance.patient} - {insurance.insurance_company}', + user=request.user, + content_object=insurance, + request=request + ) + + except InsuranceInfo.DoesNotExist: + errors.append(f'Insurance record {insurance_id} not found') + except Exception as e: + errors.append(f'Error processing insurance {insurance_id}: {str(e)}') + + # Create bulk notification for insurance team + try: + from notifications.models import Notification + Notification.objects.create( + tenant=tenant, + title='Bulk Insurance Renewal Request', + message=f'Bulk renewal requested for {updated_count} insurance records', + notification_type='bulk_insurance_renewal', + created_by=request.user, + target_users=['insurance_team'], + ) + except ImportError: + # Notification system not available + pass + + response_data = { + 'status': 'success', + 'updated_count': updated_count, + 'message': f'Successfully marked {updated_count} insurance records for renewal' + } + + if errors: + response_data['errors'] = errors + response_data['message'] += f' ({len(errors)} errors occurred)' + + return JsonResponse(response_data) + + except Exception as e: + return JsonResponse({ + 'status': 'error', + 'message': f'Failed to process bulk renewal: {str(e)}' + }, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def insurance_claims_history(request, pk): + """ + AJAX view to load insurance claims history for a patient's insurance. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + # Get insurance info object + from .models import InsuranceInfo + insurance = get_object_or_404(InsuranceInfo, id=pk, patient__tenant=tenant) + + if request.method == 'GET': + # Generate mock claims history (in real implementation, this would query claims database) + import random + from datetime import datetime, timedelta + + # Generate mock claims data + claims = [] + claim_types = [ + 'Office Visit', 'Emergency Room', 'Prescription', 'Laboratory', + 'Radiology', 'Surgery', 'Physical Therapy', 'Specialist Consultation', + 'Dental', 'Vision', 'Mental Health', 'Preventive Care' + ] + + claim_statuses = ['approved', 'pending', 'denied', 'processing', 'paid'] + + # Generate 10-20 mock claims + num_claims = random.randint(10, 20) + + for i in range(num_claims): + claim_date = datetime.now() - timedelta(days=random.randint(1, 730)) # Last 2 years + service_date = claim_date - timedelta(days=random.randint(0, 30)) + + claim_amount = random.uniform(50, 5000) + approved_amount = claim_amount * random.uniform(0.7, 1.0) + patient_responsibility = claim_amount - approved_amount + + status = random.choice(claim_statuses) + + claim = { + 'claim_id': f'CLM{random.randint(100000, 999999)}', + 'service_date': service_date.strftime('%Y-%m-%d'), + 'claim_date': claim_date.strftime('%Y-%m-%d'), + 'service_type': random.choice(claim_types), + 'provider': f'Dr. {random.choice(["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodriguez", "Martinez"])}', + 'claim_amount': round(claim_amount, 2), + 'approved_amount': round(approved_amount, 2) if status in ['approved', 'paid'] else 0, + 'patient_responsibility': round(patient_responsibility, 2) if status in ['approved', 'paid'] else 0, + 'status': status, + 'diagnosis_code': f'{random.choice(["Z00", "M79", "R06", "K59", "I10", "E11", "F32", "G43", "J06", "N39"])}.{random.randint(10, 99)}', + 'procedure_code': f'{random.randint(99000, 99999)}', + 'processed_date': (claim_date + timedelta(days=random.randint(1, 14))).strftime( + '%Y-%m-%d') if status != 'pending' else None, + 'payment_date': (claim_date + timedelta(days=random.randint(15, 45))).strftime( + '%Y-%m-%d') if status == 'paid' else None, + 'denial_reason': random.choice([ + 'Service not covered', 'Prior authorization required', 'Duplicate claim', + 'Information incomplete', 'Out of network provider' + ]) if status == 'denied' else None, + } + claims.append(claim) + + # Sort claims by service date (most recent first) + claims.sort(key=lambda x: x['service_date'], reverse=True) + + # Calculate summary statistics + total_claims = len(claims) + total_claimed = sum(claim['claim_amount'] for claim in claims) + total_approved = sum(claim['approved_amount'] for claim in claims) + total_patient_responsibility = sum(claim['patient_responsibility'] for claim in claims) + + approved_claims = len([c for c in claims if c['status'] in ['approved', 'paid']]) + pending_claims = len([c for c in claims if c['status'] == 'pending']) + denied_claims = len([c for c in claims if c['status'] == 'denied']) + + summary = { + 'total_claims': total_claims, + 'total_claimed': round(total_claimed, 2), + 'total_approved': round(total_approved, 2), + 'total_patient_responsibility': round(total_patient_responsibility, 2), + 'approved_claims': approved_claims, + 'pending_claims': pending_claims, + 'denied_claims': denied_claims, + 'approval_rate': round((approved_claims / total_claims * 100), 1) if total_claims > 0 else 0, + } + + # Log claims history access + AuditLogger.log_event( + tenant=tenant, + event_type='READ', + event_category='PATIENT_MANAGEMENT', + action='View Insurance Claims History', + description=f'Viewed claims history for {insurance.patient} - {insurance.insurance_company}', + user=request.user, + content_object=insurance, + request=request + ) + + # Render the claims history template + html = render(request, 'patients/partials/insurance_claims_history.html', { + 'insurance': insurance, + 'claims': claims, + 'summary': summary + }).content.decode('utf-8') + + return JsonResponse({ + 'status': 'success', + 'html': html, + 'summary': summary + }) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def check_primary_insurance(request): + """ + AJAX view to check if a patient already has primary insurance. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + if request.method == 'POST': + patient_id = request.POST.get('patient_id') + current_insurance_id = request.POST.get('current_insurance_id') + + if not patient_id: + return JsonResponse({'error': 'Patient ID is required'}, status=400) + + try: + from .models import InsuranceInfo, PatientProfile + + # Get patient + patient = get_object_or_404(PatientProfile, id=patient_id, tenant=tenant) + + # Check for existing primary insurance + primary_insurance_query = InsuranceInfo.objects.filter( + patient=patient, + is_primary=True + ) + + # Exclude current insurance if editing + if current_insurance_id and current_insurance_id != 'null': + primary_insurance_query = primary_insurance_query.exclude(id=current_insurance_id) + + existing_primary = primary_insurance_query.first() + + response_data = { + 'has_primary': existing_primary is not None, + 'patient_name': patient.get_full_name(), + 'patient_id': patient.patient_id or patient.id, + } + + if existing_primary: + response_data.update({ + 'existing_primary': { + 'id': existing_primary.id, + 'provider': existing_primary.insurance_company, + 'policy_number': existing_primary.policy_number, + 'member_id': existing_primary.policy_number, + 'effective_date': existing_primary.effective_date.strftime( + '%Y-%m-%d') if existing_primary.effective_date else None, + 'expiration_date': existing_primary.termination_date.strftime( + '%Y-%m-%d') if existing_primary.termination_date else None, + 'is_active': not existing_primary.is_expired if hasattr(existing_primary, + 'is_expired') else True, + } + }) + + # Get all insurance records for this patient for additional context + all_insurance = InsuranceInfo.objects.filter(patient=patient).order_by('-is_primary', '-created_at') + insurance_list = [] + + for insurance in all_insurance: + insurance_info = { + 'id': insurance.id, + 'provider': insurance.insurance_company, + 'policy_number': insurance.policy_number, + 'member_id': insurance.policy_number, + 'is_primary': insurance.is_primary, + 'effective_date': insurance.effective_date.strftime( + '%Y-%m-%d') if insurance.effective_date else None, + 'expiration_date': insurance.termination_date.strftime( + '%Y-%m-%d') if insurance.termination_date else None, + 'is_active': not insurance.is_expired if hasattr(insurance, 'is_expired') else True, + 'created_at': insurance.created_at.strftime('%Y-%m-%d') if insurance.created_at else None, + } + insurance_list.append(insurance_info) + + response_data['all_insurance'] = insurance_list + response_data['total_insurance_count'] = len(insurance_list) + + # Log primary insurance check + AuditLogger.log_event( + tenant=tenant, + event_type='READ', + event_category='PATIENT_MANAGEMENT', + action='Check Primary Insurance', + description=f'Checked primary insurance status for {patient}', + user=request.user, + content_object=patient, + request=request + ) + + return JsonResponse(response_data) + + except PatientProfile.DoesNotExist: + return JsonResponse({'error': 'Patient not found'}, status=404) + except Exception as e: + return JsonResponse({'error': f'Error checking primary insurance: {str(e)}'}, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def validate_policy_number(request): + """ + AJAX view to validate insurance policy number uniqueness and format. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + if request.method == 'POST': + policy_number = request.POST.get('policy_number', '').strip() + provider = request.POST.get('provider', '').strip() + current_insurance_id = request.POST.get('current_insurance_id') + + if not policy_number: + return JsonResponse({ + 'is_valid': False, + 'error': 'Policy number is required' + }) + + if not provider: + return JsonResponse({ + 'is_valid': False, + 'error': 'Insurance provider is required' + }) + + try: + from .models import InsuranceInfo + import re + + # Basic policy number format validation + validation_result = { + 'is_valid': True, + 'warnings': [], + 'suggestions': [], + 'format_valid': True, + 'uniqueness_valid': True, + 'provider_specific_validation': True + } + + # Format validation based on common insurance policy number patterns + format_patterns = { + 'Aetna': r'^[A-Z]{2}\d{8,12}$', + 'Blue Cross Blue Shield': r'^[A-Z]{3}\d{9}$', + 'Cigna': r'^[A-Z0-9]{8,15}$', + 'UnitedHealthcare': r'^[A-Z0-9]{9,12}$', + 'Humana': r'^[A-Z0-9]{8,14}$', + 'Kaiser Permanente': r'^[A-Z0-9]{7,12}$', + 'Anthem': r'^[A-Z]{2,3}\d{8,10}$', + 'Medicare': r'^[A-Z0-9]{11}$', + 'Medicaid': r'^[A-Z0-9]{8,15}$', + } + + # Check format for known providers + provider_pattern = None + for known_provider, pattern in format_patterns.items(): + if known_provider.lower() in provider.lower(): + provider_pattern = pattern + break + + if provider_pattern: + if not re.match(provider_pattern, policy_number.upper()): + validation_result['format_valid'] = False + validation_result['warnings'].append(f'Policy number format may not match {provider} standards') + validation_result['suggestions'].append(f'Expected format for {provider}: {provider_pattern}') + else: + # Generic validation for unknown providers + if len(policy_number) < 6: + validation_result['format_valid'] = False + validation_result['warnings'].append('Policy number seems too short') + elif len(policy_number) > 20: + validation_result['format_valid'] = False + validation_result['warnings'].append('Policy number seems too long') + + # Check for common invalid characters + if re.search(r'[^A-Za-z0-9\-]', policy_number): + validation_result['format_valid'] = False + validation_result['warnings'].append('Policy number contains invalid characters') + + # Check uniqueness within the tenant + existing_query = InsuranceInfo.objects.filter( + patient__tenant=tenant, + policy_number__iexact=policy_number, + insurance_provider__iexact=provider + ) + + # Exclude current insurance if editing + if current_insurance_id and current_insurance_id != 'null': + existing_query = existing_query.exclude(id=current_insurance_id) + + existing_insurance = existing_query.first() + + if existing_insurance: + validation_result['uniqueness_valid'] = False + validation_result['is_valid'] = False + validation_result['warnings'].append('Policy number already exists for this provider') + validation_result['existing_insurance'] = { + 'id': existing_insurance.id, + 'patient_name': existing_insurance.patient.get_full_name(), + 'patient_id': existing_insurance.patient.patient_id or existing_insurance.patient.id, + 'effective_date': existing_insurance.effective_date.strftime( + '%Y-%m-%d') if existing_insurance.effective_date else None, + 'is_primary': existing_insurance.is_primary, + } + + # Check for similar policy numbers (potential typos) + similar_policies = InsuranceInfo.objects.filter( + patient__tenant=tenant, + insurance_provider__iexact=provider, + policy_number__icontains=policy_number[:6] # Check first 6 characters + ) + + if current_insurance_id and current_insurance_id != 'null': + similar_policies = similar_policies.exclude(id=current_insurance_id) + + if similar_policies.exists() and not existing_insurance: + similar_list = [] + for similar in similar_policies[:3]: # Limit to 3 suggestions + similar_list.append({ + 'policy_number': similar.policy_number, + 'patient_name': similar.patient.get_full_name(), + 'patient_id': similar.patient.patient_id or similar.patient.id, + }) + + if similar_list: + validation_result['suggestions'].append('Similar policy numbers found') + validation_result['similar_policies'] = similar_list + + # Provider-specific validation rules + provider_lower = provider.lower() + + if 'medicare' in provider_lower: + # Medicare-specific validation + if not re.match(r'^[A-Z0-9]{11}$', policy_number.upper()): + validation_result['provider_specific_validation'] = False + validation_result['warnings'].append( + 'Medicare policy numbers should be 11 characters (letters and numbers)') + + elif 'medicaid' in provider_lower: + # Medicaid-specific validation + if len(policy_number) < 8: + validation_result['provider_specific_validation'] = False + validation_result['warnings'].append('Medicaid policy numbers are typically 8+ characters') + + # Overall validation result + if not validation_result['format_valid'] or not validation_result['uniqueness_valid']: + validation_result['is_valid'] = False + elif validation_result['warnings']: + # Valid but with warnings + validation_result['is_valid'] = True + validation_result['has_warnings'] = True + + # Log policy number validation + AuditLogger.log_event( + tenant=tenant, + event_type='VALIDATE', + event_category='PATIENT_MANAGEMENT', + action='Validate Policy Number', + description=f'Validated policy number {policy_number} for provider {provider}', + user=request.user, + request=request + ) + + return JsonResponse(validation_result) + + except Exception as e: + return JsonResponse({ + 'is_valid': False, + 'error': f'Error validating policy number: {str(e)}' + }, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def save_insurance_draft(request): + """ + AJAX view to save insurance form as draft. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + if request.method == 'POST': + try: + from .models import InsuranceInfo, PatientProfile + from .forms import InsuranceInfoForm + import json + + # Get form data + form_data = request.POST.copy() + + # Check if this is an update to existing insurance or new draft + insurance_id = form_data.get('insurance_id') + patient_id = form_data.get('patient') + + if not patient_id: + return JsonResponse({ + 'success': False, + 'error': 'Patient ID is required' + }) + + # Get patient + patient = get_object_or_404(PatientProfile, id=patient_id, tenant=tenant) + + # Prepare draft data + draft_data = { + 'patient_id': patient_id, + 'insurance_provider': form_data.get('insurance_provider', ''), + 'policy_number': form_data.get('policy_number', ''), + 'member_id': form_data.get('member_id', ''), + 'group_number': form_data.get('group_number', ''), + 'is_primary': form_data.get('is_primary') == 'on', + 'effective_date': form_data.get('effective_date', ''), + 'expiration_date': form_data.get('expiration_date', ''), + 'copay': form_data.get('copay', ''), + 'deductible': form_data.get('deductible', ''), + 'notes': form_data.get('notes', ''), + 'subscriber_name': form_data.get('subscriber_name', ''), + 'subscriber_relationship': form_data.get('subscriber_relationship', ''), + 'subscriber_dob': form_data.get('subscriber_dob', ''), + 'subscriber_ssn': form_data.get('subscriber_ssn', ''), + 'employer': form_data.get('employer', ''), + 'plan_type': form_data.get('plan_type', ''), + 'network_type': form_data.get('network_type', ''), + 'prior_authorization_required': form_data.get('prior_authorization_required') == 'on', + 'saved_at': timezone.now().isoformat(), + 'saved_by': request.user.id, + } + + # Try to create or update insurance record as draft + if insurance_id: + # Update existing insurance + insurance = get_object_or_404(InsuranceInfo, id=insurance_id, patient__tenant=tenant) + + # Update fields with non-empty values + for field, value in draft_data.items(): + if field not in ['patient_id', 'saved_at', 'saved_by'] and value: + if field == 'is_primary' or field == 'prior_authorization_required': + setattr(insurance, field, value) + elif field in ['effective_date', 'expiration_date', 'subscriber_dob']: + if value: + try: + from datetime import datetime + date_value = datetime.strptime(value, '%Y-%m-%d').date() + setattr(insurance, field, date_value) + except ValueError: + pass # Skip invalid dates + elif field in ['copay', 'deductible']: + if value: + try: + numeric_value = float(value) + setattr(insurance, field, numeric_value) + except ValueError: + pass # Skip invalid numbers + else: + setattr(insurance, field, value) + + # Mark as draft + if hasattr(insurance, 'status'): + insurance.status = 'draft' + + insurance.save() + + action = 'Update Insurance Draft' + message = f'Updated insurance draft for {patient}' + + else: + # Create new insurance record as draft + insurance_data = {} + + # Map form fields to model fields + for field, value in draft_data.items(): + if field not in ['patient_id', 'saved_at', 'saved_by'] and value: + if field in ['effective_date', 'expiration_date', 'subscriber_dob']: + if value: + try: + from datetime import datetime + insurance_data[field] = datetime.strptime(value, '%Y-%m-%d').date() + except ValueError: + pass # Skip invalid dates + elif field in ['copay', 'deductible']: + if value: + try: + insurance_data[field] = float(value) + except ValueError: + pass # Skip invalid numbers + else: + insurance_data[field] = value + + # Create insurance record + insurance = InsuranceInfo.objects.create( + patient=patient, + **insurance_data + ) + + # Mark as draft + if hasattr(insurance, 'status'): + insurance.status = 'draft' + insurance.save() + + action = 'Create Insurance Draft' + message = f'Created insurance draft for {patient}' + + # Store draft metadata (if you have a separate draft tracking system) + try: + # This would be used if you have a separate drafts table + from django.core.cache import cache + draft_key = f'insurance_draft_{patient.id}_{request.user.id}' + cache.set(draft_key, json.dumps(draft_data), timeout=86400) # 24 hours + except: + pass # Cache not available or other error + + # Log draft save + AuditLogger.log_event( + tenant=tenant, + event_type='CREATE' if not insurance_id else 'UPDATE', + event_category='PATIENT_MANAGEMENT', + action=action, + description=message, + user=request.user, + content_object=insurance, + request=request + ) + + return JsonResponse({ + 'success': True, + 'message': 'Draft saved successfully', + 'insurance_id': insurance.id, + 'saved_at': timezone.now().strftime('%Y-%m-%d %H:%M:%S'), + 'draft_data': { + 'provider': draft_data.get('insurance_provider', ''), + 'policy_number': draft_data.get('policy_number', ''), + 'is_primary': draft_data.get('is_primary', False), + 'has_required_fields': bool( + draft_data.get('insurance_provider') and + draft_data.get('policy_number') and + draft_data.get('member_id') + ) + } + }) + + except PatientProfile.DoesNotExist: + return JsonResponse({ + 'success': False, + 'error': 'Patient not found' + }, status=404) + except Exception as e: + return JsonResponse({ + 'success': False, + 'error': f'Error saving draft: {str(e)}' + }, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +@login_required +def verify_with_provider(request): + """ + AJAX view to verify insurance information directly with the provider. + """ + tenant = getattr(request, 'tenant', None) + if not tenant: + return JsonResponse({'error': 'No tenant found'}, status=400) + + if request.method == 'POST': + provider = request.POST.get('provider', '').strip() + policy_number = request.POST.get('policy_number', '').strip() + + if not provider or not policy_number: + return JsonResponse({ + 'success': False, + 'error': 'Provider and policy number are required' + }) + + try: + import random + from datetime import datetime, timedelta + import time + + # Simulate API call delay + time.sleep(2) + + # Generate mock verification results + verification_statuses = ['verified', 'not_found', 'expired', 'suspended', 'pending'] + verification_status = random.choice(verification_statuses) + + # Base verification data + verification_data = { + 'status': verification_status, + 'provider': provider, + 'policy_number': policy_number, + 'verification_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + 'verification_id': f'VER{random.randint(100000, 999999)}', + 'response_time': f'{random.uniform(1.5, 3.0):.1f}s', + } + + if verification_status == 'verified': + # Generate detailed verification data for verified policies + effective_date = datetime.now() - timedelta(days=random.randint(30, 730)) + expiration_date = effective_date + timedelta(days=365) + + verification_data.update({ + 'policy_holder': { + 'name': f'{random.choice(["John", "Jane", "Michael", "Sarah", "David", "Lisa"])} {random.choice(["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia"])}', + 'dob': (datetime.now() - timedelta(days=random.randint(6570, 25550))).strftime('%Y-%m-%d'), + # 18-70 years old + 'member_id': f'MEM{random.randint(100000000, 999999999)}', + 'relationship': random.choice(['self', 'spouse', 'child', 'parent']) + }, + 'coverage_details': { + 'effective_date': effective_date.strftime('%Y-%m-%d'), + 'expiration_date': expiration_date.strftime('%Y-%m-%d'), + 'plan_name': f'{provider} {random.choice(["Gold", "Silver", "Bronze", "Platinum", "Premium"])} Plan', + 'plan_type': random.choice(['HMO', 'PPO', 'EPO', 'POS']), + 'group_number': f'GRP{random.randint(10000, 99999)}', + 'network': random.choice(['In-Network', 'Out-of-Network', 'Preferred Provider']) + }, + 'benefits': { + 'deductible': random.choice([500, 1000, 1500, 2000, 2500, 5000]), + 'out_of_pocket_max': random.choice([3000, 5000, 7500, 10000, 12500]), + 'copay_primary': random.choice([10, 15, 20, 25, 30]), + 'copay_specialist': random.choice([25, 35, 45, 50, 75]), + 'coinsurance': random.choice([10, 15, 20, 25, 30]), + 'prescription_coverage': random.choice([True, False]), + 'dental_coverage': random.choice([True, False]), + 'vision_coverage': random.choice([True, False]) + }, + 'authorization': { + 'prior_auth_required': random.choice([True, False]), + 'referral_required': random.choice([True, False]), + 'pre_certification_required': random.choice([True, False]) + }, + 'contact_info': { + 'customer_service': f'1-800-{random.randint(100, 999)}-{random.randint(1000, 9999)}', + 'provider_services': f'1-800-{random.randint(100, 999)}-{random.randint(1000, 9999)}', + 'website': f'www.{provider.lower().replace(" ", "")}.com', + 'claims_address': f'{random.randint(100, 9999)} Insurance Blvd, Claims City, ST {random.randint(10000, 99999)}' + } + }) + + elif verification_status == 'not_found': + verification_data.update({ + 'error_details': { + 'code': 'POLICY_NOT_FOUND', + 'message': 'Policy number not found in provider database', + 'suggestions': [ + 'Verify the policy number is correct', + 'Check if the policy has been recently issued', + 'Contact the insurance provider directly' + ] + } + }) + + elif verification_status == 'expired': + expiration_date = datetime.now() - timedelta(days=random.randint(1, 365)) + verification_data.update({ + 'policy_holder': { + 'name': f'{random.choice(["John", "Jane", "Michael", "Sarah"])} {random.choice(["Smith", "Johnson", "Williams", "Brown"])}', + 'member_id': f'MEM{random.randint(100000000, 999999999)}' + }, + 'expiration_details': { + 'expired_date': expiration_date.strftime('%Y-%m-%d'), + 'days_expired': (datetime.now() - expiration_date).days, + 'renewal_options': [ + 'Contact employer for renewal', + 'Apply for individual coverage', + 'Check for COBRA eligibility' + ] + } + }) + + elif verification_status == 'suspended': + verification_data.update({ + 'suspension_details': { + 'reason': random.choice(['Non-payment', 'Fraud investigation', 'Administrative review']), + 'suspended_date': (datetime.now() - timedelta(days=random.randint(1, 90))).strftime('%Y-%m-%d'), + 'reinstatement_required': True, + 'contact_required': True + } + }) + + elif verification_status == 'pending': + verification_data.update({ + 'pending_details': { + 'reason': random.choice( + ['New enrollment processing', 'Coverage change in progress', 'System update in progress']), + 'expected_resolution': (datetime.now() + timedelta(days=random.randint(1, 14))).strftime( + '%Y-%m-%d'), + 'reference_number': f'REF{random.randint(100000, 999999)}' + } + }) + + # Log verification attempt + AuditLogger.log_event( + tenant=tenant, + event_type='VERIFY', + event_category='PATIENT_MANAGEMENT', + action='Verify Insurance with Provider', + description=f'Verified insurance {policy_number} with {provider} - Status: {verification_status}', + user=request.user, + request=request + ) + + # Render the verification results template + html = render(request, 'patients/partials/provider_verification_results.html', { + 'verification': verification_data + }).content.decode('utf-8') + + return JsonResponse({ + 'success': True, + 'status': verification_status, + 'html': html, + 'verification_id': verification_data['verification_id'] + }) + + except Exception as e: + return JsonResponse({ + 'success': False, + 'error': f'Error verifying with provider: {str(e)}' + }, status=500) + + return JsonResponse({'error': 'Invalid request method'}, status=405) + + +# Insurance Claims Views +from .models import InsuranceClaim, ClaimDocument, ClaimStatusHistory +from django.core.paginator import Paginator +from django.db.models import Q, Sum, Count, Avg +from django.db.models.functions import TruncMonth +import json + + +@login_required +def insurance_claims_list(request): + """List all insurance claims with filtering and search.""" + claims = InsuranceClaim.objects.filter( + patient__tenant=request.user.tenant + ).select_related('patient', 'insurance_info').order_by('-created_at') + + # Search functionality + search_query = request.GET.get('search', '') + if search_query: + claims = claims.filter( + Q(claim_number__icontains=search_query) | + Q(patient__first_name__icontains=search_query) | + Q(patient__last_name__icontains=search_query) | + Q(service_provider__icontains=search_query) | + Q(facility_name__icontains=search_query) + ) + + # Filter by status + status_filter = request.GET.get('status', '') + if status_filter: + claims = claims.filter(status=status_filter) + + # Filter by claim type + type_filter = request.GET.get('type', '') + if type_filter: + claims = claims.filter(claim_type=type_filter) + + # Filter by priority + priority_filter = request.GET.get('priority', '') + if priority_filter: + claims = claims.filter(priority=priority_filter) + + # Date range filter + date_from = request.GET.get('date_from', '') + date_to = request.GET.get('date_to', '') + if date_from: + claims = claims.filter(service_date__gte=date_from) + if date_to: + claims = claims.filter(service_date__lte=date_to) + + # Calculate statistics + stats = claims.aggregate( + total_claims=Count('id'), + total_billed=Sum('billed_amount'), + total_approved=Sum('approved_amount'), + total_paid=Sum('paid_amount'), + avg_amount=Avg('billed_amount') + ) + + # Status distribution + status_counts = claims.values('status').annotate(count=Count('id')) + + # Pagination + paginator = Paginator(claims, 20) + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + context = { + 'claims': page_obj, + 'search_query': search_query, + 'status_filter': status_filter, + 'type_filter': type_filter, + 'priority_filter': priority_filter, + 'date_from': date_from, + 'date_to': date_to, + 'stats': stats, + 'status_counts': status_counts, + 'status_choices': InsuranceClaim.STATUS_CHOICES, + 'type_choices': InsuranceClaim.CLAIM_TYPE_CHOICES, + 'priority_choices': InsuranceClaim.PRIORITY_CHOICES, + } + + return render(request, 'patients/claims/insurance_claims_list.html', context) + + +@login_required +def insurance_claim_detail(request, claim_id): + """Display detailed view of an insurance claim.""" + claim = get_object_or_404( + InsuranceClaim.objects.select_related('patient', 'insurance_info', 'created_by'), + id=claim_id, + patient__tenant=request.user.tenant + ) + + # Get claim documents + documents = claim.documents.all().order_by('-uploaded_at') + + # Get status history + status_history = claim.status_history.all().select_related('changed_by').order_by('-changed_at') + + # Calculate approval percentage + approval_percentage = 0 + if claim.billed_amount > 0: + approval_percentage = (claim.approved_amount / claim.billed_amount) * 100 + + context = { + 'claim': claim, + 'documents': documents, + 'status_history': status_history, + 'approval_percentage': approval_percentage, + } + + return render(request, 'patients/claims/insurance_claim_detail.html', context) + + +@login_required +def insurance_claim_form(request, claim_id=None): + """Create or edit an insurance claim.""" + claim = None + if claim_id: + claim = get_object_or_404( + InsuranceClaim, + id=claim_id, + patient__tenant=request.user.tenant + ) + + if request.method == 'POST': + try: + # Get form data + patient_id = request.POST.get('patient') + insurance_id = request.POST.get('insurance_info') + + # Validate patient and insurance + patient = get_object_or_404( + PatientProfile, + id=patient_id, + tenant=request.user.tenant + ) + + insurance_info = get_object_or_404( + InsuranceInfo, + id=insurance_id, + patient=patient + ) + + # Prepare claim data + claim_data = { + 'patient': patient, + 'insurance_info': insurance_info, + 'claim_type': request.POST.get('claim_type'), + 'priority': request.POST.get('priority', 'NORMAL'), + 'service_date': request.POST.get('service_date'), + 'service_provider': request.POST.get('service_provider'), + 'service_provider_license': request.POST.get('service_provider_license'), + 'facility_name': request.POST.get('facility_name'), + 'facility_license': request.POST.get('facility_license'), + 'primary_diagnosis_code': request.POST.get('primary_diagnosis_code'), + 'primary_diagnosis_description': request.POST.get('primary_diagnosis_description'), + 'billed_amount': request.POST.get('billed_amount'), + 'saudi_id_number': request.POST.get('saudi_id_number'), + 'insurance_card_number': request.POST.get('insurance_card_number'), + 'authorization_number': request.POST.get('authorization_number'), + 'notes': request.POST.get('notes'), + } + + # Handle JSON fields + secondary_diagnoses = request.POST.get('secondary_diagnosis_codes', '[]') + procedures = request.POST.get('procedure_codes', '[]') + attachments = request.POST.get('attachments', '[]') + + try: + claim_data['secondary_diagnosis_codes'] = json.loads(secondary_diagnoses) + claim_data['procedure_codes'] = json.loads(procedures) + claim_data['attachments'] = json.loads(attachments) + except json.JSONDecodeError: + claim_data['secondary_diagnosis_codes'] = [] + claim_data['procedure_codes'] = [] + claim_data['attachments'] = [] + + if claim: + # Update existing claim + for key, value in claim_data.items(): + setattr(claim, key, value) + claim.save() + + # Create status history entry + ClaimStatusHistory.objects.create( + claim=claim, + from_status=claim.status, + to_status=claim.status, + reason='Claim updated', + changed_by=request.user + ) + + messages.success(request, f'Claim {claim.claim_number} updated successfully.') + else: + # Create new claim + claim_data['created_by'] = request.user + claim = InsuranceClaim.objects.create(**claim_data) + + # Create initial status history + ClaimStatusHistory.objects.create( + claim=claim, + from_status=None, + to_status='DRAFT', + reason='Initial claim creation', + changed_by=request.user + ) + + messages.success(request, f'Claim {claim.claim_number} created successfully.') + + return redirect('patients:insurance_claim_detail', claim_id=claim.id) + + except Exception as e: + messages.error(request, f'Error saving claim: {str(e)}') + + # Get patients and their insurance for form + patients = PatientProfile.objects.filter(tenant=request.user.tenant).order_by('last_name', 'first_name') + + context = { + 'claim': claim, + 'patients': patients, + 'status_choices': InsuranceClaim.STATUS_CHOICES, + 'type_choices': InsuranceClaim.CLAIM_TYPE_CHOICES, + 'priority_choices': InsuranceClaim.PRIORITY_CHOICES, + } + + return render(request, 'patients/claims/insurance_claim_form.html', context) + + +@login_required +def insurance_claim_delete(request, claim_id): + """Delete an insurance claim.""" + claim = get_object_or_404( + InsuranceClaim, + id=claim_id, + patient__tenant=request.user.tenant + ) + + if request.method == 'POST': + claim_number = claim.claim_number + claim.delete() + messages.success(request, f'Claim {claim_number} deleted successfully.') + return redirect('patients:insurance_claims_list') + + context = {'claim': claim} + return render(request, 'patients/claims/insurance_claim_confirm_delete.html', context) + + +@login_required +def update_claim_status(request, claim_id): + """Update claim status via AJAX.""" + if request.method != 'POST': + return JsonResponse({'success': False, 'error': 'Invalid method'}) + + claim = get_object_or_404( + InsuranceClaim, + id=claim_id, + patient__tenant=request.user.tenant + ) + + new_status = request.POST.get('status') + reason = request.POST.get('reason', '') + + if new_status not in dict(InsuranceClaim.STATUS_CHOICES): + return JsonResponse({'success': False, 'error': 'Invalid status'}) + + old_status = claim.status + claim.status = new_status + + # Auto-set dates based on status + if new_status == 'SUBMITTED' and not claim.submitted_date: + claim.submitted_date = timezone.now() + elif new_status in ['APPROVED', 'PARTIALLY_APPROVED', 'DENIED'] and not claim.processed_date: + claim.processed_date = timezone.now() + elif new_status == 'PAID' and not claim.payment_date: + claim.payment_date = timezone.now() + + claim.save() + + # Create status history entry + ClaimStatusHistory.objects.create( + claim=claim, + from_status=old_status, + to_status=new_status, + reason=reason or f'Status changed from {old_status} to {new_status}', + changed_by=request.user + ) + + return JsonResponse({ + 'success': True, + 'message': f'Claim status updated to {new_status}', + 'new_status': new_status, + 'status_display': claim.get_status_display() + }) + + +@login_required +def claims_dashboard(request): + """Dashboard view for insurance claims analytics.""" + claims = InsuranceClaim.objects.filter(patient__tenant=request.user.tenant) + + # Overall statistics + stats = claims.aggregate( + total_claims=Count('id'), + total_billed=Sum('billed_amount'), + total_approved=Sum('approved_amount'), + total_paid=Sum('paid_amount'), + avg_processing_days=Avg('processing_time_days') + ) + + # Status distribution + status_distribution = claims.values('status').annotate( + count=Count('id'), + total_amount=Sum('billed_amount') + ).order_by('status') + + # Claims by type + type_distribution = claims.values('claim_type').annotate( + count=Count('id'), + total_amount=Sum('billed_amount') + ).order_by('-count') + + # Monthly trends (last 12 months) + monthly_trends = claims.filter( + service_date__gte=timezone.now().date() - timedelta(days=365) + ).annotate( + month=TruncMonth('service_date') + ).values('month').annotate( + count=Count('id'), + total_billed=Sum('billed_amount'), + total_approved=Sum('approved_amount') + ).order_by('month') + + # Top providers + top_providers = claims.values('service_provider').annotate( + count=Count('id'), + total_amount=Sum('billed_amount') + ).order_by('-count')[:10] + + # Recent claims + recent_claims = claims.select_related('patient', 'insurance_info').order_by('-created_at')[:10] + + # Pending claims requiring attention + pending_claims = claims.filter( + status__in=['SUBMITTED', 'UNDER_REVIEW'] + ).select_related('patient').order_by('submitted_date')[:10] + + context = { + 'stats': stats, + 'status_distribution': status_distribution, + 'type_distribution': type_distribution, + 'monthly_trends': list(monthly_trends), + 'top_providers': top_providers, + 'recent_claims': recent_claims, + 'pending_claims': pending_claims, + } + + return render(request, 'patients/claims/claims_dashboard.html', context) + + +@login_required +def get_patient_insurance(request, patient_id): + """Get insurance policies for a patient via AJAX.""" + try: + patient = PatientProfile.objects.get( + id=patient_id, + tenant=request.user.tenant + ) + + insurance_policies = patient.insurance_info.all().values( + 'id', 'insurance_company', 'policy_number', 'insurance_type' + ) + + return JsonResponse({ + 'success': True, + 'insurance_policies': list(insurance_policies) + }) + + except PatientProfile.DoesNotExist: + return JsonResponse({ + 'success': False, + 'error': 'Patient not found' + }) + + +@login_required +def bulk_claim_actions(request): + """Handle bulk actions on claims.""" + if request.method != 'POST': + return JsonResponse({'success': False, 'error': 'Invalid method'}) + + action = request.POST.get('action') + claim_ids = request.POST.getlist('claim_ids') + + if not claim_ids: + return JsonResponse({'success': False, 'error': 'No claims selected'}) + + claims = InsuranceClaim.objects.filter( + id__in=claim_ids, + patient__tenant=request.user.tenant + ) + + if action == 'update_status': + new_status = request.POST.get('new_status') + if new_status not in dict(InsuranceClaim.STATUS_CHOICES): + return JsonResponse({'success': False, 'error': 'Invalid status'}) + + updated_count = 0 + for claim in claims: + old_status = claim.status + claim.status = new_status + claim.save() + + # Create status history + ClaimStatusHistory.objects.create( + claim=claim, + from_status=old_status, + to_status=new_status, + reason=f'Bulk status update to {new_status}', + changed_by=request.user + ) + updated_count += 1 + + return JsonResponse({ + 'success': True, + 'message': f'Updated {updated_count} claims to {new_status}' + }) + + elif action == 'export': + # Export claims to CSV + import csv + from django.http import HttpResponse + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="insurance_claims.csv"' + + writer = csv.writer(response) + writer.writerow([ + 'Claim Number', 'Patient Name', 'Service Date', 'Provider', + 'Claim Type', 'Status', 'Billed Amount', 'Approved Amount' + ]) + + for claim in claims.select_related('patient'): + writer.writerow([ + claim.claim_number, + claim.patient.get_full_name(), + claim.service_date, + claim.service_provider, + claim.get_claim_type_display(), + claim.get_status_display(), + claim.billed_amount, + claim.approved_amount + ]) + + return response + + return JsonResponse({'success': False, 'error': 'Invalid action'}) + diff --git a/templates/.DS_Store b/templates/.DS_Store index c7342139b69261c7c0e105bc98ca5e59a3ffb0ab..c1b68edb995b1c625399099a40eb5660d3e375a0 100644 GIT binary patch delta 1119 zcmZ`(YiyHM7(UNg$G&p5^t4^a`t5@jR!XxA>&ljG$fay8EDRWzA)v_8@_nS0u3aw! z=QN#$KR7hjV^q8(zz?rK2>D#RMg2hn{uTF!M1zSW#$XhUV4^?tv|WfA`A*I`-}^rA z<-G5E&U@;4oH_>|Aq0a{dN(1%@>h|wyz_cO!i*5F+=KNcU%P9&xSDI}w>lB5dS8!)zEo)H6_KOF5qGHn7FMjT5b!jVCw{`UlY#iJ=GP+>nc88O> znE1)rRkU+Qvs+aUPQ{bisbpcAw<=0SV!7&JhxJ&&*qPCj$C8Gw@Of(mS*3c^hs(%N z&XB9VsNh!vY%HIA+)#L|D%j3C+1T-9TDS6il@nwkb$==rH&Rxvm;Ds&j$YQM9ynp- z^2tov%15f+*E5%T@MvaY!blhL)+%q48di^#{qBh63!{@px_qWDBqn1R@~G;eGPXt6 zD<^W;xlJ8bw=4Xb@=!hz%Ne65(?)J#k-tk(#> z+5^Sw1iP^Z`!I$_5XVs%IED+F*xsswvrgH_guTNcR`VM&szwibyhGR<63TEmr$>=Rm`=}-V6 z^kWk?%gBci#V(A>*!NZPzI5->~cgB>LZua4CDMM%W^IERa1zBqFbhUpLJB G%f#Ocs1b|+ delta 272 zcmZo!z}PZ@QH6nlfzhcn#gKu)0m$S4Vh}CB!@yv{&A^}lqz$+ys%VS40YzDW5)2GQ z45>NAWd%t&`AHiKr?F3L;N8s5!NEOwr=jTPC)&15jA4@*om?iT=^dE7Nl1BewwS_Z z4~HF$VBsg5H6&e_7#SzemloUHES<%|D6yGG;TYFuV}rXalhyQN7)3T;Huq+qTxeD> z`MA0*(0T?YC}!ErYkHDt^HZlOOq)$?UopbeC;;WzfEWlIfKFy`MR)$j!q?1``F#R8 UfF^-F=rK9PXVzps*K8DH0I=OcMgRZ+ diff --git a/templates/blood_bank/.DS_Store b/templates/blood_bank/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a1eb34fa200b8c5a6976233b7733053a7a10f6ed GIT binary patch literal 8196 zcmeHM&2G~`5FWQp6H|VA0I3|1EOA1rL>kJWa0wy206`!GDA=)S4URXBokmqvDR+1Q zo`N$MuAI2?81MiHiEnl{iPLO=O96>pY4>w>zFF^lv$Z=35jl-PxJ9%N<>&y1XJB!xritx9&y}h~nuTqFGQuID$;{bSn zF2$HWpa^3w&4*(%$F~YI2R{H|;x}h71U%zd4D{>UYx_FT6P#&)i#UeBF3>(U=Tm}> z=5$DHWQ+sNW!{ovEH0)ZP&+Wjl9UC*tfw>ZKIkQJmRGBvou%cK(rUTvmes?e&XyMVk9@8ug_^97do#eH5pm7&gQp4KwN6QU=$p zxb5}JM@L(=og158t$Oo#(>vO!RX4ruo!arSTe)=g`tAGeS4lS&uQ^S4Y_saz&MBCT zZ*XM@?H7?7Qf64Bn7D5T-{0xP8JW}c{hVn?qG7#*RzFQdx{KgA@UqNZPae>G_9RxM ziBAEJC{jB)rmRp26DOv5xx%zTh=R2!z^5oWuLYQ4OanJF3;~~&=hMeI&FBSoo{bM= zF>56lQhBUrLbC6FPONQKfzwl9SuMT6_5Z!a-~XT92JFgK0jt1YSHM|mwweuWWBkw8 z$sKX6?V&$M=f=E|Lg|7*mg7KKjsqt@7~ + +{% endblock %} + +{% block content --> + +

+ + + +

Crossmatch Test compatibility verification

+ + + +
+
+

+ Crossmatch Compatibility Test +

+
+ Unit: {{ blood_unit.unit_number }} + Patient: {{ patient.patient_id }} +
+
+
+
+ {% csrf_token %} + + +
+
Patient Information
+
+
+ + + + + + + + + + + + + + + + + +
Name:{{ patient.full_name }}
Patient ID:{{ patient.patient_id }}
Blood Group: + {{ patient.blood_group.display_name|default:"Unknown" }} +
Age:{{ patient.age }} years
+
+
+ + + + + + + + + + + + + + + + + +
Previous Transfusions:{{ patient.transfusion_history.count }}
Pregnancies:{{ patient.pregnancy_history|default:"N/A" }}
Known Antibodies:{{ patient.known_antibodies|default:"None" }}
Last Crossmatch:{{ patient.last_crossmatch_date|date:"M d, Y"|default:"Never" }}
+
+
+
+ + + +
+
Blood Unit Information
+
+
+ + + + + + + + + + + + + + + + + +
Unit Number:{{ blood_unit.unit_number }}
Blood Group:{{ blood_unit.blood_group.display_name }}
Component:{{ blood_unit.component.get_name_display }}
Volume:{{ blood_unit.volume_ml }} ml
+
+
+ + + + + + + + + + + + + + + + + +
Donor:{{ blood_unit.donor.full_name }}
Collection Date:{{ blood_unit.collection_date|date:"M d, Y" }}
Expiry Date:{{ blood_unit.expiry_date|date:"M d, Y" }}
Test Status: + {% if blood_unit.all_tests_passed %} + All Tests Passed + {% else %} + Tests Pending + {% endif %} +
+
+
+
+ + + +
+
Test Information
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
ABO/Rh Compatibility Check
+
+
+
+
Patient Blood Group
+
+ {{ patient.blood_group.display_name|default:"Unknown" }} + {% if patient.blood_group.display_name == "Unknown" %} + ⚠️ Patient blood group must be confirmed + {% endif %} +
+
+
+
Donor Blood Group
+
+ {{ blood_unit.blood_group.display_name }} +
+ +
+
+
+
+
+
+ + + +
+
Crossmatch Testing
+
+ +
+
Major Crossmatch
+

Patient serum + Donor red cells

+ +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+
+ + +
+
Minor Crossmatch
+

Donor serum + Patient red cells

+ +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+
+ + +
+
Control Tests
+

Quality control verification

+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+
+
+
+ + + +
+
Antibody Screening
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Test Notes & Observations
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Final Crossmatch Result
+
+
+
+ + +
+
+
+
+ + +
+
+
+ + +
+ +
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/dashboard.html b/templates/blood_bank/dashboard.html new file mode 100644 index 00000000..a0c68c23 --- /dev/null +++ b/templates/blood_bank/dashboard.html @@ -0,0 +1,364 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Bank Dashboard{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

Blood Bank Dashboard overview of blood bank operations

+ + + +
+ +
+
+
+
+

ACTIVE DONORS

+

{{ total_donors }}

+
+ +
+
+ + + +
+
+
+
+

AVAILABLE UNITS

+

{{ total_units }}

+
+ +
+
+ + + +
+
+
+
+

PENDING REQUESTS

+

{{ pending_requests }}

+
+ +
+
+ + + +
+
+
+
+

EXPIRING SOON

+

{{ expiring_soon }}

+
+ +
+
+ +
+ + + +
+ +
+ +
+
+

Blood Group Distribution

+
+ + + +
+
+
+
+ + + + + + + + + + + {% for stat in blood_group_stats %} + + + + + + + {% empty %} + + + + {% endfor %} + +
Blood GroupAvailable UnitsPercentageStatus
+ + {{ stat.blood_group__abo_type }}{% if stat.blood_group__rh_factor == 'positive' %}+{% else %}-{% endif %} + + {{ stat.count }} + {% widthratio stat.count total_units 100 %}% + + {% if stat.count >= 10 %} + Adequate + {% elif stat.count >= 5 %} + Low + {% else %} + Critical + {% endif %} +
No blood units available
+
+
+
+ +
+ + + +
+ +
+
+

Quick Stats

+
+ + + +
+
+
+
+
+
+ + Recent Donations (7 days) +
+ {{ recent_donations }} +
+
+
+ + Active Transfusions +
+ {{ active_transfusions }} +
+
+
+ + Expiring This Week +
+ {{ expiring_soon }} +
+
+
+
+ +
+ +
+ + + +
+ +
+ +
+
+

Recent Blood Units

+
+ View All +
+
+
+
+ + + + + + + + + + + + {% for unit in recent_units %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
Unit NumberDonorComponentBlood GroupStatus
+ + {{ unit.unit_number }} + + {{ unit.donor.full_name }}{{ unit.component.get_name_display }} + {{ unit.blood_group.display_name }} + + {% if unit.status == 'available' %} + {{ unit.get_status_display }} + {% elif unit.status == 'expired' %} + {{ unit.get_status_display }} + {% else %} + {{ unit.get_status_display }} + {% endif %} +
No recent blood units
+
+
+
+ +
+ + + +
+ +
+
+

Urgent Blood Requests

+
+ View All +
+
+
+
+ + + + + + + + + + + + {% for request in urgent_requests %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
Request #PatientComponentUnitsUrgency
+ + {{ request.request_number }} + + {{ request.patient.full_name }}{{ request.component_requested.get_name_display }}{{ request.units_requested }} + {{ request.get_urgency_display }} +
No urgent requests
+
+
+
+ +
+ +
+ + + +
+ +
+ +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/donors/donor_confirm_delete.html b/templates/blood_bank/donors/donor_confirm_delete.html new file mode 100644 index 00000000..b09366de --- /dev/null +++ b/templates/blood_bank/donors/donor_confirm_delete.html @@ -0,0 +1,279 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Delete Donor - {{ donor.full_name }}{% endblock %} + +{% block content %} + + + + + +

Delete Donor {{ donor.full_name }}

+ + + +
+
+

+ Confirm Donor Deletion +

+
+
+
+
Warning
+

You are about to permanently delete this donor record. This action cannot be undone.

+
+ + +
+
+
+
+
Donor Information
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Donor ID:{{ donor.donor_id }}
Name:{{ donor.full_name }}
Blood Group: + {{ donor.blood_group.display_name }} +
Phone:{{ donor.phone }}
Registration Date:{{ donor.registration_date|date:"M d, Y" }}
Status: + + {{ donor.get_status_display }} + +
+
+
+
+
+
+
+
Impact Assessment
+
+
+
+
Related Records
+
    +
  • {{ donor.total_donations }} blood unit(s) collected
  • +
  • {{ donor.blood_units.count }} blood unit record(s)
  • + {% if donor.blood_units.filter(status='available').exists %} +
  • + + Has active blood units in inventory +
  • + {% endif %} +
+
+ + {% if donor.blood_units.filter(status='available').exists %} +
+
Active Blood Units
+

This donor has blood units currently available in inventory. + Deleting this donor will affect inventory tracking.

+
+ {% endif %} + + {% if donor.total_donations > 0 %} +
+
Donation History
+

This donor has a donation history. Consider marking as + "inactive" instead of deleting to preserve historical data.

+
+ {% endif %} +
+
+
+
+ + + +
+
+
Deletion Options
+
+
+
+ {% csrf_token %} + +
+ + +
+ +
+ + +
+ +
+
+ + +
Keep anonymized donation records for statistical purposes
+
+
+ +
+
+ + +
+
+ + +
+ + +
+ +
+
+
+ + + +
+
+
Alternative Actions
+
+
+

Consider these alternatives to permanent deletion:

+
+
+ + Preserves historical data while preventing new donations +
+
+ + Correct any data errors without deletion +
+
+
+
+ +
+
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/donors/donor_detail.html b/templates/blood_bank/donors/donor_detail.html new file mode 100644 index 00000000..78a98b7d --- /dev/null +++ b/templates/blood_bank/donors/donor_detail.html @@ -0,0 +1,330 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Donor Details - {{ donor.full_name }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ Donor Details + {{ donor.full_name }} ({{ donor.donor_id }}) +

+ + + +
+ +
+ +
+
+

Donor Information

+ +
+
+
+
+
+ +

{{ donor.full_name }}

+

{{ donor.donor_id }}

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blood Group: + {{ donor.blood_group.display_name }} +
Age:{{ donor.age }} years
Gender:{{ donor.get_gender_display }}
Weight:{{ donor.weight }} kg
Height:{{ donor.height }} cm
Status: + {% if donor.status == 'active' %} + {{ donor.get_status_display }} + {% elif donor.status == 'deferred' %} + {{ donor.get_status_display }} + {% elif donor.status == 'permanently_deferred' %} + {{ donor.get_status_display }} + {% else %} + {{ donor.get_status_display }} + {% endif %} +
Donor Type:{{ donor.get_donor_type_display }}
+ +
+ +
Contact Information
+ + + + + + + + + + + + + +
Phone:{{ donor.phone }}
Email:{{ donor.email|default:"Not provided" }}
Address:{{ donor.address }}
+ +
+ +
Emergency Contact
+ + + + + + + + + +
Name:{{ donor.emergency_contact_name }}
Phone:{{ donor.emergency_contact_phone }}
+ + {% if donor.notes %} +
+
Notes
+

{{ donor.notes }}

+ {% endif %} +
+
+ +
+ + + +
+ +
+
+

Donation Statistics

+
+
+
+
+
+
+
+

TOTAL DONATIONS

+

{{ donor.total_donations }}

+
+
+
+
+
+
+
+

LAST DONATION

+

+ {% if donor.last_donation_date %} + {{ donor.last_donation_date|date:"M d, Y" }} + {% else %} + Never + {% endif %} +

+
+
+
+
+
+
+
+

NEXT ELIGIBLE

+

{{ donor.next_eligible_date|date:"M d, Y" }}

+
+
+
+
+
+
+ +
+
+

ELIGIBILITY

+

{% if donor.is_eligible_for_donation %}Eligible{% else %}Not Eligible{% endif %}

+
+
+
+
+
+
+ + + +
+
+

Donation History

+
+ {% if donor.is_eligible_for_donation %} + + New Donation + + {% endif %} +
+
+
+ {% if blood_units %} +
+ + + + + + + + + + + + + + + {% for unit in blood_units %} + + + + + + + + + + + {% endfor %} + +
Unit NumberComponentCollection DateVolume (ml)StatusExpiry DateLocationActions
+ + {{ unit.unit_number }} + + {{ unit.component.get_name_display }}{{ unit.collection_date|date:"M d, Y H:i" }}{{ unit.volume_ml }} + {% if unit.status == 'available' %} + {{ unit.get_status_display }} + {% elif unit.status == 'expired' %} + {{ unit.get_status_display }} + {% elif unit.status == 'transfused' %} + {{ unit.get_status_display }} + {% else %} + {{ unit.get_status_display }} + {% endif %} + + {{ unit.expiry_date|date:"M d, Y" }} + {% if unit.days_to_expiry <= 3 and unit.status == 'available' %} + Expiring Soon + {% endif %} + {{ unit.location }} + + + +
+
+ {% else %} +
+ +
No Donation History
+

This donor has not made any donations yet.

+ {% if donor.is_eligible_for_donation %} + + Start First Donation + + {% endif %} +
+ {% endif %} +
+
+ +
+ +
+ + + +
+
+
+ + Back to Donors + +
+ {% if donor.is_eligible_for_donation %} + + Check Eligibility + + {% endif %} + + Edit Donor + + +
+
+
+
+ +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/donors/donor_eligibility.html b/templates/blood_bank/donors/donor_eligibility.html new file mode 100644 index 00000000..3eb128d6 --- /dev/null +++ b/templates/blood_bank/donors/donor_eligibility.html @@ -0,0 +1,449 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Donor Eligibility Check - {{ donor.full_name }}{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} + + + + + +

+ Donor Eligibility Check + {{ donor.full_name }} ({{ donor.donor_id }}) +

+ + + +
+ +
+ +
+
+

Donor Information

+
+
+
+ +
{{ donor.full_name }}
+

{{ donor.donor_id }}

+
+ + + + + + + + + + + + + + + + + + + + + + +
Blood Group: + {{ donor.blood_group.display_name }} +
Age:{{ donor.age }} years
Weight:{{ donor.weight }} kg
Total Donations:{{ donor.total_donations }}
Last Donation: + {% if donor.last_donation_date %} + {{ donor.last_donation_date|date:"M d, Y" }} + {% else %} + Never + {% endif %} +
+
+
+ + + +
+
+ +

+ {% if is_eligible %} + Eligible for Donation + {% else %} + Not Eligible for Donation + {% endif %} +

+

+ {% if is_eligible %} + This donor meets the basic eligibility criteria. + {% else %} + Next eligible date: {{ next_eligible_date|date:"M d, Y" }} + {% endif %} +

+
+
+ +
+ + + +
+ +
+
+

Eligibility Screening Questionnaire

+
+ Required before donation +
+
+
+
+ {% csrf_token %} + + +
+
+ Basic Health Questions +
+ +
+
+ {{ form.feeling_well }} + +
+ {% if form.feeling_well.errors %} +
{{ form.feeling_well.errors.0 }}
+ {% endif %} +
+ +
+
+ {{ form.adequate_sleep }} + +
+ {% if form.adequate_sleep.errors %} +
{{ form.adequate_sleep.errors.0 }}
+ {% endif %} +
+ +
+
+ {{ form.eaten_today }} + +
+ {% if form.eaten_today.errors %} +
{{ form.eaten_today.errors.0 }}
+ {% endif %} +
+
+ + + +
+
+ Medical History +
+ +
+
+ {{ form.recent_illness }} + +
+ Including cold, flu, fever, or any infection +
+ +
+
+ {{ form.medications }} + +
+ Including prescription and over-the-counter medications +
+ +
+
+ {{ form.recent_travel }} + +
+ Travel to malaria-endemic areas may require deferral +
+
+ + + +
+
+ Risk Factors +
+ +
+
+ {{ form.recent_tattoo }} + +
+ Including permanent makeup and body piercing +
+ +
+
+ {{ form.recent_surgery }} + +
+ Any surgical procedure or dental work +
+
+ + + +
+
+ Additional Information +
+ +
+ + {{ form.notes }} + {% if form.notes.errors %} +
{{ form.notes.errors.0 }}
+ {% endif %} +
+
+ + + +
+ + Back to Donor + +
+ + +
+
+ +
+
+
+ +
+ +
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/donors/donor_form.html b/templates/blood_bank/donors/donor_form.html new file mode 100644 index 00000000..c4e6f11c --- /dev/null +++ b/templates/blood_bank/donors/donor_form.html @@ -0,0 +1,433 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ title }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

{{ title }} donor information management

+ + + +
+
+

{{ title }}

+ +
+
+
+ {% csrf_token %} + + +
+ + Personal Information + + +
+
+ + {{ form.donor_id }} + {% if form.donor_id.errors %} +
{{ form.donor_id.errors.0 }}
+ {% endif %} +
Unique identifier for the donor
+
+
+ + {{ form.blood_group }} + {% if form.blood_group.errors %} +
{{ form.blood_group.errors.0 }}
+ {% endif %} +
+
+ +
+
+ + {{ form.first_name }} + {% if form.first_name.errors %} +
{{ form.first_name.errors.0 }}
+ {% endif %} +
+
+ + {{ form.last_name }} + {% if form.last_name.errors %} +
{{ form.last_name.errors.0 }}
+ {% endif %} +
+
+ +
+
+ + {{ form.date_of_birth }} + {% if form.date_of_birth.errors %} +
{{ form.date_of_birth.errors.0 }}
+ {% endif %} +
Must be 18-65 years old
+
+
+ + {{ form.gender }} + {% if form.gender.errors %} +
{{ form.gender.errors.0 }}
+ {% endif %} +
+
+
+ Age will be calculated +
+
+
+ +
+
+ + {{ form.weight }} + {% if form.weight.errors %} +
{{ form.weight.errors.0 }}
+ {% endif %} +
Minimum 45 kg required for donation
+
+
+ + {{ form.height }} + {% if form.height.errors %} +
{{ form.height.errors.0 }}
+ {% endif %} +
+
+
+ + + +
+ + Contact Information + + +
+
+ + {{ form.phone }} + {% if form.phone.errors %} +
{{ form.phone.errors.0 }}
+ {% endif %} +
+
+ + {{ form.email }} + {% if form.email.errors %} +
{{ form.email.errors.0 }}
+ {% endif %} +
Optional but recommended
+
+
+ +
+
+ + {{ form.address }} + {% if form.address.errors %} +
{{ form.address.errors.0 }}
+ {% endif %} +
+
+
+ + + +
+ + Emergency Contact + + +
+
+ + {{ form.emergency_contact_name }} + {% if form.emergency_contact_name.errors %} +
{{ form.emergency_contact_name.errors.0 }}
+ {% endif %} +
+
+ + {{ form.emergency_contact_phone }} + {% if form.emergency_contact_phone.errors %} +
{{ form.emergency_contact_phone.errors.0 }}
+ {% endif %} +
+
+
+ + + +
+ + Donor Status + + +
+
+ + {{ form.donor_type }} + {% if form.donor_type.errors %} +
{{ form.donor_type.errors.0 }}
+ {% endif %} +
+
+ + {{ form.status }} + {% if form.status.errors %} +
{{ form.status.errors.0 }}
+ {% endif %} +
+
+ +
+
+ + {{ form.notes }} + {% if form.notes.errors %} +
{{ form.notes.errors.0 }}
+ {% endif %} +
Any additional information about the donor
+
+
+
+ + + +
+
+
+
+ + Cancel + +
+ + +
+
+
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + + + +{% endblock %} + diff --git a/templates/blood_bank/donors/donor_list.html b/templates/blood_bank/donors/donor_list.html new file mode 100644 index 00000000..4632c293 --- /dev/null +++ b/templates/blood_bank/donors/donor_list.html @@ -0,0 +1,298 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Donor Management{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

Donor Management manage blood donors

+ + + +
+
+

Blood Donors

+ +
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + {% for donor in page_obj %} + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
Donor IDNameBlood GroupAgePhoneStatusTotal DonationsLast DonationEligibleActions
+ + {{ donor.donor_id }} + + {{ donor.full_name }} + {{ donor.blood_group.display_name }} + {{ donor.age }}{{ donor.phone }} + {% if donor.status == 'active' %} + {{ donor.get_status_display }} + {% elif donor.status == 'deferred' %} + {{ donor.get_status_display }} + {% elif donor.status == 'permanently_deferred' %} + {{ donor.get_status_display }} + {% else %} + {{ donor.get_status_display }} + {% endif %} + {{ donor.total_donations }} + {% if donor.last_donation_date %} + {{ donor.last_donation_date|date:"M d, Y" }} + {% else %} + Never + {% endif %} + + {% if donor.is_eligible_for_donation %} + + Eligible + + {% else %} + + Not Eligible + + {% endif %} + +
+ + + + + + + {% if donor.is_eligible_for_donation %} + + + + {% endif %} +
+
+
+ +
No donors found
+

Try adjusting your search criteria or add a new donor.

+ + Add New Donor + +
+
+
+ + + + {% if page_obj.has_other_pages %} + + {% endif %} + + + +
+
+

+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} donors +

+
+
+
+ + +
+
+
+ +
+
+ +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/inventory/inventory_dashboard.html b/templates/blood_bank/inventory/inventory_dashboard.html new file mode 100644 index 00000000..bdac572b --- /dev/null +++ b/templates/blood_bank/inventory/inventory_dashboard.html @@ -0,0 +1,604 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Bank Inventory Dashboard{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

Blood Bank Inventory real-time inventory monitoring

+ + + +
+
+
+
+
+
+
Total Units
+

{{ total_units }}

+ Available for transfusion +
+
+ +
+
+
+
+
+
+
+
+
+
+
Fresh Units
+

{{ fresh_units }}

+ Less than 7 days old +
+
+ +
+
+
+
+
+
+
+
+
+
+
Expiring Soon
+

{{ expiring_units }}

+ Within 3 days +
+
+ +
+
+
+
+
+
+
+
+
+
+
Critical Low
+

{{ critical_low_count }}

+ Below minimum levels +
+
+ +
+
+
+
+
+
+ + + +
+ +
+ +
+
+

Blood Group Inventory

+
+ +
+
+
+
+ {% for group in blood_groups %} +
+
+
+
+
+
{{ group.display_name }}
+
+
+ Whole Blood +
{{ group.whole_blood_count }}
+
+
+ RBC +
{{ group.rbc_count }}
+
+
+
+
+ Plasma +
{{ group.plasma_count }}
+
+
+ Platelets +
{{ group.platelet_count }}
+
+
+
+
+

{{ group.total_units }}

+ Total Units + {% if group.is_critical_low %} +
Critical + {% elif group.is_low %} +
Low + {% else %} +
Good + {% endif %} +
+
+
+
+
+ {% endfor %} +
+
+
+ + + +
+
+

Inventory Trends

+
+ +
+
+
+
+ +
+
+
+ + + +
+
+

Component Distribution

+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+ + + +
+ +
+
+

Storage Locations

+
+
+ {% for location in storage_locations %} +
+
+
+
+
{{ location.name }}
+ {{ location.location_type }} +
+
+
{{ location.unit_count }}
+ Units +
+
+
+
+ Temperature: + + {{ location.current_temperature }}°C + + +
+
+
+
+ {{ location.capacity_percentage }}% capacity +
+
+
+ {% endfor %} +
+
+ + + +
+
+

Expiry Alerts

+
+ {{ expiring_units }} +
+
+
+ {% for unit in expiring_units_list %} +
+
+ {{ unit.unit_number }}
+ {{ unit.blood_group.display_name }} - {{ unit.component.get_name_display }} +
+
+ {{ unit.days_to_expiry }} days
+ {{ unit.expiry_date|date:"M d" }} +
+
+ {% empty %} +
+ +

No units expiring soon

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

Recent Activity

+
+
+
+ {% for activity in recent_activities %} +
+
{{ activity.timestamp|date:"H:i" }}
+
+
+ + {{ activity.description }} +
+
+
+ {% empty %} +
+ +

No recent activity

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

Quick Actions

+
+ +
+ +
+ +
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/issues/blood_issue_form.html b/templates/blood_bank/issues/blood_issue_form.html new file mode 100644 index 00000000..7167abda --- /dev/null +++ b/templates/blood_bank/issues/blood_issue_form.html @@ -0,0 +1,743 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Issue Blood Unit - Request #{{ blood_request.request_number }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ Issue Blood Unit + Request #{{ blood_request.request_number }} + {% if blood_request.urgency == 'emergency' %} + EMERGENCY + {% endif %} +

+ + + +
+
+

+ Blood Unit Issue +

+
+ Request: {{ blood_request.request_number }} +
+
+
+
+ {% csrf_token %} + + +
+
Blood Request Information
+
+
+ + + + + + + + + + + + + + + + + +
Request Number:{{ blood_request.request_number }}
Patient:{{ blood_request.patient.full_name }} ({{ blood_request.patient.patient_id }})
Blood Group:{{ blood_request.patient.blood_group.display_name }}
Component Requested:{{ blood_request.component.get_name_display }}
+
+
+ + + + + + + + + + + + + + + + + +
Quantity:{{ blood_request.quantity_requested }} units
Urgency: + + {{ blood_request.get_urgency_display }} + +
Requested By:{{ blood_request.requested_by.get_full_name }}
Department:{{ blood_request.department.name }}
+
+
+ + {% if blood_request.special_requirements %} +
+
Special Requirements:
+
{{ blood_request.special_requirements }}
+
+ {% endif %} +
+ + + +
+
Available Blood Units
+
+
+

Select compatible blood units for this request. Units are filtered by blood group compatibility and availability.

+ +
+ {% for unit in available_units %} +
+
+
+
{{ unit.unit_number }}
+
+
+ Blood Group:
+ {{ unit.blood_group.display_name }} +
+
+ Component:
+ {{ unit.component.get_name_display }} +
+
+
+
+ Volume:
+ {{ unit.volume_ml }} ml +
+
+ Expiry:
+ {{ unit.expiry_date|date:"M d, Y" }} + {% if unit.days_to_expiry <= 3 %} + Expires Soon + {% endif %} +
+
+
+
+
+ Donor:
+ {{ unit.donor.full_name }}
+ Collection:
+ {{ unit.collection_date|date:"M d, Y" }}
+ Location:
+ {{ unit.location.name }} +
+
+
+ + +
+ {% if unit.is_compatible %} + Compatible + {% else %} + Check Required + {% endif %} +
+ + + {% if unit.crossmatch_status %} +
+ Crossmatch: + + {{ unit.crossmatch_status|title }} + +
+ {% endif %} +
+ {% empty %} +
+ No compatible blood units available for this request. +
Please check inventory or contact blood bank supervisor. +
+ {% endfor %} +
+ + +
+
+
+ + + +
+
Issue Details
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Transport Information
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + +
+
Pre-Issue Verification Checklist
+
+
+
+
Unit Verification
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
Documentation & Testing
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
Emergency Procedures (if applicable)
+
+ + +
+
+ + +
+
+
+
+
+ + + +
+
Special Instructions & Notes
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Issue Summary
+
+

Select blood units and complete the form to preview issue details

+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/quality_control/quality_control_confirm_delete.html b/templates/blood_bank/quality_control/quality_control_confirm_delete.html new file mode 100644 index 00000000..77525df3 --- /dev/null +++ b/templates/blood_bank/quality_control/quality_control_confirm_delete.html @@ -0,0 +1,542 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Delete QC Record - {{ qc_record.test_name }}{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} + + + + + +

+ Delete QC Record + {{ qc_record.test_name }} + {% if qc_record.result == 'failed' %} + FAILED TEST + {% endif %} +

+ + + +
+
+ WARNING: Deleting QC records may violate regulatory compliance requirements.
+ Consider archiving instead of permanent deletion. +
+ + + +
+
+

+ Delete Quality Control Record +

+
+ CRITICAL ACTION +
+
+
+ +
+
CRITICAL ACTION REQUIRED
+

You are about to permanently delete a quality control record.

+

This action will:

+
    +
  • Permanently remove the QC test record from the system
  • +
  • Delete all associated test results and data
  • +
  • Remove compliance documentation
  • +
  • Impact regulatory audit trails
  • +
  • Potentially violate FDA, AABB, and CAP requirements
  • + {% if qc_record.result == 'failed' %} +
  • Delete critical failure documentation
  • + {% endif %} + {% if qc_record.capa_initiated %} +
  • Affect active CAPA investigations
  • + {% endif %} +
+
+ + + +
+
QC Record Information
+
+
+ + + + + + + + + + + + + + + + + +
Test Name:{{ qc_record.test_name }}
Test Type:{{ qc_record.get_test_type_display }}
Test Date:{{ qc_record.test_date|date:"M d, Y H:i" }}
Tested By:{{ qc_record.tested_by.get_full_name }}
+
+
+ + + + + + + + + + + + + + + + + +
Result: + + {{ qc_record.get_result_display }} + +
Sample ID:{{ qc_record.sample_id|default:"Not specified" }}
Equipment:{{ qc_record.equipment_used|default:"Not specified" }}
Reviewed: + {% if qc_record.reviewed_by %} + Yes - {{ qc_record.reviewed_by.get_full_name }} + {% else %} + Pending Review + {% endif %} +
+
+
+ + {% if qc_record.test_notes %} +
+
Test Notes:
+
{{ qc_record.test_notes }}
+
+ {% endif %} +
+ + + +
+
Regulatory Compliance Impact
+
+
+
Affected Standards
+
    +
  • FDA 21 CFR Part 606: QC record retention requirements
  • +
  • AABB Standards: Quality documentation requirements
  • +
  • ISO 15189: Quality management system records
  • +
  • CAP Requirements: Laboratory quality assurance
  • +
+
+
+
Compliance Risks
+
    +
  • Loss of audit trail integrity
  • +
  • Regulatory inspection findings
  • +
  • Accreditation issues
  • +
  • Legal liability concerns
  • + {% if qc_record.result == 'failed' %} +
  • Loss of failure investigation records
  • + {% endif %} +
+
+
+ + {% if qc_record.result == 'failed' %} +
+ CRITICAL: + This is a failed QC test. Deleting this record may violate regulatory requirements for failure investigation documentation. +
+ {% endif %} + + {% if qc_record.capa_initiated %} +
+ ACTIVE CAPA: + This record is associated with an active CAPA ({{ qc_record.capa_number }}). Deletion may impact the investigation. +
+ {% endif %} +
+ + + +
+
Impact Assessment
+
+
+
Related Records
+
    + {% if qc_record.blood_unit %} +
  • Blood Unit: {{ qc_record.blood_unit.unit_number }}
  • + {% endif %} + {% if qc_record.equipment_used %} +
  • Equipment: {{ qc_record.equipment_used }}
  • + {% endif %} +
  • Test Results: All parameter data will be lost
  • +
  • Trend Data: Historical trending will be affected
  • +
+
+
+
System Impact
+
    +
  • QC statistics and reports will be affected
  • +
  • Trend analysis data will be incomplete
  • +
  • Audit trail will show deletion event
  • +
  • Compliance reports may be impacted
  • + {% if qc_record.result == 'failed' %} +
  • Failure rate calculations will change
  • + {% endif %} +
+
+
+
+ + + +
+ {% csrf_token %} + +
+
Deletion Authorization
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ +
+ + +
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
Critical Confirmation Checklist
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ {% if qc_record.result == 'failed' %} +
+ + +
+ {% endif %} + {% if qc_record.capa_initiated %} +
+ + +
+ {% endif %} +
+ + + +
+ + Cancel Deletion + +
+ + + +
+
+ +
+ +
+
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/quality_control/quality_control_detail.html b/templates/blood_bank/quality_control/quality_control_detail.html new file mode 100644 index 00000000..cfdbb10f --- /dev/null +++ b/templates/blood_bank/quality_control/quality_control_detail.html @@ -0,0 +1,612 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Quality Control - {{ qc_record.test_name }}{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} + + + + + +

+ Quality Control Detail + {{ qc_record.test_name }} +

+ + + +
+
+

+ QC Test Results +

+
+ + {{ qc_record.get_result_display }} + +
+
+
+ +
+
Test Information
+
+
+ + + + + + + + + + + + + + + + + +
Test Name:{{ qc_record.test_name }}
Test Type:{{ qc_record.get_test_type_display }}
Test Date:{{ qc_record.test_date|date:"M d, Y H:i" }}
Tested By:{{ qc_record.tested_by.get_full_name }}
+
+
+ + + + + + + + + + + + + + + + + +
Equipment:{{ qc_record.equipment_used|default:"Not specified" }}
Lot Numbers:{{ qc_record.lot_numbers|default:"Not specified" }}
Temperature:{{ qc_record.temperature|default:"Not recorded" }}°C
Result: + + {{ qc_record.get_result_display }} +
+
+
+ + {% if qc_record.sample_id %} +
+
Sample Information:
+
+ Sample ID: {{ qc_record.sample_id }}
+ {% if qc_record.blood_unit %} + Blood Unit: {{ qc_record.blood_unit.unit_number }}
+ {% endif %} + Sample Type: {{ qc_record.get_test_type_display }} +
+
+ {% endif %} +
+ + + +
+
Test Results
+ + {% if qc_record.test_type == 'temperature' %} +
+
+
Temperature Control
+ + + + + + + + + + + + + +
Measured Temperature:{{ qc_record.temperature }}°C
Acceptable Range:2-6°C
Deviation: + {% if qc_record.temperature %} + {% if qc_record.temperature >= 2 and qc_record.temperature <= 6 %} + Within range + {% else %} + {{ qc_record.temperature|floatformat:1 }}°C deviation + {% endif %} + {% else %} + Not recorded + {% endif %} +
+
+
+ {% elif qc_record.test_type == 'ph' %} +
+
+
pH Testing
+ + + + + + + + + + + + + +
Measured pH:{{ qc_record.ph_value|default:"Not recorded" }}
Acceptable Range:6.0-8.0
Buffer Solution:{{ qc_record.buffer_solution|default:"Not specified" }}
+
+
+ {% elif qc_record.test_type == 'sterility' %} +
+
+
Sterility Testing
+ + + + + + + + + + + + + +
Culture Medium:{{ qc_record.culture_medium|default:"Not specified" }}
Incubation Period:{{ qc_record.incubation_period|default:"Standard" }}
Growth Observed: + {% if qc_record.result == 'passed' %} + No growth + {% else %} + Growth detected + {% endif %} +
+
+
+ {% elif qc_record.test_type == 'hemolysis' %} +
+
+
Hemolysis Testing
+ + + + + + + + + + + + + +
Hemolysis Percentage:{{ qc_record.hemolysis_percentage|default:"Not recorded" }}%
Acceptable Limit:< 0.8%
Visual Assessment:{{ qc_record.visual_assessment|default:"Not recorded" }}
+
+
+ {% endif %} + + {% if qc_record.test_notes %} +
+
Test Notes:
+
{{ qc_record.test_notes }}
+
+ {% endif %} +
+ + + +
+
Compliance Information
+
+
+
Regulatory Standards
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
Quality Assurance
+ + + + + + + + + + + + + +
Equipment Calibrated: + {% if qc_record.equipment_calibrated %} + Yes + {% else %} + No + {% endif %} +
SOP Followed: + {% if qc_record.sop_followed %} + Yes + {% else %} + No + {% endif %} +
Controls Passed: + {% if qc_record.controls_passed %} + Yes + {% else %} + No + {% endif %} +
+
+
+
+ + + +
+
Trend Analysis
+
+
Recent QC Results for {{ qc_record.test_name }}
+ +

Last 10 test results showing trend over time

+
+
+ + + {% if qc_record.result == 'failed' %} + +
+
Corrective and Preventive Action (CAPA)
+
+ QC Test Failed - Immediate Action Required +
+ +
+
+
Immediate Actions
+
    +
  • Quarantine affected products
  • +
  • Investigate root cause
  • +
  • Review equipment calibration
  • +
  • Check reagent integrity
  • +
  • Notify quality manager
  • +
+
+
+
Follow-up Required
+
    +
  • Document investigation findings
  • +
  • Implement corrective actions
  • +
  • Verify effectiveness
  • +
  • Update procedures if needed
  • +
  • Schedule follow-up testing
  • +
+
+
+ + {% if qc_record.capa_initiated %} +
+ CAPA Status: {{ qc_record.get_capa_status_display }}
+ CAPA Number: {{ qc_record.capa_number }}
+ Initiated By: {{ qc_record.capa_initiated_by.get_full_name }}
+ Date: {{ qc_record.capa_date|date:"M d, Y H:i" }} +
+ {% else %} + + {% endif %} +
+ + {% endif %} + + +
+
Action Timeline
+ +
+ {{ qc_record.test_date|date:"M d, Y H:i" }}
+ QC test performed by {{ qc_record.tested_by.get_full_name }}
+ Result: {{ qc_record.get_result_display }} +
+ + {% if qc_record.reviewed_by %} +
+ {{ qc_record.review_date|date:"M d, Y H:i" }}
+ Results reviewed by {{ qc_record.reviewed_by.get_full_name }}
+ Review completed +
+ {% endif %} + + {% if qc_record.capa_initiated %} +
+ {{ qc_record.capa_date|date:"M d, Y H:i" }}
+ CAPA initiated by {{ qc_record.capa_initiated_by.get_full_name }}
+ CAPA #{{ qc_record.capa_number }} +
+ {% endif %} +
+ + + +
+ + Back to QC List + +
+ + {% if qc_record.result == 'failed' and not qc_record.capa_initiated %} + + {% endif %} + {% if not qc_record.reviewed_by %} + + {% endif %} +
+
+ +
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/quality_control/quality_control_form.html b/templates/blood_bank/quality_control/quality_control_form.html new file mode 100644 index 00000000..1d75541f --- /dev/null +++ b/templates/blood_bank/quality_control/quality_control_form.html @@ -0,0 +1,658 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if form.instance.pk %}Edit QC Record{% else %}New Quality Control Test{% endif %}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ {% if form.instance.pk %} + Edit QC Record {{ form.instance.qc_id }} + {% else %} + New Quality Control Test ensure blood safety + {% endif %} +

+ + + +
+
+

+ Quality Control Test Information +

+
+ QC ID: {{ form.instance.qc_id|default:'Auto-generated' }} +
+
+
+
+ {% csrf_token %} + + +
+
Test Identification
+
+
+
+ + + {% if form.test_type.errors %} +
{{ form.test_type.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.test_date.errors %} +
{{ form.test_date.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.tested_by.errors %} +
{{ form.tested_by.errors.0 }}
+ {% endif %} +
+
+
+
+ + + +
+
Sample Information
+
+
+
+ + + {% if form.blood_unit.errors %} +
{{ form.blood_unit.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.sample_id.errors %} +
{{ form.sample_id.errors.0 }}
+ {% endif %} +
+
+
+ +
+
+
+ Select a blood unit or enter sample ID to proceed +
+
+
+
+ + + +
+
Test Parameters
+
+

Select a test type to display relevant parameters

+
+
+ + + +
+
Test Results
+
+
+
+ + + {% if form.result.errors %} +
{{ form.result.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.notes.errors %} +
{{ form.notes.errors.0 }}
+ {% endif %} +
+
+
+ + +
+ +

Test result will be displayed here

+
+
+ + + +
+
Compliance & Standards
+
+
+
+
Regulatory Compliance
+
+ + +
+
+ + +
+
+ + +
+
+
+
Quality Assurance
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/quality_control/quality_control_list.html b/templates/blood_bank/quality_control/quality_control_list.html new file mode 100644 index 00000000..2cd51e57 --- /dev/null +++ b/templates/blood_bank/quality_control/quality_control_list.html @@ -0,0 +1,633 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Quality Control Management{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

Quality Control Management ensure blood safety and compliance

+ + + +
+
+

Quality Control Records

+ +
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
Total Tests
+

{{ page_obj.paginator.count }}

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Passed
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Failed
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Pending
+

0

+
+
+ +
+
+
+
+
+
+ + + +
+
+
+
+
+ Compliance Overview +
+
+
+
+
+
+ + FDA 21 CFR Part 606 + Compliant +
+
+
+
+ + AABB Standards + Compliant +
+
+
+
+ + ISO 15189 + Review +
+
+
+
+ + CAP Standards + Compliant +
+
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + {% for qc in page_obj %} + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
QC IDTest TypeSample/UnitTest DateTested ByResultValuesComplianceVerifiedActions
+ + {{ qc.qc_id }} + + {{ qc.get_test_type_display }} + {% if qc.blood_unit %} + + {{ qc.blood_unit.unit_number }} + +
{{ qc.blood_unit.blood_group.display_name }} + {% else %} + {{ qc.sample_id }} + {% endif %} +
{{ qc.test_date|date:"M d, Y H:i" }}{{ qc.tested_by.get_full_name }} + {% if qc.result == 'passed' %} + {{ qc.get_result_display }} + {% elif qc.result == 'failed' %} + {{ qc.get_result_display }} + {% else %} + {{ qc.get_result_display }} + {% endif %} + + {% if qc.test_type == 'temperature' %} + {{ qc.temperature_value }}°C + {% if qc.temperature_within_range %} + + {% else %} + + {% endif %} + {% elif qc.test_type == 'ph' %} + pH {{ qc.ph_value }} + {% elif qc.test_type == 'sterility' %} + {{ qc.get_sterility_result_display }} + {% elif qc.test_type == 'hemolysis' %} + {{ qc.hemolysis_percentage }}% + {% else %} + {{ qc.test_value|default:"-" }} + {% endif %} + + {% if qc.is_compliant %} + + Compliant + + {% else %} + + Non-Compliant + + {% endif %} + + {% if qc.verified_by %} + + {{ qc.verified_by.get_full_name }} + +
{{ qc.verified_at|date:"M d, H:i" }} + {% else %} + Pending + {% endif %} +
+
+ + + + {% if not qc.verified_by and qc.result != 'pending' %} + + {% endif %} + {% if qc.result == 'failed' %} + + {% endif %} +
+
+
+ +
No quality control records found
+

Try adjusting your search criteria or create a new QC record.

+ + New QC Record + +
+
+
+ + + + {% if page_obj.has_other_pages %} + + {% endif %} + + + +
+
+

+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} QC records +

+
+
+
+ + + +
+
+
+ +
+
+ +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/reactions/adverse_reaction_form.html b/templates/blood_bank/reactions/adverse_reaction_form.html new file mode 100644 index 00000000..e25fcd0e --- /dev/null +++ b/templates/blood_bank/reactions/adverse_reaction_form.html @@ -0,0 +1,882 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Report Adverse Reaction - {{ transfusion.transfusion_id }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ Adverse Reaction Report + {{ transfusion.transfusion_id }} + URGENT +

+ + + +
+
+

+ Adverse Transfusion Reaction Report +

+
+ PRIORITY REPORT +
+
+
+
+ {% csrf_token %} + + +
+
Transfusion Information
+
+
+ + + + + + + + + + + + + + + + + +
Transfusion ID:{{ transfusion.transfusion_id }}
Patient:{{ transfusion.patient.full_name }} ({{ transfusion.patient.patient_id }})
Blood Group:{{ transfusion.patient.blood_group.display_name }}
Blood Unit:{{ transfusion.blood_unit.unit_number }}
+
+
+ + + + + + + + + + + + + + + + + +
Unit Blood Group:{{ transfusion.blood_unit.blood_group.display_name }}
Component:{{ transfusion.blood_unit.component.get_name_display }}
Start Time:{{ transfusion.start_time|date:"M d, Y H:i" }}
Volume Transfused:{{ transfusion.volume_transfused|default:"Calculating..." }} ml
+
+
+
+ + + +
+
Reaction Details
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Symptoms & Signs
+
+ +
+
Cardiovascular
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Respiratory
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Dermatologic
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Systemic
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Neurologic
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Other
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + + +
+
Vital Signs at Time of Reaction
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + +
+
Immediate Actions Taken
+
+ +
+
Basic Interventions
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Medications
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Supportive Care
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + + +
+
Outcome & Follow-up
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + + +
+
Reporting Information
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + + +
+
Reaction Summary
+
+

Complete the form to view reaction summary

+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/reports/blood_bank_reports.html b/templates/blood_bank/reports/blood_bank_reports.html new file mode 100644 index 00000000..b9554f4b --- /dev/null +++ b/templates/blood_bank/reports/blood_bank_reports.html @@ -0,0 +1,633 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Bank Reports{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

Blood Bank Reports comprehensive analytics and reporting

+ + + +
+
+
+
+
+
{{ total_donations_month }}
+
Donations This Month
+
+ + +12% vs last month +
+
+
+ +
+
+
+
+
+
+
+
+
{{ total_transfusions_month }}
+
Transfusions This Month
+
+ + +8% vs last month +
+
+
+ +
+
+
+
+
+
+
+
+
{{ inventory_turnover }}%
+
Inventory Turnover
+
+ + Stable +
+
+
+ +
+
+
+
+
+
+
+
+
{{ wastage_rate }}%
+
Wastage Rate
+
+ + -3% vs last month +
+
+
+ +
+
+
+
+
+ + + +
+
+
+
+

Report Categories

+
+
+
+
+
+
+ +
+
Inventory Reports
+

Stock levels, expiry tracking, location analysis

+
+
+
+
+
+ +
+
Donation Reports
+

Donor statistics, collection trends, demographics

+
+
+
+
+
+ +
+
Transfusion Reports
+

Usage patterns, patient outcomes, safety metrics

+
+
+
+
+
+ +
+
Quality Reports
+

QC results, compliance metrics, CAPA tracking

+
+
+
+
+
+
+
+ + + +
+ +
+ +
+
+

Donation Trends

+
+ +
+
+
+
+ +
+
+
+ + + +
+
+

Blood Group Distribution

+
+
+
+
+
Donations
+
+ +
+
+
+
Transfusions
+
+ +
+
+
+
+
+ + + +
+
+

Utilization Metrics

+
+
+
+ +
+
+
+ +
+ + + +
+ +
+
+

Quick Reports

+
+
+
+ + + + + +
+
+
+ + + +
+
+

Top Donors This Month

+
+
+ {% for donor in top_donors %} +
+
+ {{ donor.full_name }} +
{{ donor.donor_id }} +
+
+ {{ donor.donations_this_month }} +
donations +
+
+ {% empty %} +
+ +

No donations this month

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

Recent Alerts

+
+
+ {% for alert in recent_alerts %} +
+
+ + {{ alert.message }} +
+ {{ alert.timestamp|date:"H:i" }} +
+ {% empty %} +
+ +

No recent alerts

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

Custom Report Builder

+
+
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+
+
+
+ +
+ +
+ +{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/blood_bank/requests/.DS_Store b/templates/blood_bank/requests/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 +.delete-warning { + background: #f8d7da; + border: 2px solid #dc3545; + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { opacity: 1; } + 50% { opacity: 0.8; } + 100% { opacity: 1; } +} + +.request-info { + background: #d1ecf1; + border-left: 4px solid #17a2b8; + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; +} + +.impact-assessment { + background: #fff3cd; + border-left: 4px solid #ffc107; + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; +} + +.cancellation-options { + background: #d4edda; + border-left: 4px solid #28a745; + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; +} + +.required-field { + color: #dc3545; +} + +.emergency-warning { + background: #dc3545; + color: white; + padding: 15px; + border-radius: 8px; + margin-bottom: 20px; + text-align: center; + font-weight: bold; +} + +{% endblock %} + +{% block content %} + + + + + +

+ Cancel Blood Request + {{ blood_request.request_number }} + {% if blood_request.urgency == 'emergency' %} + EMERGENCY + {% endif %} +

+ + +{% if blood_request.urgency == 'emergency' %} + +
+
+ WARNING: This is an EMERGENCY blood request. Cancellation requires immediate supervisor approval. +
+ +{% endif %} + + +
+
+

+ Cancel Blood Request +

+
+ Cancellation Required +
+
+
+ +
+
CRITICAL ACTION REQUIRED
+

You are about to cancel a blood request.

+

This action will:

+
    +
  • Cancel the blood request permanently
  • +
  • Release any reserved blood units
  • +
  • Notify the requesting physician
  • +
  • Create an audit trail entry
  • + {% if blood_request.urgency == 'emergency' %} +
  • Require supervisor approval for emergency request
  • + {% endif %} +
+
+ + + +
+
Request Information
+
+
+ + + + + + + + + + + + + + + + + +
Request Number:{{ blood_request.request_number }}
Patient:{{ blood_request.patient.full_name }} ({{ blood_request.patient.patient_id }})
Blood Group:{{ blood_request.patient.blood_group.display_name }}
Component:{{ blood_request.component.get_name_display }}
+
+
+ + + + + + + + + + + + + + + + + +
Quantity:{{ blood_request.quantity_requested }} units
Urgency: + + {{ blood_request.get_urgency_display }} + +
Requested By:{{ blood_request.requested_by.get_full_name }}
Department:{{ blood_request.department.name }}
+
+
+ + {% if blood_request.clinical_indication %} +
+
Clinical Indication:
+
{{ blood_request.clinical_indication }}
+
+ {% endif %} +
+ + + +
+
Impact Assessment
+
+
+
Current Status
+
    +
  • Request Status: {{ blood_request.get_status_display }}
  • +
  • Units Reserved: {{ blood_request.reserved_units.count }} units
  • +
  • Units Issued: {{ blood_request.issued_units.count }} units
  • +
  • Crossmatches Done: {{ blood_request.crossmatches.count }}
  • +
+
+
+
Affected Records
+
    + {% if blood_request.reserved_units.exists %} +
  • Reserved blood units will be released
  • + {% endif %} + {% if blood_request.issued_units.exists %} +
  • Issued units require immediate return
  • + {% endif %} + {% if blood_request.crossmatches.exists %} +
  • Crossmatch results will be archived
  • + {% endif %} +
  • Audit trail will be created
  • +
+
+
+ + {% if blood_request.issued_units.exists %} +
+ WARNING: + This request has issued blood units that must be returned immediately before cancellation. +
+ {% endif %} +
+ + + +
+ {% csrf_token %} + +
+
Cancellation Details
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ + {% if blood_request.urgency == 'emergency' %} +
+
+
+ + +
+
+
+
+ + +
+
+
+ {% endif %} + +
+
+
+ + +
+
+
+ +
+
+
+ +
+ + +
+
+
+
+
+ +
+ + +
+
+
+
+
+ + +
+
Confirmation Checklist
+
+ + +
+
+ + +
+
+ + +
+ {% if blood_request.issued_units.exists %} +
+ + +
+ {% endif %} +
+ + + +
+ + Keep Request Active + +
+ + +
+
+ +
+ +
+
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/requests/blood_request_detail.html b/templates/blood_bank/requests/blood_request_detail.html new file mode 100644 index 00000000..17a19c6d --- /dev/null +++ b/templates/blood_bank/requests/blood_request_detail.html @@ -0,0 +1,639 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Request Details - {{ blood_request.request_number }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ Blood Request Details + {{ blood_request.request_number }} +

+ + + +
+
+
+

{{ blood_request.request_number }}

+

+ {{ blood_request.patient.full_name }} + ({{ blood_request.patient.patient_id }}) +

+
+
+
+ {% if blood_request.urgency == 'emergency' %} + + {{ blood_request.get_urgency_display }} + + {% elif blood_request.urgency == 'urgent' %} + + {{ blood_request.get_urgency_display }} + + {% else %} + {{ blood_request.get_urgency_display }} + {% endif %} +
+
+ {% if blood_request.status == 'pending' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'processing' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'ready' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'issued' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'completed' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'cancelled' %} + {{ blood_request.get_status_display }} + {% endif %} +
+
+
+
+ + + +
+ +
+ +
+
+

Request Information

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Request Number:{{ blood_request.request_number }}
Request Date:{{ blood_request.request_date|date:"M d, Y H:i" }}
Required By: + {{ blood_request.required_by|date:"M d, Y H:i" }} + {% if blood_request.is_overdue %} +
Overdue + {% endif %} +
Department:{{ blood_request.requesting_department.name }}
Requesting Physician:{{ blood_request.requesting_physician.get_full_name }}
Component:{{ blood_request.component_requested.get_name_display }}
Units Requested: + {{ blood_request.units_requested }} +
Patient Blood Group: + {{ blood_request.patient_blood_group.display_name }} +
+ + {% if blood_request.processed_by %} +
+
Processing Information
+ + + + + + + + + +
Processed By:{{ blood_request.processed_by.get_full_name }}
Processed At:{{ blood_request.processed_at|date:"M d, Y H:i" }}
+ {% endif %} +
+
+ + + +
+
+

Patient Information

+
+
+ + + + + + + + + + + + + + + + + + + + + + {% if blood_request.hemoglobin_level %} + + + + + {% endif %} + {% if blood_request.platelet_count %} + + + + + {% endif %} +
Patient ID:{{ blood_request.patient.patient_id }}
Name:{{ blood_request.patient.full_name }}
Age:{{ blood_request.patient.age }} years
Gender:{{ blood_request.patient.get_gender_display }}
Blood Group: + {{ blood_request.patient_blood_group.display_name }} +
Hemoglobin:{{ blood_request.hemoglobin_level }} g/dL
Platelet Count:{{ blood_request.platelet_count }}/μL
+
+
+ + + +
+
+

Clinical Information

+
+
+
Indication for Transfusion
+

{{ blood_request.indication }}

+ + {% if blood_request.special_requirements %} +
Special Requirements
+

{{ blood_request.special_requirements }}

+ {% endif %} + + {% if blood_request.notes %} +
Additional Notes
+

{{ blood_request.notes }}

+ {% endif %} +
+
+ +
+ + + +
+ +
+
+

Blood Compatibility Check

+
+ +
+
+
+
+
+
+
ABO Compatibility
+

Patient: {{ blood_request.patient_blood_group.display_name }}

+

Compatible with: + {% if blood_request.patient_blood_group.abo_type == 'AB' %} + A, B, AB, O + {% elif blood_request.patient_blood_group.abo_type == 'A' %} + A, O + {% elif blood_request.patient_blood_group.abo_type == 'B' %} + B, O + {% else %} + O only + {% endif %} +

+
+
+
Rh Compatibility
+

Patient: {{ blood_request.patient_blood_group.rh_factor|title }}

+

Compatible with: + {% if blood_request.patient_blood_group.rh_factor == 'positive' %} + Positive, Negative + {% else %} + Negative only + {% endif %} +

+
+
+
+ + +
+
+ + + +
+
+

Issued Blood Units

+
+ {% if blood_request.status in 'pending,processing,ready' %} + + Issue Blood Unit + + {% endif %} +
+
+
+ {% if issues %} +
+ + + + + + + + + + + + + + + {% for issue in issues %} + + + + + + + + + + + {% endfor %} + +
Unit NumberBlood GroupComponentIssue DateIssued ToExpiry TimeStatusActions
+ + {{ issue.blood_unit.unit_number }} + + + {{ issue.blood_unit.blood_group.display_name }} + {{ issue.blood_unit.component.get_name_display }}{{ issue.issue_date|date:"M d, Y H:i" }}{{ issue.issued_to.get_full_name }} + {{ issue.expiry_time|date:"M d, Y H:i" }} + {% if issue.is_expired %} +
Expired + {% endif %} +
+ {% if issue.returned %} + Returned + {% elif issue.is_expired %} + Expired + {% else %} + Active + {% endif %} + + {% if not issue.returned and not issue.is_expired %} + + + + {% endif %} +
+
+ {% else %} +
+ +
No Units Issued
+

No blood units have been issued for this request yet.

+ {% if blood_request.status in 'pending,processing,ready' %} + + Issue First Unit + + {% endif %} +
+ {% endif %} +
+
+ + + +
+
+

Request Timeline

+
+
+
+
+
+
+
+ Request Created +
+

+ {{ blood_request.request_date|date:"M d, Y H:i" }}
+ Request submitted by {{ blood_request.requesting_physician.get_full_name }} +

+
+
+
+ + {% if blood_request.status != 'pending' %} +
+
+
+
+ Processing Started +
+

+ {% if blood_request.processed_at %} + {{ blood_request.processed_at|date:"M d, Y H:i" }}
+ {% endif %} + Blood bank staff began processing the request +

+
+
+
+ {% endif %} + + {% if blood_request.status == 'ready' %} +
+
+
+
+ Units Ready +
+

+ Compatible blood units identified and ready for issue +

+
+
+
+ {% endif %} + + {% if blood_request.status == 'issued' %} +
+
+
+
+ Units Issued +
+

+ Blood units issued to clinical staff +

+
+
+
+ {% endif %} + + {% if blood_request.status == 'completed' %} +
+
+
+
+ Request Completed +
+

+ All requested units have been successfully transfused +

+
+
+
+ {% endif %} + + {% if blood_request.status == 'cancelled' %} +
+
+
+
+ Request Cancelled +
+

+ Request was cancelled and no units were issued +

+
+
+
+ {% endif %} +
+
+
+ +
+ +
+ + + +
+
+
+ + Back to Requests + +
+ {% if blood_request.status in 'pending,processing,ready' %} + + Issue Blood Unit + + {% endif %} + {% if blood_request.status == 'pending' %} + + {% endif %} + +
+
+
+
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/requests/blood_request_form.html b/templates/blood_bank/requests/blood_request_form.html new file mode 100644 index 00000000..b05a8646 --- /dev/null +++ b/templates/blood_bank/requests/blood_request_form.html @@ -0,0 +1,653 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if form.instance.pk %}Edit Blood Request{% else %}New Blood Request{% endif %}{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

+ {% if form.instance.pk %} + Edit Blood Request {{ form.instance.request_number }} + {% else %} + New Blood Request patient transfusion request + {% endif %} +

+ + + +
+
+

+ Blood Request Information +

+
+ Request ID: {{ form.instance.request_number|default:'Auto-generated' }} +
+
+
+
+ {% csrf_token %} + + +
+
Patient Information
+
+
+
+ + + {% if form.patient.errors %} +
{{ form.patient.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select a patient to view details +
+
+
+
+
+ + + +
+
Clinical Information
+
+
+
+ + + {% if form.requesting_physician.errors %} +
{{ form.requesting_physician.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.department.errors %} +
{{ form.department.errors.0 }}
+ {% endif %} +
+
+
+ +
+
+
+ + + {% if form.clinical_indication.errors %} +
{{ form.clinical_indication.errors.0 }}
+ {% endif %} +
+
+
+
+ + + +
+
Blood Component Request
+
+
+
+ + + {% if form.component_requested.errors %} +
{{ form.component_requested.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.units_requested.errors %} +
{{ form.units_requested.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select patient and component to check availability +
+
+
+
+
+ + + +
+
Urgency & Timing
+
+
+
+ + + {% if form.urgency.errors %} +
{{ form.urgency.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.required_by.errors %} +
{{ form.required_by.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Set required by time +
+
+
+
+
+ + + +
+
Special Requirements
+
+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + + {% if form.special_instructions.errors %} +
{{ form.special_instructions.errors.0 }}
+ {% endif %} +
+
+
+
+ + + +
+
Compatibility Check
+
+

Select patient and component to perform compatibility check

+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/requests/blood_request_list.html b/templates/blood_bank/requests/blood_request_list.html new file mode 100644 index 00000000..6b79ccc2 --- /dev/null +++ b/templates/blood_bank/requests/blood_request_list.html @@ -0,0 +1,495 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Request Management{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

Blood Request Management manage transfusion requests

+ + + +
+
+

Blood Transfusion Requests

+ +
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
Total Requests
+

{{ page_obj.paginator.count }}

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Pending
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Emergency
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Completed
+

0

+
+
+ +
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + {% for blood_request in page_obj %} + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
Request #PatientDepartmentComponentUnitsBlood GroupUrgencyStatusRequest DateRequired ByActions
+ + {{ blood_request.request_number }} + + + {{ blood_request.patient.full_name }} +
{{ blood_request.patient.patient_id }} +
{{ blood_request.requesting_department.name }}{{ blood_request.component_requested.get_name_display }} + {{ blood_request.units_requested }} + + {{ blood_request.patient_blood_group.display_name }} + + {% if blood_request.urgency == 'emergency' %} + + {{ blood_request.get_urgency_display }} + + {% elif blood_request.urgency == 'urgent' %} + + {{ blood_request.get_urgency_display }} + + {% else %} + {{ blood_request.get_urgency_display }} + {% endif %} + + {% if blood_request.status == 'pending' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'processing' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'ready' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'issued' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'completed' %} + {{ blood_request.get_status_display }} + {% elif blood_request.status == 'cancelled' %} + {{ blood_request.get_status_display }} + {% endif %} + {{ blood_request.request_date|date:"M d, Y H:i" }} + {{ blood_request.required_by|date:"M d, Y H:i" }} + {% if blood_request.is_overdue %} +
Overdue + {% endif %} +
+
+ + + + {% if blood_request.status == 'pending' or blood_request.status == 'processing' %} + + + + {% endif %} + {% if blood_request.status == 'pending' %} + + {% endif %} +
+
+
+ +
No blood requests found
+

Try adjusting your search criteria or create a new request.

+ + Create Request + +
+
+
+ + + + {% if page_obj.has_other_pages %} + + {% endif %} + + + +
+
+

+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} requests +

+
+
+
+ + + +
+
+
+ +
+
+ +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/tests/blood_test_form.html b/templates/blood_bank/tests/blood_test_form.html new file mode 100644 index 00000000..454995cc --- /dev/null +++ b/templates/blood_bank/tests/blood_test_form.html @@ -0,0 +1,644 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Test - {{ blood_unit.unit_number }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

Blood Test {{ blood_unit.unit_number }}

+ + + +
+
+

+ Blood Testing Panel +

+
+ Unit: {{ blood_unit.unit_number }} +
+
+
+
+ {% csrf_token %} + + +
+
Blood Unit Information
+
+
+ + + + + + + + + + + + + + + + + +
Unit Number:{{ blood_unit.unit_number }}
Blood Group:{{ blood_unit.blood_group.display_name }}
Component:{{ blood_unit.component.get_name_display }}
Volume:{{ blood_unit.volume_ml }} ml
+
+
+ + + + + + + + + + + + + + + + + +
Donor:{{ blood_unit.donor.full_name }}
Collection Date:{{ blood_unit.collection_date|date:"M d, Y" }}
Expiry Date:{{ blood_unit.expiry_date|date:"M d, Y" }}
Status: + + {{ blood_unit.get_status_display }} + +
+
+
+
+ + + +
+
Test Information
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Infectious Disease Testing
+
+ +
+
HIV Testing
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+
Hepatitis Testing
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+
Syphilis Testing
+
+ +
+ + +
+
+
+ + +
+
Additional Tests
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+ + + +
+
Test Notes & Observations
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
+
Compliance Verification
+
+
+
+
Quality Control
+
+ + +
+
+ + +
+
+ + +
+
+
+
Regulatory Compliance
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + + +
+
Test Summary
+
+

Complete test results to view summary

+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/transfusions/transfusion_detail.html b/templates/blood_bank/transfusions/transfusion_detail.html new file mode 100644 index 00000000..9c2dcda2 --- /dev/null +++ b/templates/blood_bank/transfusions/transfusion_detail.html @@ -0,0 +1,980 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Transfusion Details - {{ transfusion.transfusion_id }}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

Transfusion Details {{ transfusion.transfusion_id }}

+ + + +
+
+
+

+ {{ transfusion.patient.full_name }} + {{ transfusion.patient.patient_id }} +

+
+
+

Blood Unit: {{ transfusion.blood_unit.unit_number }}

+

Component: {{ transfusion.blood_unit.component.get_name_display }}

+

Blood Group: {{ transfusion.blood_unit.blood_group.display_name }}

+
+
+

Started: {{ transfusion.start_time|date:"M d, Y H:i" }}

+ {% if transfusion.end_time %} +

Completed: {{ transfusion.end_time|date:"M d, Y H:i" }}

+

Duration: {{ transfusion.duration_minutes }} minutes

+ {% else %} +

Elapsed: {{ transfusion.elapsed_minutes }} minutes

+

Status: {{ transfusion.get_status_display }}

+ {% endif %} +
+
+
+
+ {% if transfusion.status == 'in_progress' %} +
+ + + +
+
+

{{ transfusion.progress_percentage }}%

+ Complete +
+
+
+ {% endif %} +
+ {% if transfusion.status == 'in_progress' %} + Active Transfusion + {% elif transfusion.status == 'completed' %} + Completed + {% elif transfusion.status == 'stopped' %} + Stopped + {% elif transfusion.status == 'cancelled' %} + Cancelled + {% endif %} +
+
+
+
+ + + +
+ +
+ +
+
+

Vital Signs Monitoring

+
+ {% if transfusion.status == 'in_progress' %} + + {% endif %} +
+
+
+ {% if transfusion.vital_signs.exists %} +
+ +
+ + + {% with latest_vitals=transfusion.vital_signs.first %} + {% if latest_vitals %} +
+
+
+
+ {{ latest_vitals.blood_pressure }} +
+ Blood Pressure +
+
+
+
+
+ {{ latest_vitals.heart_rate }} +
+ Heart Rate +
+
+
+
+
+ {{ latest_vitals.temperature }}°C +
+ Temperature +
+
+
+
+
{{ latest_vitals.oxygen_saturation }}%
+ O2 Saturation +
+
+
+ {% endif %} + {% endwith %} + {% else %} +
+ +
No vital signs recorded
+ {% if transfusion.status == 'in_progress' %} + + {% endif %} +
+ {% endif %} +
+
+ + + +
+
+

Adverse Reactions

+
+ {% if transfusion.status == 'in_progress' %} + + {% endif %} +
+
+
+ {% if transfusion.adverse_reactions.exists %} + {% for reaction in transfusion.adverse_reactions.all %} +
+
+
+
{{ reaction.get_reaction_type_display }}
+

Severity: {{ reaction.get_severity_display }}

+

Symptoms: {{ reaction.symptoms }}

+

Time: {{ reaction.onset_time|date:"H:i" }}

+
+
+ {{ reaction.severity|upper }} +
+
+ {% if reaction.treatment_given %} +
+

Treatment: {{ reaction.treatment_given }}

+ {% endif %} +
+ {% endfor %} + {% else %} +
+ +
No adverse reactions reported
+

Transfusion proceeding without complications

+
+ {% endif %} +
+
+ + + +
+
+

Transfusion Timeline

+
+
+
+ +
+
{{ transfusion.start_time|date:"M d, Y H:i" }}
+
+
+
Transfusion Started
+

Started by {{ transfusion.started_by.get_full_name }}

+
+ Started +
+
+ + + {% for vitals in transfusion.vital_signs.all %} +
+
{{ vitals.recorded_at|date:"H:i" }}
+
+
+
Vital Signs Recorded
+

BP: {{ vitals.blood_pressure }}, HR: {{ vitals.heart_rate }}, Temp: {{ vitals.temperature }}°C

+
+ + {% if vitals.is_normal %}Normal{% else %}Abnormal{% endif %} + +
+
+ {% endfor %} + + + {% for reaction in transfusion.adverse_reactions.all %} +
+
{{ reaction.onset_time|date:"H:i" }}
+
+
+
Adverse Reaction
+

{{ reaction.get_reaction_type_display }} - {{ reaction.get_severity_display }}

+
+ {{ reaction.severity|upper }} +
+
+ {% endfor %} + + + {% if transfusion.end_time %} +
+
{{ transfusion.end_time|date:"M d, Y H:i" }}
+
+
+
+ {% if transfusion.status == 'completed' %} + Transfusion Completed + {% else %} + Transfusion Stopped + {% endif %} +
+

+ Volume transfused: {{ transfusion.volume_transfused }} ml + {% if transfusion.completion_notes %} +
Notes: {{ transfusion.completion_notes }} + {% endif %} +

+
+ + {{ transfusion.get_status_display }} + +
+
+ {% endif %} +
+
+
+ +
+ + + +
+ +
+
+

Transfusion Details

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + {% if transfusion.completed_by %} + + + + + {% endif %} +
Transfusion ID:{{ transfusion.transfusion_id }}
Blood Unit: + + {{ transfusion.blood_unit.unit_number }} + +
Component:{{ transfusion.blood_unit.component.get_name_display }}
Volume:{{ transfusion.blood_unit.volume_ml }} ml
Rate:{{ transfusion.transfusion_rate|default:"Standard" }} ml/hr
Started By:{{ transfusion.started_by.get_full_name }}
Completed By:{{ transfusion.completed_by.get_full_name }}
+
+
+ + + +
+
+

Patient Information

+
+
+ + + + + + + + + + + + + + + + + + + + + +
Name: + + {{ transfusion.patient.full_name }} + +
Patient ID:{{ transfusion.patient.patient_id }}
Blood Group: + {{ transfusion.patient.blood_group.display_name|default:"Unknown" }} +
Age:{{ transfusion.patient.age }} years
Weight:{{ transfusion.patient.weight|default:"Not recorded" }} kg
+
+
+ + + +
+
+

Quick Actions

+
+
+
+ {% if transfusion.status == 'in_progress' %} + + + + + {% endif %} + + + +
+
+
+ + + +
+
+

Related Information

+
+
+
+
Blood Request
+ {% if transfusion.blood_issue.blood_request %} + + View Original Request + + {% else %} + No associated request + {% endif %} +
+ +
+
Crossmatch Results
+ {% if transfusion.blood_unit.crossmatch_results.exists %} + Compatible + {% else %} + Pending + {% endif %} +
+ +
+
Blood Tests
+ {% if transfusion.blood_unit.blood_tests.exists %} + All Tests Passed + {% else %} + Tests Pending + {% endif %} +
+
+
+ +
+ +
+ + + + + + + + + +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/transfusions/transfusion_form.html b/templates/blood_bank/transfusions/transfusion_form.html new file mode 100644 index 00000000..1fe4650a --- /dev/null +++ b/templates/blood_bank/transfusions/transfusion_form.html @@ -0,0 +1,811 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if form.instance.pk %}Edit Transfusion{% else %}Start New Transfusion{% endif %}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} + + + + + +

+ {% if form.instance.pk %} + Edit Transfusion {{ form.instance.transfusion_id }} + {% else %} + Start New Transfusion patient blood administration + {% endif %} +

+ + + +
+
+

+ Transfusion Information +

+
+ Transfusion ID: {{ form.instance.transfusion_id|default:'Auto-generated' }} +
+
+
+
+ {% csrf_token %} + + +
+
Patient Information
+
+
+
+ + + {% if form.patient.errors %} +
{{ form.patient.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select a patient to view details +
+
+
+
+
+ + + +
+
Blood Unit Selection
+
+
+
+ + + {% if form.blood_unit.errors %} +
{{ form.blood_unit.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select a blood unit to view details +
+
+
+
+ + +
+
Compatibility Check
+
+

Select patient and blood unit to perform compatibility check

+
+
+
+ + + +
+
Transfusion Parameters
+
+
+
+ + + {% if form.transfusion_rate.errors %} +
{{ form.transfusion_rate.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.start_time.errors %} +
{{ form.start_time.errors.0 }}
+ {% endif %} +
+
+
+
+ + +
+
+
+ + +
+
Rate Calculator
+
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+
+
+ + + +
+
Baseline Vital Signs
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + +
+
Pre-Transfusion Safety Checklist
+
+
+
+
Patient Verification
+
+ + +
+
+ + +
+
+ + +
+
+
+
Blood Unit Verification
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
Clinical Assessment
+
+ + +
+
+ + +
+
+
+
Equipment & Environment
+
+ + +
+
+ + +
+
+
+
+
+ + + +
+
Special Instructions & Notes
+
+
+
+ + + {% if form.notes.errors %} +
{{ form.notes.errors.0 }}
+ {% endif %} +
+
+
+ +
+
+
+ + + {% if form.started_by.errors %} +
{{ form.started_by.errors.0 }}
+ {% endif %} +
+
+
+
+ + +
+
+
+
+ + + +
+
Transfusion Preview
+
+

Complete the form to preview transfusion details

+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/blood_bank/transfusions/transfusion_list.html b/templates/blood_bank/transfusions/transfusion_list.html new file mode 100644 index 00000000..ee753d90 --- /dev/null +++ b/templates/blood_bank/transfusions/transfusion_list.html @@ -0,0 +1,608 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Transfusion Management{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

Transfusion Management monitor blood transfusions

+ + + +
+
+

Blood Transfusions

+ +
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
Total Transfusions
+

{{ page_obj.paginator.count }}

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Active
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Completed
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
With Reactions
+

0

+
+
+ +
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + {% for transfusion in page_obj %} + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
PatientBlood UnitComponentStart TimeDurationVolumeStatusVital SignsReactionsActions
+ + {{ transfusion.patient.full_name }} + +
{{ transfusion.patient.patient_id }} +
+ + {{ transfusion.blood_unit.unit_number }} + +
{{ transfusion.blood_unit.blood_group.display_name }} +
{{ transfusion.blood_unit.component.get_name_display }}{{ transfusion.start_time|date:"M d, Y H:i" }} + {% if transfusion.end_time %} + {{ transfusion.duration_minutes }} min + {% elif transfusion.status == 'in_progress' %} + {{ transfusion.elapsed_minutes }} min + {% else %} + - + {% endif %} + + {{ transfusion.volume_transfused|default:"-" }} / {{ transfusion.blood_unit.volume_ml }} ml + {% if transfusion.status == 'in_progress' %} +
+
+
+ {% endif %} +
+ {% if transfusion.status == 'in_progress' %} + {{ transfusion.get_status_display }} + {% elif transfusion.status == 'completed' %} + {{ transfusion.get_status_display }} + {% elif transfusion.status == 'stopped' %} + {{ transfusion.get_status_display }} + {% elif transfusion.status == 'cancelled' %} + {{ transfusion.get_status_display }} + {% endif %} + + {% if transfusion.latest_vitals %} +
+ BP: {{ transfusion.latest_vitals.blood_pressure }}
+ HR: {{ transfusion.latest_vitals.heart_rate }}
+ Temp: {{ transfusion.latest_vitals.temperature }}°C +
+ {% else %} + No vitals + {% endif %} +
+ {% if transfusion.has_adverse_reactions %} + + {{ transfusion.adverse_reaction_count }} + + {% else %} + None + {% endif %} + +
+ + + + {% if transfusion.status == 'in_progress' %} + + + {% endif %} +
+
+
+ +
No transfusions found
+

Try adjusting your search criteria or start a new transfusion.

+ + Start Transfusion + +
+
+
+ + + + {% if page_obj.has_other_pages %} + + {% endif %} + + + +
+
+

+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} transfusions +

+
+
+
+ + + +
+
+
+ +
+
+ + + + + +{% endblock %} + +{% block extra_js %} + + + + + + +{% endblock %} + diff --git a/templates/blood_bank/units/.DS_Store b/templates/blood_bank/units/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 +.danger-zone { + background: #f8d7da; + border: 2px solid #dc3545; + border-radius: 10px; + padding: 20px; + margin-bottom: 20px; +} + +.unit-info { + background: #d1ecf1; + border-left: 4px solid #17a2b8; + border-radius: 8px; + padding: 15px; + margin-bottom: 20px; +} + +.impact-assessment { + background: #fff3cd; + border-left: 4px solid #ffc107; + border-radius: 8px; + padding: 15px; + margin-bottom: 20px; +} + +.related-records { + background: #f8f9fa; + border-radius: 8px; + padding: 15px; + margin-bottom: 20px; +} + +.deletion-options { + background: #e2e3e5; + border-radius: 8px; + padding: 15px; + margin-bottom: 20px; +} + +.warning-icon { + color: #dc3545; + font-size: 3em; + margin-bottom: 15px; +} + +.status-badge { + font-size: 0.9em; + padding: 5px 10px; +} + +.record-count { + font-weight: bold; + color: #dc3545; +} + +.alternative-action { + background: #d4edda; + border: 1px solid #28a745; + border-radius: 8px; + padding: 15px; + margin-top: 20px; +} + +{% endblock %} + +{% block content %} + + + + + +

Delete Blood Unit {{ blood_unit.unit_number }}

+ + + +
+ +

⚠️ CRITICAL ACTION REQUIRED ⚠️

+
You are about to permanently delete this blood unit
+

This action cannot be undone and may have serious implications for patient safety and regulatory compliance.

+
+ + + +
+
Blood Unit Information
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Unit Number:{{ blood_unit.unit_number }}
Blood Group:{{ blood_unit.blood_group.display_name }}
Component:{{ blood_unit.component.get_name_display }}
Volume:{{ blood_unit.volume_ml }} ml
Status: + + {{ blood_unit.get_status_display }} + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Donor: + + {{ blood_unit.donor.full_name }} + +
Collection Date:{{ blood_unit.collection_date|date:"M d, Y" }}
Expiry Date:{{ blood_unit.expiry_date|date:"M d, Y" }}
Location:{{ blood_unit.location.name }}
Created:{{ blood_unit.created_at|date:"M d, Y H:i" }}
+
+
+
+ + + +
+
Impact Assessment
+
+
+
+
Deletion Impact Analysis
+
    + {% if blood_unit.status == 'issued' %} +
  • CRITICAL: This unit has been issued and may be in use for patient transfusion
  • + {% endif %} + {% if blood_unit.status == 'available' %} +
  • WARNING: This unit is currently available in inventory
  • + {% endif %} + {% if blood_unit.blood_tests.exists %} +
  • Blood test records will be permanently lost
  • + {% endif %} + {% if blood_unit.crossmatch_results.exists %} +
  • Crossmatch results will be permanently deleted
  • + {% endif %} + {% if blood_unit.transfusions.exists %} +
  • CRITICAL: Transfusion records will be affected
  • + {% endif %} +
  • Audit trail and traceability will be compromised
  • +
  • Regulatory compliance may be affected
  • +
+
+
+
+
+ + + + + + + +
+
Deletion Options
+
+ {% csrf_token %} + +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+ + + +
+
Alternative Recommendation
+

+ Consider these alternatives instead of permanent deletion: +

+
+
+
Mark as Inactive
+

Preserve all data while removing from active inventory

+ +
+
+
Update Status
+

Change status to reflect current condition

+ +
+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/blood_bank/units/blood_unit_detail copy.html b/templates/blood_bank/units/blood_unit_detail copy.html new file mode 100644 index 00000000..9cc4b10c --- /dev/null +++ b/templates/blood_bank/units/blood_unit_detail copy.html @@ -0,0 +1,613 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Unit Details - {{ blood_unit.unit_number }}{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

+ Blood Unit Details + {{ blood_unit.unit_number }} +

+ + + +
+ +
+ +
+
+

Unit Information

+
+ + {{ blood_unit.get_status_display }} + +
+
+
+
+
+ +

{{ blood_unit.unit_number }}

+

{{ blood_unit.component.get_name_display }}

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blood Group: + {{ blood_unit.blood_group.display_name }} +
Component:{{ blood_unit.component.get_name_display }}
Volume:{{ blood_unit.volume_ml }} ml
Collection Date:{{ blood_unit.collection_date|date:"M d, Y H:i" }}
Expiry Date: + {{ blood_unit.expiry_date|date:"M d, Y" }} + {% if blood_unit.days_to_expiry <= 3 and blood_unit.status == 'available' %} +
{{ blood_unit.days_to_expiry }} days left + {% elif blood_unit.is_expired %} +
Expired + {% endif %} +
Location:{{ blood_unit.location }}
Bag Type:{{ blood_unit.bag_type }}
Anticoagulant:{{ blood_unit.anticoagulant }}
Collection Site:{{ blood_unit.collection_site }}
Collected By:{{ blood_unit.collected_by.get_full_name }}
+ + {% if blood_unit.notes %} +
+
Notes
+

{{ blood_unit.notes }}

+ {% endif %} +
+
+ + + +
+
+

Donor Information

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Donor ID:{{ blood_unit.donor.donor_id }}
Name:{{ blood_unit.donor.full_name }}
Age:{{ blood_unit.donor.age }} years
Gender:{{ blood_unit.donor.get_gender_display }}
Phone:{{ blood_unit.donor.phone }}
Total Donations:{{ blood_unit.donor.total_donations }}
+
+
+ +
+ + + +
+ +
+
+

Unit Status Timeline

+
+
+
+
+
+
+
+ Blood Collected +
+

+ {{ blood_unit.collection_date|date:"M d, Y H:i" }}
+ Blood unit collected from donor {{ blood_unit.donor.full_name }} +

+
+
+
+ + {% if tests %} +
+
+
+
+ Testing Phase +
+

+ {{ tests.first.test_date|date:"M d, Y H:i" }}
+ Laboratory testing initiated +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'quarantine' %} +
+
+
+
+ Quarantine +
+

+ Unit placed in quarantine pending test results +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'available' %} +
+
+
+
+ Available for Use +
+

+ Unit cleared for transfusion and available in inventory +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'issued' %} +
+
+
+
+ Issued +
+

+ Unit issued for patient transfusion +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'transfused' %} +
+
+
+
+ Transfused +
+

+ Unit successfully transfused to patient +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'expired' or blood_unit.status == 'discarded' %} +
+
+
+
+ {{ blood_unit.get_status_display }} +
+

+ Unit removed from inventory +

+
+
+
+ {% endif %} +
+
+
+ + + +
+
+

Test Results

+
+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add Test Result + + {% endif %} +
+
+
+ {% if tests %} +
+ + + + + + + + + + + + + {% for test in tests %} + + + + + + + + + {% endfor %} + +
Test TypeResultTest DateTested ByEquipmentVerified
{{ test.get_test_type_display }} + {% if test.result == 'positive' %} + {{ test.get_result_display }} + {% elif test.result == 'negative' %} + {{ test.get_result_display }} + {% elif test.result == 'indeterminate' %} + {{ test.get_result_display }} + {% else %} + {{ test.get_result_display }} + {% endif %} + {{ test.test_date|date:"M d, Y H:i" }}{{ test.tested_by.get_full_name }}{{ test.equipment_used|default:"-" }} + {% if test.verified_by %} + + {{ test.verified_by.get_full_name }} + +
{{ test.verified_at|date:"M d, Y H:i" }} + {% else %} + Pending + {% endif %} +
+
+ {% else %} +
+ +
No Test Results
+

No laboratory tests have been performed on this unit yet.

+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add First Test + + {% endif %} +
+ {% endif %} +
+
+ + + +
+
+

Crossmatch Results

+
+ {% if blood_unit.status == 'available' %} + + {% endif %} +
+
+
+ {% if crossmatches %} +
+ + + + + + + + + + + + + {% for crossmatch in crossmatches %} + + + + + + + + + {% endfor %} + +
PatientTest TypeCompatibilityTest DateTested ByVerified
+ {{ crossmatch.recipient.full_name }} +
{{ crossmatch.recipient.patient_id }} +
{{ crossmatch.get_test_type_display }} + {% if crossmatch.compatibility == 'compatible' %} + {{ crossmatch.get_compatibility_display }} + {% elif crossmatch.compatibility == 'incompatible' %} + {{ crossmatch.get_compatibility_display }} + {% else %} + {{ crossmatch.get_compatibility_display }} + {% endif %} + {{ crossmatch.test_date|date:"M d, Y H:i" }}{{ crossmatch.tested_by.get_full_name }} + {% if crossmatch.verified_by %} + + Verified + + {% else %} + Pending + {% endif %} +
+
+ {% else %} +
+ +
No Crossmatch Results
+

No crossmatch tests have been performed for this unit.

+
+ {% endif %} +
+
+ +
+ +
+ + + +
+
+
+ + Back to Units + +
+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add Test + + {% endif %} + {% if blood_unit.status == 'available' %} + + {% endif %} + +
+
+
+
+ +{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/blood_bank/units/blood_unit_detail.html b/templates/blood_bank/units/blood_unit_detail.html new file mode 100644 index 00000000..9cc4b10c --- /dev/null +++ b/templates/blood_bank/units/blood_unit_detail.html @@ -0,0 +1,613 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Unit Details - {{ blood_unit.unit_number }}{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

+ Blood Unit Details + {{ blood_unit.unit_number }} +

+ + + +
+ +
+ +
+
+

Unit Information

+
+ + {{ blood_unit.get_status_display }} + +
+
+
+
+
+ +

{{ blood_unit.unit_number }}

+

{{ blood_unit.component.get_name_display }}

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blood Group: + {{ blood_unit.blood_group.display_name }} +
Component:{{ blood_unit.component.get_name_display }}
Volume:{{ blood_unit.volume_ml }} ml
Collection Date:{{ blood_unit.collection_date|date:"M d, Y H:i" }}
Expiry Date: + {{ blood_unit.expiry_date|date:"M d, Y" }} + {% if blood_unit.days_to_expiry <= 3 and blood_unit.status == 'available' %} +
{{ blood_unit.days_to_expiry }} days left + {% elif blood_unit.is_expired %} +
Expired + {% endif %} +
Location:{{ blood_unit.location }}
Bag Type:{{ blood_unit.bag_type }}
Anticoagulant:{{ blood_unit.anticoagulant }}
Collection Site:{{ blood_unit.collection_site }}
Collected By:{{ blood_unit.collected_by.get_full_name }}
+ + {% if blood_unit.notes %} +
+
Notes
+

{{ blood_unit.notes }}

+ {% endif %} +
+
+ + + +
+
+

Donor Information

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Donor ID:{{ blood_unit.donor.donor_id }}
Name:{{ blood_unit.donor.full_name }}
Age:{{ blood_unit.donor.age }} years
Gender:{{ blood_unit.donor.get_gender_display }}
Phone:{{ blood_unit.donor.phone }}
Total Donations:{{ blood_unit.donor.total_donations }}
+
+
+ +
+ + + +
+ +
+
+

Unit Status Timeline

+
+
+
+
+
+
+
+ Blood Collected +
+

+ {{ blood_unit.collection_date|date:"M d, Y H:i" }}
+ Blood unit collected from donor {{ blood_unit.donor.full_name }} +

+
+
+
+ + {% if tests %} +
+
+
+
+ Testing Phase +
+

+ {{ tests.first.test_date|date:"M d, Y H:i" }}
+ Laboratory testing initiated +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'quarantine' %} +
+
+
+
+ Quarantine +
+

+ Unit placed in quarantine pending test results +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'available' %} +
+
+
+
+ Available for Use +
+

+ Unit cleared for transfusion and available in inventory +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'issued' %} +
+
+
+
+ Issued +
+

+ Unit issued for patient transfusion +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'transfused' %} +
+
+
+
+ Transfused +
+

+ Unit successfully transfused to patient +

+
+
+
+ {% endif %} + + {% if blood_unit.status == 'expired' or blood_unit.status == 'discarded' %} +
+
+
+
+ {{ blood_unit.get_status_display }} +
+

+ Unit removed from inventory +

+
+
+
+ {% endif %} +
+
+
+ + + +
+
+

Test Results

+
+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add Test Result + + {% endif %} +
+
+
+ {% if tests %} +
+ + + + + + + + + + + + + {% for test in tests %} + + + + + + + + + {% endfor %} + +
Test TypeResultTest DateTested ByEquipmentVerified
{{ test.get_test_type_display }} + {% if test.result == 'positive' %} + {{ test.get_result_display }} + {% elif test.result == 'negative' %} + {{ test.get_result_display }} + {% elif test.result == 'indeterminate' %} + {{ test.get_result_display }} + {% else %} + {{ test.get_result_display }} + {% endif %} + {{ test.test_date|date:"M d, Y H:i" }}{{ test.tested_by.get_full_name }}{{ test.equipment_used|default:"-" }} + {% if test.verified_by %} + + {{ test.verified_by.get_full_name }} + +
{{ test.verified_at|date:"M d, Y H:i" }} + {% else %} + Pending + {% endif %} +
+
+ {% else %} +
+ +
No Test Results
+

No laboratory tests have been performed on this unit yet.

+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add First Test + + {% endif %} +
+ {% endif %} +
+
+ + + +
+
+

Crossmatch Results

+
+ {% if blood_unit.status == 'available' %} + + {% endif %} +
+
+
+ {% if crossmatches %} +
+ + + + + + + + + + + + + {% for crossmatch in crossmatches %} + + + + + + + + + {% endfor %} + +
PatientTest TypeCompatibilityTest DateTested ByVerified
+ {{ crossmatch.recipient.full_name }} +
{{ crossmatch.recipient.patient_id }} +
{{ crossmatch.get_test_type_display }} + {% if crossmatch.compatibility == 'compatible' %} + {{ crossmatch.get_compatibility_display }} + {% elif crossmatch.compatibility == 'incompatible' %} + {{ crossmatch.get_compatibility_display }} + {% else %} + {{ crossmatch.get_compatibility_display }} + {% endif %} + {{ crossmatch.test_date|date:"M d, Y H:i" }}{{ crossmatch.tested_by.get_full_name }} + {% if crossmatch.verified_by %} + + Verified + + {% else %} + Pending + {% endif %} +
+
+ {% else %} +
+ +
No Crossmatch Results
+

No crossmatch tests have been performed for this unit.

+
+ {% endif %} +
+
+ +
+ +
+ + + +
+
+
+ + Back to Units + +
+ {% if blood_unit.status in 'collected,testing,quarantine' %} + + Add Test + + {% endif %} + {% if blood_unit.status == 'available' %} + + {% endif %} + +
+
+
+
+ +{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/blood_bank/units/blood_unit_form.html b/templates/blood_bank/units/blood_unit_form.html new file mode 100644 index 00000000..740b9219 --- /dev/null +++ b/templates/blood_bank/units/blood_unit_form.html @@ -0,0 +1,571 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if form.instance.pk %}Edit Blood Unit{% else %}Register Blood Unit{% endif %}{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

+ {% if form.instance.pk %} + Edit Blood Unit {{ form.instance.unit_number }} + {% else %} + Register Blood Unit new collection + {% endif %} +

+ + + +
+
+

+ Blood Unit Information +

+
+ {% if donor %} + Donor: {{ donor.full_name }} + {% endif %} +
+
+
+
+ {% csrf_token %} + + + {% if not donor %} +
+
Donor Selection
+
+
+
+ + + {% if form.donor.errors %} +
{{ form.donor.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select a donor to check eligibility +
+
+
+
+
+ {% else %} + +
+
Donor Information
+
+
+

Name: {{ donor.full_name }}

+

Donor ID: {{ donor.donor_id }}

+

Blood Group: {{ donor.blood_group.display_name }}

+
+
+

Last Donation: {{ donor.last_donation_date|date:"M d, Y"|default:"Never" }}

+

Total Donations: {{ donor.total_donations }}

+

Status: + + {% if donor.is_eligible %}Eligible{% else %}Check Required{% endif %} + +

+
+
+
+ {% endif %} + + + +
+
Collection Details
+
+
+
+ + + {% if form.collection_date.errors %} +
{{ form.collection_date.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.collection_time.errors %} +
{{ form.collection_time.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.collected_by.errors %} +
{{ form.collected_by.errors.0 }}
+ {% endif %} +
+
+
+
+ + + +
+
Component & Volume
+
+
+
+ + + {% if form.component.errors %} +
{{ form.component.errors.0 }}
+ {% endif %} +
+
+
+
+ + + {% if form.volume_ml.errors %} +
{{ form.volume_ml.errors.0 }}
+ {% endif %} +
+
+
+
+ + +
+
+
+
+ + + +
+
Storage Information
+
+
+
+ + + {% if form.location.errors %} +
{{ form.location.errors.0 }}
+ {% endif %} +
+
+
+
+ +
+ Select a location to view capacity +
+
+
+
+
+ + + +
+
Additional Information
+
+
+
+ + + {% if form.notes.errors %} +
{{ form.notes.errors.0 }}
+ {% endif %} +
+
+
+
+ + + +
+
Unit Preview
+
+
+
+

Unit Number: Will be auto-generated

+

Donor: {{ donor.full_name|default:'Not selected' }}

+

Blood Group: {{ donor.blood_group.display_name|default:'Unknown' }}

+

Component: Not selected

+

Volume: 0 ml

+

Collection Date: Not set

+

Expiry Date: Not calculated

+
+
+
+
+
Blood Unit Barcode
+
||||| |||| |||||
+
+
+
+
+ + + +
+ + Cancel + +
+ + +
+
+ +
+
+
+ +{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/blood_bank/units/blood_unit_list.html b/templates/blood_bank/units/blood_unit_list.html new file mode 100644 index 00000000..4308fe8b --- /dev/null +++ b/templates/blood_bank/units/blood_unit_list.html @@ -0,0 +1,509 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Blood Unit Management{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} + + + + + +

Blood Unit Management track and manage blood inventory

+ + + +
+
+

Blood Unit Inventory

+ +
+
+ +
+
+
+
+ + {{ form.blood_group }} +
+
+
+
+ + {{ form.component }} +
+
+
+
+ + {{ form.status }} +
+
+
+
+ + {{ form.expiry_days }} +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
Available Units
+

{{ page_obj.paginator.count }}

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Fresh Units
+

+ {{ page_obj.object_list|length }} +

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Expiring Soon
+

0

+
+
+ +
+
+
+
+
+
+
+
+
+
+
Expired Units
+

0

+
+
+ +
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + {% for unit in page_obj %} + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
Unit NumberDonorBlood GroupComponentCollection DateExpiry DateVolume (ml)StatusLocationDays to ExpiryActions
+ + {{ unit.unit_number }} + + + + {{ unit.donor.full_name }} + +
+ {{ unit.donor.donor_id }} +
+ {{ unit.blood_group.display_name }} + {{ unit.component.get_name_display }}{{ unit.collection_date|date:"M d, Y H:i" }} + {{ unit.expiry_date|date:"M d, Y" }} + {% if unit.days_to_expiry <= 3 and unit.status == 'available' %} +
Expiring Soon + {% elif unit.is_expired %} +
Expired + {% endif %} +
{{ unit.volume_ml }} + {% if unit.status == 'available' %} + {{ unit.get_status_display }} + {% elif unit.status == 'expired' %} + {{ unit.get_status_display }} + {% elif unit.status == 'issued' %} + {{ unit.get_status_display }} + {% elif unit.status == 'transfused' %} + {{ unit.get_status_display }} + {% elif unit.status == 'discarded' %} + {{ unit.get_status_display }} + {% else %} + {{ unit.get_status_display }} + {% endif %} + {{ unit.location }} + {% if unit.is_expired %} + Expired + {% elif unit.days_to_expiry <= 3 %} + {{ unit.days_to_expiry }} days + {% else %} + {{ unit.days_to_expiry }} days + {% endif %} + +
+ + + + {% if unit.status == 'collected' or unit.status == 'testing' %} + + + + {% endif %} + {% if unit.status == 'available' %} + + {% endif %} +
+
+
+ +
No blood units found
+

Try adjusting your search criteria or register a new blood unit.

+ + Register Blood Unit + +
+
+
+ + + + {% if page_obj.has_other_pages %} + + {% endif %} + + + +
+
+

+ Showing {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} blood units +

+
+
+
+ + + +
+
+
+ +
+
+ + + + + +{% endblock %} + +{% block extra_js %} + + + + + + + +{% endblock %} + diff --git a/templates/operating_theatre/.DS_Store b/templates/operating_theatre/.DS_Store index 304583e9225a21a97a17551b5f31e6cbb8781644..40e919ab35b57eb0becac354d07fde68e39f50b5 100644 GIT binary patch delta 334 zcmZoMXfc=|#>B)qu~2NHo+2a5!~pA!7aACWj2^>!4u%4TM1~@U5{675ox@O^R9;+= zl#`#tz`(F0sURn_xWvHV8Y2@k3o9EtJ109gdu(tKdpOXY* zCnkkurk2MGh&boxl_X~7r51rTWTvD7mBfT+=B4D9JLQ+=r4$48)&q@#$Z&FUaK;Nr zR9Bms8S5w*8JgAVC{$Y-8R#gOSQ^#Va&m|&>strKXXoVR<#z!c2Lz0a5SoD(O2epb zAOpi=Wx+*xIr(|%KslH`28NBN&aiA|=iui6hR?=>-CJzu~2NHo+2aD!~pBb1|lqz`I+=KyD}eQ*&M*!!L*s3gP#MaXtN{p ccjn3bBD$Q63=9khfS6&j4UhEZ7?CB+0OIKqYXATM diff --git a/templates/operating_theatre/blocks/block_detail.html b/templates/operating_theatre/blocks/block_detail.html index 25fdd6f6..683205f7 100644 --- a/templates/operating_theatre/blocks/block_detail.html +++ b/templates/operating_theatre/blocks/block_detail.html @@ -1,7 +1,7 @@ {% extends 'base.html' %} {% load static %} -{% block title %}OR Block - {{ block.operating_room.name }}{% endblock %} +{% block title %}OR Block - {{ object.operating_room.room_name }}{% endblock %} {% block css %} +{% endblock %} \ No newline at end of file diff --git a/templates/operating_theatre/dashboard.html b/templates/operating_theatre/dashboard.html index 0fd37b17..59eea5f6 100644 --- a/templates/operating_theatre/dashboard.html +++ b/templates/operating_theatre/dashboard.html @@ -5,519 +5,467 @@ {% block content %}
- -
-
-

- Operating Theatre Dashboard -

- + +
+
+

+ Operating Theatre Dashboard +

+ +
+ +
+ + +
+ +
+
+
+
+
+
{{ rooms_available|default:0 }}
+
Rooms Available
+
+
+
- +
+
+
+
+
+
+
{{ rooms_in_use|default:0 }}
+
Rooms In Use
+
+
+
+
+
+
+
+
+
+
+
{{ rooms_maintenance|default:0 }}
+
Maintenance
+
+
+
+
+
+
+
+
+
+
+
+
{{ total_rooms|default:0 }}
+
Total Rooms
+
+
+
+
+
- -
- -
-
-
-
-
-
{{ rooms_available|default:0 }}
-
Rooms Available
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ rooms_in_use|default:0 }}
-
Rooms In Use
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ rooms_maintenance|default:0 }}
-
Maintenance
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ total_rooms|default:0 }}
-
Total Rooms
-
-
- -
-
-
-
-
- - -
-
-
-
-
-
{{ cases_today|default:0 }}
-
Cases Today
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ cases_in_progress|default:0 }}
-
Cases In Progress
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ cases_completed_today|default:0 }}
-
Completed Today
-
-
- -
-
-
-
-
-
-
-
-
-
-
{{ emergency_cases_today|default:0 }}
-
Emergency Cases
-
-
- -
-
-
+ +
+
+
+
+
+
{{ cases_today|default:0 }}
+
Cases Today
+
+
+
+
+
+
+
+
+
{{ cases_in_progress|default:0 }}
+
Cases In Progress
+
+
+
+
+
+
+
+
+
+
+
+
{{ cases_completed_today|default:0 }}
+
Completed Today
+
+
+
+
+
+
+
+
+
+
+
+
{{ emergency_cases_today|default:0 }}
+
Emergency Cases
+
+
+
+
+
+
+
-
- -
-
-
-
- Today's Schedule -
-
- - - View All +
+ +
+
+ +
+ {% if todays_schedule %} +
+ + + + + + + + + + + + + + {% for case in todays_schedule %} + + + + + + + + + + {% endfor %} + +
TimePatientProcedureRoomSurgeonStatusActions
+
{{ case.scheduled_start|date:"H:i" }}
+
{{ case.estimated_duration }} min
+
+
{{ case.patient.get_full_name }}
+
{{ case.patient.mrn }}
+
+
{{ case.primary_procedure|truncatechars:30 }}
+ {% if case.case_type == 'EMERGENCY' %} + Emergency + {% elif case.case_type == 'URGENT' %} + Urgent + {% endif %} +
+ {% if case.operating_room %} + {{ case.operating_room.room_number }} + {% else %} + TBD + {% endif %} + + {% if case.primary_surgeon %} +
{{ case.primary_surgeon.get_full_name }}
+ {% else %} + N/A + {% endif %} +
+ + {{ case.get_status_display }} + + +
+ + -
- -
- {% if todays_schedule %} -
- - - - - - - - - - - - - - {% for case in todays_schedule %} - - - - - - - - - - {% endfor %} - -
TimePatientProcedureRoomSurgeonStatusActions
-
{{ case.scheduled_start_time|date:"H:i" }}
-
{{ case.estimated_duration }} min
-
-
{{ case.patient.get_full_name }}
-
{{ case.patient.mrn }}
-
-
{{ case.primary_procedure|truncatechars:30 }}
- {% if case.case_type == 'EMERGENCY' %} - Emergency - {% elif case.case_type == 'URGENT' %} - Urgent - {% endif %} -
- {% if case.operating_room %} - {{ case.operating_room.room_number }} - {% else %} - TBD - {% endif %} - - {% if case.primary_surgeon %} -
{{ case.primary_surgeon.get_full_name }}
- {% else %} - N/A - {% endif %} -
- - {{ case.get_status_display }} - - -
- - - - {% if case.status == 'SCHEDULED' %} - - {% endif %} -
-
-
- {% else %} -
- -

No cases scheduled for today.

- - Schedule a Case - -
- {% endif %} -
+ {% if case.status == 'SCHEDULED' %} + + {% endif %} + +
-
- - -
-
-
-
- Room Status -
- - Manage - -
-
- {% if room_utilization %} - {% for room in room_utilization %} -
-
-
- -
-
-
-
{{ room.room_number }} - {{ room.room_name }}
-
- {{ room.get_status_display }} - {% if room.current_case %} - - {{ room.current_case.patient.get_full_name }} - {% endif %} -
-
{{ room.cases_today|default:0 }} case{{ room.cases_today|pluralize }} today
-
-
- - - -
-
- {% endfor %} - {% else %} -
- -

No operating rooms configured.

- - Add Room - -
- {% endif %} -
+ {% else %} +
+ +

No cases scheduled for today.

+ + Schedule a Case +
+ {% endif %}
+
-
- -
-
-
-
- Recent Activity -
- - View All - -
-
- {% if recent_cases %} - {% for case in recent_cases %} -
-
- -
-
-
{{ case.patient.get_full_name }}
-
{{ case.primary_procedure|truncatechars:40 }}
-
{{ case.scheduled_start_time|date:"M d, H:i" }}
-
-
- - {{ case.get_status_display }} - -
-
- {% endfor %} - {% else %} -
- -

No recent activity.

-
- {% endif %} -
-
+ +
+
+
+

Room Status

+
+ Manage + +
+
+ {% if room_utilization %} + {% for room in room_utilization %} +
+
+
+ +
+
+
+
{{ room.room_number }} - {{ room.room_name }}
+
+ {{ room.get_status_display }} + {% if room.current_case %} + — {{ room.current_case.patient.get_full_name }} + {% endif %} +
+
{{ room.cases_today|default:0 }} case{{ room.cases_today|pluralize }} today
+
+
+ + + +
+
+ {% endfor %} + {% else %} +
+ +

No operating rooms configured.

+ + Add Room + +
+ {% endif %} +
+
+
+
- -
- +
+ +
+
+
+

Recent Activity

+
+ View All + +
+
+ {% if recent_cases %} + {% for case in recent_cases %} +
+
+ +
+
+
{{ case.patient.get_full_name }}
+
{{ case.primary_procedure|truncatechars:40 }}
+
{{ case.scheduled_start|date:"M d, H:i" }}
+
+
+ + {{ case.get_status_display }} + +
+
+ {% endfor %} + {% else %} +
+ +

No recent activity.

+
+ {% endif %} +
+
- -
-
-
-
-
- Performance Metrics -
-
-
-
-
-
{{ performance_metrics.utilization_rate|default:0 }}%
-
OR Utilization Rate
-
-
-
{{ performance_metrics.on_time_starts|default:0 }}%
-
On-Time Starts
-
-
-
{{ performance_metrics.avg_turnover|default:0 }} min
-
Avg Turnover Time
-
-
-
{{ performance_metrics.cancellation_rate|default:0 }}%
-
Cancellation Rate
-
-
-
-
+ +
+
+
+ + +
+
+
+
+

Performance Metrics

+
+ +
+
+
+
+
+
{{ performance_metrics.utilization_rate|default:0 }}%
+
OR Utilization Rate
+
+
+
{{ performance_metrics.on_time_starts|default:0 }}%
+
On-Time Starts
+
+
+
{{ performance_metrics.avg_turnover|default:0 }} min
+
Avg Turnover Time
+
+
+
{{ performance_metrics.cancellation_rate|default:0 }}%
+
Cancellation Rate
+
+
+
+
+
+
+
-{% endblock %} - +{% endblock %} \ No newline at end of file diff --git a/templates/operating_theatre/notes/operative_note_detail.html b/templates/operating_theatre/notes/operative_note_detail.html index 8ecf34cf..022dd41c 100644 --- a/templates/operating_theatre/notes/operative_note_detail.html +++ b/templates/operating_theatre/notes/operative_note_detail.html @@ -166,7 +166,7 @@

@@ -178,14 +178,14 @@ - + PDF - {% if note.status == 'draft' or note.status == 'pending' %} - - Edit - - {% endif %} +{# {% if note.status == 'draft' or note.status == 'pending' %}#} +{# #} +{# Edit#} +{# #} +{# {% endif %}#}

@@ -585,7 +585,7 @@ function signNote() { if (confirm('Sign this operative note? Once signed, the note cannot be edited without creating an amendment.')) { $.ajax({ - url: '{% url "operating_theatre:operative_note_sign" note.pk %}', + url: '{% url "operating_theatre:sign_note" note.pk %}', method: 'POST', data: { 'csrfmiddlewaretoken': '{{ csrf_token }}' diff --git a/templates/operating_theatre/notes/surgical_note_detail.html b/templates/operating_theatre/notes/surgical_note_detail.html index b51f229c..00d912a8 100644 --- a/templates/operating_theatre/notes/surgical_note_detail.html +++ b/templates/operating_theatre/notes/surgical_note_detail.html @@ -217,9 +217,9 @@ Back to List {% if note.status != 'signed' %} - - Edit - +{# #} +{# Edit#} +{# #} {% endif %} - - - Cancel - -
-
-
- - -
-
-
- Help & Guidelines -
-
-
-
-
-

- -

-
-
-
    -
  • General: Multi-purpose surgical procedures
  • -
  • Cardiac: Heart and vascular surgery
  • -
  • Neuro: Brain and spine surgery
  • -
  • Trauma: Emergency trauma cases
  • -
  • Robotic: Robot-assisted procedures
  • -
-
-
-
-
-

- -

-
-
-
    -
  • Temperature: 18-26°C typical range
  • -
  • Humidity: 30-60% recommended
  • -
  • Air Changes: Minimum 20 per hour
  • -
  • Pressure: Positive pressure preferred
  • -
-
-
-
-
-

- -

-
-
-
    -
  • Turnover: 15-45 minutes typical
  • -
  • Cleaning: 30-60 minutes for deep clean
  • -
  • Staffing: Minimum 2 nurses, 1 tech
  • -
  • Max Duration: 8 hours typical limit
  • -
-
-
-
-
-
-
- - - +
+
+
+
+ + {{ form.room_number }} + {% if form.room_number.errors %}
{{ form.room_number.errors.0 }}
{% endif %} +
Unique identifier for the operating room
+
+
+ + {{ form.room_name }} + {% if form.room_name.errors %}
{{ form.room_name.errors.0 }}
{% endif %} +
Descriptive name for the operating room
+
+
+
+ + {{ form.room_type }} + {% if form.room_type.errors %}
{{ form.room_type.errors.0 }}
{% endif %} +
Primary surgical specialty for this room
+
+
+ + {{ form.status }} + {% if form.status.errors %}
{{ form.status.errors.0 }}
{% endif %} +
Current operational status
+
+
+
- + + +
+
+

Physical Characteristics

+
+ +
+
+
+
+
+ + {{ form.floor_number }} + {% if form.floor_number.errors %}
{{ form.floor_number.errors.0 }}
{% endif %} +
+
+ + {{ form.building }} + {% if form.building.errors %}
{{ form.building.errors.0 }}
{% endif %} +
+
+ + {{ form.wing }} + {% if form.wing.errors %}
{{ form.wing.errors.0 }}
{% endif %} +
+
+
+
+ + {{ form.room_size }} + {% if form.room_size.errors %}
{{ form.room_size.errors.0 }}
{% endif %} +
Room area in square meters
+
+
+ + {{ form.ceiling_height }} + {% if form.ceiling_height.errors %}
{{ form.ceiling_height.errors.0 }}
{% endif %} +
Ceiling height in meters
+
+
+
+
+ + +
+
+

Environmental Controls

+
+ +
+
+
+
+
+ +
+
+ + {{ form.temperature_min }} + {% if form.temperature_min.errors %}
{{ form.temperature_min.errors.0 }}
{% endif %} +
+
+ + {{ form.temperature_max }} + {% if form.temperature_max.errors %}
{{ form.temperature_max.errors.0 }}
{% endif %} +
+
+
+
+ +
+
+ + {{ form.humidity_min }} + {% if form.humidity_min.errors %}
{{ form.humidity_min.errors.0 }}
{% endif %} +
+
+ + {{ form.humidity_max }} + {% if form.humidity_max.errors %}
{{ form.humidity_max.errors.0 }}
{% endif %} +
+
+
+
+
+
+ + {{ form.air_changes_per_hour }} + {% if form.air_changes_per_hour.errors %}
{{ form.air_changes_per_hour.errors.0 }}
{% endif %} +
Recommended: 20+ for operating rooms
+
+
+ +
+ {{ form.positive_pressure }} + +
+
Most ORs should maintain positive pressure
+
+
+
+
+ + +
+
+

Surgical Capabilities

+
+ +
+
+
+
+
+
Surgical Approaches
+
+ {{ form.supports_robotic }} + +
+
+ {{ form.supports_laparoscopic }} + +
+
+ {{ form.supports_microscopy }} + +
+
+ {{ form.supports_laser }} + +
+
+
+
Imaging Capabilities
+
+ {{ form.has_c_arm }} + +
+
+ {{ form.has_ct }} + +
+
+ {{ form.has_mri }} + +
+
+ {{ form.has_ultrasound }} + +
+
+ {{ form.has_neuromonitoring }} + +
+
+
+
+
+ + +
+
+

Scheduling Configuration

+
+ +
+
+
+
+
+ + {{ form.max_case_duration }} + {% if form.max_case_duration.errors %}
{{ form.max_case_duration.errors.0 }}
{% endif %} +
Maximum allowed case duration
+
+
+ + {{ form.turnover_time }} + {% if form.turnover_time.errors %}
{{ form.turnover_time.errors.0 }}
{% endif %} +
Standard time between cases
+
+
+ + {{ form.cleaning_time }} + {% if form.cleaning_time.errors %}
{{ form.cleaning_time.errors.0 }}
{% endif %} +
Time required for deep cleaning
+
+
+
+
+ + {{ form.required_nurses }} + {% if form.required_nurses.errors %}
{{ form.required_nurses.errors.0 }}
{% endif %} +
Minimum nursing staff required
+
+
+ + {{ form.required_techs }} + {% if form.required_techs.errors %}
{{ form.required_techs.errors.0 }}
{% endif %} +
Minimum technical staff required
+
+
+
+
+
+ {{ form.is_active }} + +
+
Available for scheduling
+
+
+
+ {{ form.accepts_emergency }} + +
+
Can be used for emergency procedures
+
+
+
+
+ +
+ + +
+ + +
+
+

Actions

+
+ +
+
+
+
+ + + + Cancel + +
+
+
+ + +
+
+

Help & Guidelines

+
+ +
+
+
+
+
+

+ +

+
+
+
    +
  • General: Multi-purpose surgical procedures
  • +
  • Cardiac: Heart and vascular surgery
  • +
  • Neuro: Brain and spine surgery
  • +
  • Trauma: Emergency trauma cases
  • +
  • Robotic: Robot-assisted procedures
  • +
+
+
+
+
+

+ +

+
+
+
    +
  • Temperature: 18–26°C typical range
  • +
  • Humidity: 30–60% recommended
  • +
  • Air Changes: Minimum 20 per hour
  • +
  • Pressure: Positive pressure preferred
  • +
+
+
+
+
+

+ +

+
+
+
    +
  • Turnover: 15–45 minutes typical
  • +
  • Cleaning: 30–60 minutes for deep clean
  • +
  • Staffing: Minimum 2 nurses, 1 tech
  • +
  • Max Duration: 8 hours typical limit
  • +
+
+
+
+
+
+
+ + + + +
+
+
-{% endblock %} - +{% endblock %} \ No newline at end of file diff --git a/templates/operating_theatre/surgical_case_list.html b/templates/operating_theatre/surgical_case_list.html deleted file mode 100644 index 6f3ff6f5..00000000 --- a/templates/operating_theatre/surgical_case_list.html +++ /dev/null @@ -1,305 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block title %}Surgical Cases{% endblock %} - -{% block content %} -
-
-
-
-

Surgical Cases

- - New Case - -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- - - Clear - -
-
-
-
-
-
- - -
-
-
-
- {% if surgical_cases %} -
- - - - - - - - - - - - - - - {% for case in surgical_cases %} - - - - - - - - - - - {% endfor %} - -
PatientProcedureSurgeonRoomScheduledPriorityStatusActions
- - {{ case.patient.first_name }} {{ case.patient.last_name }} - -
MRN: {{ case.patient.mrn }} -
- {{ case.procedure_name }} - {% if case.procedure_code %} -
{{ case.procedure_code }} - {% endif %} -
- {% if case.primary_surgeon %} - {{ case.primary_surgeon.first_name }} {{ case.primary_surgeon.last_name }} - {% else %} - N/A - {% endif %} - - {% if case.operating_room %} - {{ case.operating_room.room_number }} - {% else %} - TBD - {% endif %} - - {{ case.scheduled_start_time|date:"M d, Y H:i" }} - {% if case.estimated_duration_minutes %} -
Est: {{ case.estimated_duration_minutes }}min - {% endif %} -
- - {{ case.get_priority_display }} - - - - {{ case.get_status_display }} - - -
- - - - {% if case.status in 'SCHEDULED,IN_PROGRESS' %} - - - - {% endif %} - {% if case.status == 'SCHEDULED' %} - - {% elif case.status == 'IN_PROGRESS' %} - - {% endif %} -
-
-
- - - {% if is_paginated %} - - {% endif %} - {% else %} -
- -
No surgical cases found
-

Start by creating your first surgical case.

- - Create First Case - -
- {% endif %} -
-
-
-
-
- - -{% for case in surgical_cases %} -{% if case.status == 'SCHEDULED' %} - -{% endif %} -{% endfor %} - - -{% for case in surgical_cases %} -{% if case.status == 'IN_PROGRESS' %} - -{% endif %} -{% endfor %} -{% endblock %} - diff --git a/templates/patients/.DS_Store b/templates/patients/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..78b0b7b863d48482302345461861b0efc16a347d GIT binary patch literal 8196 zcmeHM&2AGh5FYn0i7HU}Q_BHq5!b4;r7Ehpgb)r~2?8NNVK*C+6}#(bcSD4#N;$(j zz$0+w4R{0Ig%f;ZyVb@^=nX+@OZMm3Gqd(Lws*%NBGDR$J472qR7Yl9TSf7k#QmHr zX~DFt0|oSn63T-~J_=$PRHR*lW56-s7;p?Y1{?$b0t0wwbE?mI@9SPyItCmA=aKgYijRbfI5q1Dmvu{f}4aH>(O zlhEoU%#($QP=tCq^gJa_qN&l9jseF&l>v_3SExrZ`4n04``2I;M|rWm{aq|9E-kOr zYK_`z?Nw(eC!NAC#(B%nUhuCcQpUk?-4C8d{YiK2>I0b;ew6kzr4WUEh`f9jrJm>Fw_9A8mSv2fN#w-rm9P(NUv*?bhvkkGpTbo; z%X9$SJoa_)E-9s)`X~$Pf`1=1p9W}2OzRd6(U(yCD3(1lN95De#FH30iQW%xaZV{yac?6UDoraY8_@%QkW=DmQe9z137 zE_gMT{nWrdW1o-lWcGHC`m>%AKP-)9NJ&`k+qM^YC6#TLB+rO9OEa?kSf`QlUI9LR zoL?62YJYs1*&mkt8DXfxgT>Po#S^o1e9DBV@oJ60+MJb7d|H&*yHv3fLqCU|ITqC3 zDOiC1&o*>8C9`b8sPAoUos8mp>a2%+@ap1`xhNycGWu2zM ZsYbLQ{q>80lkWxh{&(+xwFJ*)@e7&zS4RK< literal 0 HcmV?d00001 diff --git a/templates/patients/claims/insurance_claim_detail.html b/templates/patients/claims/insurance_claim_detail.html new file mode 100644 index 00000000..10340748 --- /dev/null +++ b/templates/patients/claims/insurance_claim_detail.html @@ -0,0 +1,684 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Claim {{ claim.claim_number }} - Details{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ + + + +
+
+
+

+ + Claim {{ claim.claim_number }} +

+
+ {% if claim.status == 'DRAFT' %} + {{ claim.get_status_display }} + {% elif claim.status == 'SUBMITTED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'UNDER_REVIEW' %} + {{ claim.get_status_display }} + {% elif claim.status == 'APPROVED' or claim.status == 'PARTIALLY_APPROVED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'DENIED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'PAID' %} + {{ claim.get_status_display }} + {% else %} + {{ claim.get_status_display }} + {% endif %} + + + {{ claim.get_priority_display }} Priority + + {{ claim.get_claim_type_display }} +
+

+ {{ claim.patient.get_full_name }} ({{ claim.patient.mrn }}) + | + Service Date: {{ claim.service_date|date:"F d, Y" }} +

+
+
+ +
+
+
+ +
+ +
+ +
+
+
+ Patient Information +
+
+
+
+
+
+ +
{{ claim.patient.get_full_name }}
+
+
+ +
{{ claim.patient.mrn }}
+
+
+ +
{{ claim.patient.date_of_birth|date:"F d, Y" }}
+
+
+
+
+ +
{{ claim.saudi_id_number|default:"Not provided" }}
+
+
+ +
{{ claim.patient.phone_number|default:"Not provided" }}
+
+
+ +
{{ claim.patient.email|default:"Not provided" }}
+
+
+
+
+
+ + +
+
+
+ Insurance Information +
+
+
+
+
+
+ +
{{ claim.insurance_info.insurance_company }}
+
+
+ +
{{ claim.insurance_info.policy_number }}
+
+
+ +
{{ claim.insurance_info.get_plan_type_display|default:"Not specified" }}
+
+
+
+
+ +
{{ claim.insurance_card_number|default:"Not provided" }}
+
+
+ +
{{ claim.authorization_number|default:"Not required" }}
+
+
+ +
{{ claim.insurance_info.get_insurance_type_display }}
+
+
+
+
+
+ + +
+
+
+ Service Information +
+
+
+
+
+
+ +
{{ claim.service_provider }}
+
+
+ +
{{ claim.service_provider_license|default:"Not provided" }}
+
+
+ +
{{ claim.service_date|date:"F d, Y" }}
+
+
+
+
+ +
{{ claim.facility_name|default:"Not specified" }}
+
+
+ +
{{ claim.facility_license|default:"Not provided" }}
+
+
+
+
+
+ + +
+
+
+ Medical Information +
+
+
+
+ +
{{ claim.primary_diagnosis_code }}
+
{{ claim.primary_diagnosis_description }}
+
+ + {% if claim.secondary_diagnosis_codes %} +
+ + {% for diagnosis in claim.secondary_diagnosis_codes %} +
+ {{ diagnosis.code }} - {{ diagnosis.description }} +
+ {% endfor %} +
+ {% endif %} + + {% if claim.procedure_codes %} +
+ + {% for procedure in claim.procedure_codes %} +
+ {{ procedure.code }} - {{ procedure.description }} +
+ {% endfor %} +
+ {% endif %} + + {% if claim.notes %} +
+ +
{{ claim.notes|linebreaks }}
+
+ {% endif %} +
+
+ + + {% if documents %} +
+
+
+ Attached Documents ({{ documents.count }}) +
+
+
+ {% for document in documents %} +
+
+
+
+ {% if document.mime_type == 'application/pdf' %} + + {% elif 'image' in document.mime_type %} + + {% elif 'word' in document.mime_type %} + + {% else %} + + {% endif %} +
+
+
{{ document.title }}
+ + {{ document.get_document_type_display }} • + {{ document.file_size|filesizeformat }} • + {{ document.uploaded_at|date:"M d, Y g:i A" }} + + {% if document.description %} +
{{ document.description }}
+ {% endif %} +
+
+
+ + +
+
+
+ {% endfor %} +
+
+ {% endif %} +
+ + +
+ +
+
+ Financial Summary +
+
+
+
{{ claim.billed_amount|floatformat:2 }}
+
Billed Amount (SAR)
+
+
+
{{ claim.approved_amount|floatformat:2 }}
+
Approved Amount (SAR)
+
+
+
+
+
+
{{ claim.paid_amount|floatformat:2 }}
+
Paid Amount (SAR)
+
+
+
{{ claim.patient_responsibility|floatformat:2 }}
+
Patient Responsibility (SAR)
+
+
+ + +
+
+ Approval Rate + {{ approval_percentage|floatformat:1 }}% +
+
+
+
+
+
+ + +
+
+
+ Status History +
+
+
+
+ {% for history in status_history %} +
+
+
+
+ {% if history.from_status %} + {{ history.get_from_status_display }} → {{ history.get_to_status_display }} + {% else %} + {{ history.get_to_status_display }} + {% endif %} +
+ {% if history.reason %} +
{{ history.reason }}
+ {% endif %} + {% if history.changed_by %} +
+ {{ history.changed_by.get_full_name|default:history.changed_by.username }} +
+ {% endif %} +
+ {{ history.changed_at|date:"M d, g:i A" }} +
+
+ {% empty %} +
+ +
No status history available
+
+ {% endfor %} +
+
+
+ + +
+
+
+ Quick Actions +
+
+
+
+ {% if claim.status == 'DRAFT' %} + + {% elif claim.status == 'SUBMITTED' %} + + {% elif claim.status == 'UNDER_REVIEW' %} + + + {% elif claim.status == 'APPROVED' %} + + {% endif %} + + + +
+ + + View Patient + + + + Back to Claims + +
+
+
+
+
+
+ + + +{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/patients/claims/insurance_claim_form.html b/templates/patients/claims/insurance_claim_form.html new file mode 100644 index 00000000..c758a5a5 --- /dev/null +++ b/templates/patients/claims/insurance_claim_form.html @@ -0,0 +1,729 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if claim %}Edit Claim {{ claim.claim_number }}{% else %}New Insurance Claim{% endif %}{% endblock %} + +{% block extra_css %} + + +{% endblock %} + +{% block content %} +
+ +
+ +
+ + + + + +
+
+

+ + {% if claim %}Edit Claim {{ claim.claim_number }}{% else %}New Insurance Claim{% endif %} +

+

+ {% if claim %}Update the insurance claim details{% else %}Create a new insurance claim for patient services{% endif %} +

+
+
+ + Cancel + + +
+
+ +
+ {% csrf_token %} + + +
+

+ Basic Information +

+
+
+
+
+ + +
+
Select the patient for this claim
+
+ +
+
+ + +
+
Select the insurance policy to use for this claim
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + Normal priority claim +
+
+ +
+
+ + +
+
Date when the service was provided
+
+
+
+
+ + +
+

+ Service Provider Information +

+
+
+
+
+ + +
+
Name of the healthcare provider
+
+ +
+
+ + +
+
Saudi Medical License number (optional)
+
+ +
+
+ + +
+
Name of the healthcare facility
+
+ +
+
+ + +
+
MOH facility license number (optional)
+
+
+
+
+ + +
+

+ Medical Information +

+
+
+
+
+ + +
+
ICD-10 diagnosis code
+
+ +
+
+ + +
+
Description of the primary diagnosis
+
+
+ + +
+
+
Secondary Diagnoses
+ +
+
+ {% if claim and claim.secondary_diagnosis_codes %} + {% for diagnosis in claim.secondary_diagnosis_codes %} +
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ {% endfor %} + {% endif %} +
+
+ + +
+
+
Procedures
+ +
+
+ {% if claim and claim.procedure_codes %} + {% for procedure in claim.procedure_codes %} +
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ {% endfor %} + {% endif %} +
+
+
+
+ + +
+

+ Financial Information +

+
+
+
+
+ + +
+
Total amount billed for services
+
+ +
+
+ + +
+
Required for certain procedures (optional)
+
+
+
+
+ + +
+

+ Saudi-specific Information +

+
+
+
+
+ + +
+
10-digit Saudi National ID or Iqama number
+
+ +
+
+ + +
+
Insurance card number from physical card
+
+
+
+
+ + +
+

+ Additional Information +

+
+
+ + +
+
Additional notes or comments about this claim
+
+
+ + +
+ +
+ + +
+
+
+
+ + + + +{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/patients/claims/insurance_claims_list.html b/templates/patients/claims/insurance_claims_list.html new file mode 100644 index 00000000..8cdc6540 --- /dev/null +++ b/templates/patients/claims/insurance_claims_list.html @@ -0,0 +1,615 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Insurance Claims Management{% endblock %} + +{% block extra_css %} + + + + +{% endblock %} + +{% block content %} +
+ +
+
+ +

Insurance Claims Management

+
+ +
+ + +
+
+
+
+
+ +
+
+
Total Claims
+
{{ stats.total_claims|default:0 }}
+
+
+
+
+
+
+
+
+ +
+
+
Total Billed
+
{{ stats.total_billed|floatformat:0|default:0 }} SAR
+
+
+
+
+
+
+
+
+ +
+
+
Total Approved
+
{{ stats.total_approved|floatformat:0|default:0 }} SAR
+
+
+
+
+
+
+
+
+ +
+
+
Average Claim
+
{{ stats.avg_amount|floatformat:0|default:0 }} SAR
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
+
+
+ + +
+
+
+ Selected: 0 claims +
+
+ + + + + +
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + {% for claim in claims %} + + + + + + + + + + + + + + {% empty %} + + + + {% endfor %} + +
+ + Claim NumberPatientTypeStatusPriorityService DateProviderBilled AmountApproved AmountActions
+ + + + {{ claim.claim_number }} + + +
+
+ +
+
+
{{ claim.patient.get_full_name }}
+ {{ claim.patient.mrn }} +
+
+
+ {{ claim.get_claim_type_display }} + + {% if claim.status == 'DRAFT' %} + {{ claim.get_status_display }} + {% elif claim.status == 'SUBMITTED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'UNDER_REVIEW' %} + {{ claim.get_status_display }} + {% elif claim.status == 'APPROVED' or claim.status == 'PARTIALLY_APPROVED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'DENIED' %} + {{ claim.get_status_display }} + {% elif claim.status == 'PAID' %} + {{ claim.get_status_display }} + {% else %} + {{ claim.get_status_display }} + {% endif %} + + + {{ claim.get_priority_display }} + {{ claim.service_date|date:"M d, Y" }} +
+
{{ claim.service_provider|truncatechars:30 }}
+ {{ claim.facility_name|truncatechars:25 }} +
+
+ {{ claim.billed_amount|floatformat:2 }} SAR + + {{ claim.approved_amount|floatformat:2 }} SAR + +
+ + + + + + + + + + +
+
+
+ +
No claims found
+

No insurance claims match your current filters.

+ + Create First Claim + +
+
+
+ + + {% if claims.has_other_pages %} + + {% endif %} +
+
+
+ + + +{% endblock %} + +{% block extra_js %} + + + + + + + +{% endblock %} + diff --git a/templates/patients/consent_management.html b/templates/patients/consent_management.html index e585120a..7c54f30f 100644 --- a/templates/patients/consent_management.html +++ b/templates/patients/consent_management.html @@ -56,7 +56,7 @@ - {% for consent in consent_forms %} + {% for consent in consents %} {{ consent.patient.get_full_name }}
@@ -118,33 +118,7 @@ {% if is_paginated %} - + {% include 'partial/pagination.html' %} {% endif %}
diff --git a/templates/patients/consents/consent_form_detail.html b/templates/patients/consents/consent_form_detail.html index 525802a7..065ce297 100644 --- a/templates/patients/consents/consent_form_detail.html +++ b/templates/patients/consents/consent_form_detail.html @@ -8,7 +8,7 @@ @@ -152,9 +152,9 @@ Archive Form {% endif %} - - Delete Form - +{# #} +{# Delete Form#} +{# #}
@@ -165,67 +165,67 @@ {% block js %} {% endblock %} diff --git a/templates/patients/consents/consent_form_form.html b/templates/patients/consents/consent_form_form.html index 97e4b142..753c1e5a 100644 --- a/templates/patients/consents/consent_form_form.html +++ b/templates/patients/consents/consent_form_form.html @@ -4,7 +4,7 @@ {% block title %}{% if object %}Edit{% else %}Create{% endif %} Consent Form - Patients{% endblock %} {% block css %} - + {% endblock %} {% block content %} @@ -12,7 +12,7 @@
@@ -594,201 +594,201 @@ function updateBulkActions() { } } -function createForm() { - var formData = { - title: $('#form-title').val(), - category: $('#form-category').val(), - description: $('#form-description').val(), - is_required: $('#form-required').is(':checked'), - has_expiration: $('#form-expiration').is(':checked'), - template_source: $('input[name="template-source"]:checked').val() - }; - - if (!formData.title || !formData.category || !formData.description) { - toastr.error('Please fill in all required fields'); - return; - } - - $.ajax({ - url: '{% url "patients:consent_form_create" %}', - method: 'POST', - data: formData, - success: function(response) { - $('#createFormModal').modal('hide'); - toastr.success('Consent form created successfully'); - setTimeout(function() { - window.location.href = response.redirect_url; - }, 1000); - }, - error: function() { - toastr.error('Failed to create consent form'); - } - }); -} +{#function createForm() {#} +{# var formData = {#} +{# title: $('#form-title').val(),#} +{# category: $('#form-category').val(),#} +{# description: $('#form-description').val(),#} +{# is_required: $('#form-required').is(':checked'),#} +{# has_expiration: $('#form-expiration').is(':checked'),#} +{# template_source: $('input[name="template-source"]:checked').val()#} +{# };#} +{# #} +{# if (!formData.title || !formData.category || !formData.description) {#} +{# toastr.error('Please fill in all required fields');#} +{# return;#} +{# }#} +{# #} +{# $.ajax({#} +{# url: '{% url "patients:co" %}',#} +{# method: 'POST',#} +{# data: formData,#} +{# success: function(response) {#} +{# $('#createFormModal').modal('hide');#} +{# toastr.success('Consent form created successfully');#} +{# setTimeout(function() {#} +{# window.location.href = response.redirect_url;#} +{# }, 1000);#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to create consent form');#} +{# }#} +{# });#} +{# }#} -function previewForm(formId) { - $.ajax({ - url: '{% url "patients:consent_form_preview" 0 %}'.replace('0', formId), - method: 'GET', - success: function(response) { - $('#preview-content').html(response.html); - $('#previewModal').modal('show'); - }, - error: function() { - toastr.error('Failed to load form preview'); - } - }); -} +{#function previewForm(formId) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_form_preview" 0 %}'.replace('0', formId),#} +{# method: 'GET',#} +{# success: function(response) {#} +{# $('#preview-content').html(response.html);#} +{# $('#previewModal').modal('show');#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to load form preview');#} +{# }#} +{# });#} +{# }#} -function activateForm(formId) { - if (confirm('Activate this consent form? It will become available for patient signatures.')) { - $.ajax({ - url: '{% url "patients:consent_form_activate" 0 %}'.replace('0', formId), - method: 'POST', - success: function() { - toastr.success('Form activated successfully'); - refreshData(); - }, - error: function() { - toastr.error('Failed to activate form'); - } - }); - } -} +{#function activateForm(formId) {#} +{# if (confirm('Activate this consent form? It will become available for patient signatures.')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_form_activate" 0 %}'.replace('0', formId),#} +{# method: 'POST',#} +{# success: function() {#} +{# toastr.success('Form activated successfully');#} +{# refreshData();#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to activate form');#} +{# }#} +{# });#} +{# }#} +{# }#} -function archiveForm(formId) { - if (confirm('Archive this consent form? It will no longer be available for new signatures.')) { - $.ajax({ - url: '{% url "patients:consent_form_archive" 0 %}'.replace('0', formId), - method: 'POST', - success: function() { - toastr.success('Form archived successfully'); - refreshData(); - }, - error: function() { - toastr.error('Failed to archive form'); - } - }); - } -} +{#function archiveForm(formId) {#} +{# if (confirm('Archive this consent form? It will no longer be available for new signatures.')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_form_archive" 0 %}'.replace('0', formId),#} +{# method: 'POST',#} +{# success: function() {#} +{# toastr.success('Form archived successfully');#} +{# refreshData();#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to archive form');#} +{# }#} +{# });#} +{# }#} +{# }#} -function duplicateForm(formId) { - if (confirm('Create a copy of this consent form?')) { - $.ajax({ - url: '{% url "patients:consent_form_duplicate" 0 %}'.replace('0', formId), - method: 'POST', - success: function(response) { - toastr.success('Form duplicated successfully'); - setTimeout(function() { - window.location.href = response.redirect_url; - }, 1000); - }, - error: function() { - toastr.error('Failed to duplicate form'); - } - }); - } -} +{#function duplicateForm(formId) {#} +{# if (confirm('Create a copy of this consent form?')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_form_duplicate" 0 %}'.replace('0', formId),#} +{# method: 'POST',#} +{# success: function(response) {#} +{# toastr.success('Form duplicated successfully');#} +{# setTimeout(function() {#} +{# window.location.href = response.redirect_url;#} +{# }, 1000);#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to duplicate form');#} +{# }#} +{# });#} +{# }#} +{# }#} -function exportForm(formId) { - window.open('{% url "patients:consent_form_export" 0 %}'.replace('0', formId), '_blank'); -} - -function exportForms() { - var selectedForms = $('.form-checkbox:checked').map(function() { - return $(this).val(); - }).get(); - - if (selectedForms.length === 0) { - toastr.warning('Please select forms to export'); - return; - } - - var url = '{% url "patients:consent_forms_export" %}?forms=' + selectedForms.join(','); - window.open(url, '_blank'); -} - -function bulkActivate() { - var selectedForms = $('.form-checkbox:checked').map(function() { - return $(this).val(); - }).get(); - - if (selectedForms.length === 0) { - toastr.warning('Please select forms to activate'); - return; - } - - if (confirm('Activate ' + selectedForms.length + ' selected form(s)?')) { - $.ajax({ - url: '{% url "patients:consent_forms_bulk_activate" %}', - method: 'POST', - data: { forms: selectedForms }, - success: function() { - toastr.success('Forms activated successfully'); - refreshData(); - }, - error: function() { - toastr.error('Failed to activate forms'); - } - }); - } -} - -function bulkArchive() { - var selectedForms = $('.form-checkbox:checked').map(function() { - return $(this).val(); - }).get(); - - if (selectedForms.length === 0) { - toastr.warning('Please select forms to archive'); - return; - } - - if (confirm('Archive ' + selectedForms.length + ' selected form(s)?')) { - $.ajax({ - url: '{% url "patients:consent_forms_bulk_archive" %}', - method: 'POST', - data: { forms: selectedForms }, - success: function() { - toastr.success('Forms archived successfully'); - refreshData(); - }, - error: function() { - toastr.error('Failed to archive forms'); - } - }); - } -} - -function bulkExport() { - exportForms(); -} - -function bulkDelete() { - var selectedForms = $('.form-checkbox:checked').map(function() { - return $(this).val(); - }).get(); - - if (selectedForms.length === 0) { - toastr.warning('Please select forms to delete'); - return; - } - - if (confirm('Delete ' + selectedForms.length + ' selected form(s)? This action cannot be undone.')) { - $.ajax({ - url: '{% url "patients:consent_forms_bulk_delete" %}', - method: 'POST', - data: { forms: selectedForms }, - success: function() { - toastr.success('Forms deleted successfully'); - refreshData(); - }, - error: function() { - toastr.error('Failed to delete forms'); - } - }); - } -} +{#function exportForm(formId) {#} +{# window.open('{% url "patients:consent_form_export" 0 %}'.replace('0', formId), '_blank');#} +{# }#} +{##} +{#function exportForms() {#} +{# var selectedForms = $('.form-checkbox:checked').map(function() {#} +{# return $(this).val();#} +{# }).get();#} +{# #} +{# if (selectedForms.length === 0) {#} +{# toastr.warning('Please select forms to export');#} +{# return;#} +{# }#} +{# #} +{# var url = '{% url "patients:consent_forms_export" %}?forms=' + selectedForms.join(',');#} +{# window.open(url, '_blank');#} +{# }#} +{##} +{#function bulkActivate() {#} +{# var selectedForms = $('.form-checkbox:checked').map(function() {#} +{# return $(this).val();#} +{# }).get();#} +{# #} +{# if (selectedForms.length === 0) {#} +{# toastr.warning('Please select forms to activate');#} +{# return;#} +{# }#} +{# #} +{# if (confirm('Activate ' + selectedForms.length + ' selected form(s)?')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_forms_bulk_activate" %}',#} +{# method: 'POST',#} +{# data: { forms: selectedForms },#} +{# success: function() {#} +{# toastr.success('Forms activated successfully');#} +{# refreshData();#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to activate forms');#} +{# }#} +{# });#} +{# }#} +{# }#} +{##} +{#function bulkArchive() {#} +{# var selectedForms = $('.form-checkbox:checked').map(function() {#} +{# return $(this).val();#} +{# }).get();#} +{# #} +{# if (selectedForms.length === 0) {#} +{# toastr.warning('Please select forms to archive');#} +{# return;#} +{# }#} +{# #} +{# if (confirm('Archive ' + selectedForms.length + ' selected form(s)?')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_forms_bulk_archive" %}',#} +{# method: 'POST',#} +{# data: { forms: selectedForms },#} +{# success: function() {#} +{# toastr.success('Forms archived successfully');#} +{# refreshData();#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to archive forms');#} +{# }#} +{# });#} +{# }#} +{# }#} +{##} +{#function bulkExport() {#} +{# exportForms();#} +{# }#} +{##} +{#function bulkDelete() {#} +{# var selectedForms = $('.form-checkbox:checked').map(function() {#} +{# return $(this).val();#} +{# }).get();#} +{# #} +{# if (selectedForms.length === 0) {#} +{# toastr.warning('Please select forms to delete');#} +{# return;#} +{# }#} +{# #} +{# if (confirm('Delete ' + selectedForms.length + ' selected form(s)? This action cannot be undone.')) {#} +{# $.ajax({#} +{# url: '{% url "patients:consent_forms_bulk_delete" %}',#} +{# method: 'POST',#} +{# data: { forms: selectedForms },#} +{# success: function() {#} +{# toastr.success('Forms deleted successfully');#} +{# refreshData();#} +{# },#} +{# error: function() {#} +{# toastr.error('Failed to delete forms');#} +{# }#} +{# });#} +{# }#} +{# }#} function printPreview() { var printContent = $('#preview-content').html(); diff --git a/templates/patients/consents/consent_template_confirm_delete.html b/templates/patients/consents/consent_template_confirm_delete.html new file mode 100644 index 00000000..73ea6bcc --- /dev/null +++ b/templates/patients/consents/consent_template_confirm_delete.html @@ -0,0 +1,488 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Delete Consent Template - {{ template.name }}{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+
+ +
+
+ +
+ +
+
+ +
+

Delete Consent Template

+

This action cannot be undone. Please review the impact before proceeding.

+
+ + +
+
+ Template Details +
+
+
+ +
{{ template.name }}
+
+
+ +
{{ template.get_category_display }}
+
+
+ +
{{ template.version|default:"1.0" }}
+
+
+ +
+ {% if template.status == 'active' %} + Active + {% elif template.status == 'draft' %} + Draft + {% elif template.status == 'archived' %} + Archived + {% else %} + {{ template.get_status_display }} + {% endif %} +
+
+
+ +
{{ template.description|default:"No description available" }}
+
+
+
+ + +
+
+
{{ usage_stats.total_usage|default:0 }}
+
Total Uses
+
+
+
{{ usage_stats.active_consents|default:0 }}
+
Active Consents
+
+
+
{{ usage_stats.pending_consents|default:0 }}
+
Pending Consents
+
+
+
{{ usage_stats.last_used|timesince|default:"Never" }}
+
Last Used
+
+
+ + +
+
+ Impact Analysis +
+
+
+
+ +
+
{{ impact.affected_patients|default:0 }} Patients
+ Will lose access to this template +
+
+
+
+
+ +
+
{{ impact.dependent_consents|default:0 }} Consents
+ Currently using this template +
+
+
+
+
+ +
+
{{ impact.scheduled_procedures|default:0 }} Procedures
+ Scheduled with this template +
+
+
+
+
+ +
+
{{ impact.template_references|default:0 }} References
+ From other templates +
+
+
+
+
+ + +
+
+ Consider These Alternatives +
+
+
+
+ +
+
Archive Template
+ Hide from active use but preserve data +
+
+
+
+
+ +
+
Modify Template
+ Update content instead of deleting +
+
+
+
+
+ +
+
Create New Version
+ Duplicate and modify for future use +
+
+
+
+
+ +
+
Export Template
+ Save a backup before deletion +
+
+
+
+ +
+ + +
+
+ Danger Zone +
+

+ Warning: Deleting this template will permanently remove it from the system. + This action affects: +

+
    +
  • All historical records using this template
  • +
  • Audit trails and compliance documentation
  • +
  • Related consent forms and signatures
  • +
  • Template usage analytics and reports
  • +
+
+ + This action cannot be undone! Consider archiving instead of permanent deletion. +
+
+ + +
+
+ Deletion Confirmation Steps +
+ +
+
1
+
+
Review Impact Analysis
+ Understand what will be affected by this deletion +
+
+ +
+
+ +
+
2
+
+
Backup Template (Recommended)
+ Export template before deletion +
+
+ +
+
+ +
+
3
+
+
Type Confirmation
+ Type "DELETE {{ template.name }}" to confirm +
+
+
+ + +
+ {% csrf_token %} +
+ + +
+ This confirmation is case-sensitive and must match exactly. +
+
+ +
+
+ + +
+
+ +
+ + +
+ + +
+ +
+ +
+
+
+
+
+{% endblock %} + +{% block extra_js %} + +{% endblock %} + diff --git a/templates/patients/consents/consent_template_detail.html b/templates/patients/consents/consent_template_detail.html new file mode 100644 index 00000000..2564d361 --- /dev/null +++ b/templates/patients/consents/consent_template_detail.html @@ -0,0 +1,586 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{{ template.name }} - Consent Template{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+

+ {{ template.name }} +

+

{{ template.description }}

+
+ + Version {{ template.version|default:"1.0" }} + + + {{ template.get_category_display }} + + + {{ template.get_language_display }} + +
+
+
+ {% if template.status == 'active' %} + + Active + + {% elif template.status == 'draft' %} + + Draft + + {% elif template.status == 'archived' %} + + Archived + + {% else %} + + {{ template.get_status_display }} + + {% endif %} +
+
+
+ + +
+
+
+ +
+

{{ template.usage_count|default:0 }}

+ Times Used +
+
+
+ +
+

{{ template.last_used|date:"M d"|default:"Never" }}

+ Last Used +
+
+
+ +
+

{{ template.rating|floatformat:1|default:"N/A" }}

+ Average Rating +
+
+
+ +
+

{{ template.avg_completion_time|default:"N/A" }}

+ Avg. Completion +
+
+ + +
+
+
+ Template Preview +
+
+ + +
+
+ +
+
+

{{ template.name }}

+
+ {{ template.content|safe|default:"

No content available for preview.

" }} +
+
+ + {% if template.variables %} +
+
+ Template Variables +
+

The following variables will be replaced when the template is used:

+ {% for variable in template.variables %} + {{ variable }} + {% endfor %} +
+ {% endif %} +
+ +
+
{{ template.raw_content|default:"No raw content available." }}
+
+
+ + +
+
+ Recent Usage History +
+
+ {% for usage in recent_usage %} +
+
+
+
{{ usage.patient_name }}
+

{{ usage.description }}

+ + {{ usage.created_by }} + {{ usage.created_at|timesince }} ago + +
+ {{ usage.status }} +
+
+ {% empty %} +
+ +
No Usage History
+

This template hasn't been used yet.

+
+ {% endfor %} +
+
+
+ + +
+ +
+
+
+
+ Actions +
+
+
+
+ + Edit Template + + + + +
+ + +
+
+
+
+ + +
+
+
+ Template Information +
+
+
+
+
+
+ +
{{ template.created_by|default:"System" }}
+
+
+ +
{{ template.created_at|date:"M d, Y" }}
+
+
+ +
{{ template.updated_at|date:"M d, Y" }}
+
+
+ +
{{ template.file_size|filesizeformat|default:"N/A" }}
+
+
+ +
{{ template.checksum|truncatechars:8|default:"N/A" }}
+
+ {% if template.tags %} +
+ +
+ {% for tag in template.tags %} + {{ tag }} + {% endfor %} +
+
+ {% endif %} +
+
+
+
+ + +
+
+
+ Usage Analytics +
+
+
+ +
+
+
+
{{ analytics.this_week|default:0 }}
+ This Week +
+
+
{{ analytics.this_month|default:0 }}
+ This Month +
+
+
{{ analytics.total|default:0 }}
+ All Time +
+
+
+
+
+ + + {% if related_templates %} +
+
+
+ Related Templates +
+
+
+ {% for related in related_templates %} +
+
+ +
+ +
+ {{ related.usage_count|default:0 }} +
+
+ {% endfor %} +
+
+ {% endif %} +
+
+
+
+{% endblock %} + +{% block extra_js %} + + + +{% endblock %} + diff --git a/templates/patients/consents/consent_template_form.html b/templates/patients/consents/consent_template_form.html new file mode 100644 index 00000000..78b12f5d --- /dev/null +++ b/templates/patients/consents/consent_template_form.html @@ -0,0 +1,679 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}{% if template %}Edit{% else %}Create{% endif %} Consent Template{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} +
+ +
+
+ +

+ + {% if template %}Edit Template{% else %}Create New Template{% endif %} +

+

{% if template %}Modify the existing consent template{% else %}Create a new consent form template for patient care{% endif %}

+
+
+
+ + + + Cancel + +
+
+
+ + +
+ Saved +
+ +
+ {% csrf_token %} + + + + +
+ +
+
+
+
+ Template Information +
+
+ +
+
+ + +
Enter a descriptive name for this consent template
+
+
+ + +
Template version number
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
Add relevant tags to help organize and search templates
+
+
+
+
+ + +
+
+
+
+ Template Content +
+
+ + +
+
+ Quick Insert +
+ + + + + + + + +
+ +
+
+ + +
Use the rich text editor to create your consent form content. Insert variables using the buttons above.
+
+
+
+
+ + +
+
+
+
+ Template Variables +
+
+ +
+
+
Variable Manager
+ +
+ +
+ +
+ +
+
Available Variables:
+
+ {{patient_name}} + {{patient_id}} + {{date}} + {{doctor_name}} + {{procedure_name}} + {{hospital_name}} + {{signature_date}} + {{witness_name}} +
+
+
+
+
+ + +
+
+
+
+ Template Settings +
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ + +
Leave blank for no expiry
+
+
+ + +
Days before expiry to send reminder
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ Template Preview +
+
+ +
+
+ + + + + + +
+ +
+ +
+
+ +
Template Preview
+

Click "Update Preview" to see how your template will look

+
+
+
+
+
+ + +
+
+
+ + +
+
+ + Cancel + + +
+
+
+
+
+{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/patients/consents/consent_template_list.html b/templates/patients/consents/consent_template_list.html new file mode 100644 index 00000000..ce641e50 --- /dev/null +++ b/templates/patients/consents/consent_template_list.html @@ -0,0 +1,708 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Consent Templates Management{% endblock %} + +{% block extra_css %} + + + +{% endblock %} + +{% block content %} +
+ +
+
+ +

+ Consent Templates Management +

+

Manage and organize consent form templates for patient care

+
+
+
+ + + New Template + +
+
+
+ + +
+
+
+
+
+ +
+
+
Total Templates
+
{{ stats.total_templates|default:0 }}
+
+
+
+
+
+
+
+
+ +
+
+
Active Templates
+
{{ stats.active_templates|default:0 }}
+
+
+
+
+
+
+
+
+ +
+
+
Total Usage
+
{{ stats.total_usage|default:0 }}
+
+
+
+
+
+
+
+
+ +
+
+
This Week
+
{{ stats.weekly_usage|default:0 }}
+
+
+
+
+
+ + +
+
+
+ +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+ Showing {{ templates.count|default:0 }} templates +
+
+ + + + +
+
+ + +
+ {% for template in templates %} +
+
+ {% if template.status == 'active' %} + Active + {% elif template.status == 'draft' %} + Draft + {% elif template.status == 'archived' %} + Archived + {% else %} + {{ template.get_status_display }} + {% endif %} +
+ +
+
+ + {{ template.name }} +
+
+ {{ template.get_category_display }} + + {{ template.get_language_display }} + +
+
+ +
+
+

{{ template.description|truncatewords:20 }}

+
+ +
+
+
+
{{ template.usage_count|default:0 }}
+ Used +
+
+
{{ template.version|default:"1.0" }}
+ Version +
+
+
{{ template.updated_at|date:"M d" }}
+ Updated +
+
+
+
+ +
+
+
+ + + + + + + +
+
+ + + {% if template.status != 'archived' %} + + {% endif %} +
+
+
+
+ {% empty %} +
+
+ +

No Consent Templates Found

+

Get started by creating your first consent template

+ + Create First Template + +
+
+ {% endfor %} +
+ + +
+
+
+
+ + + + + + + + + + + + + + {% for template in templates %} + + + + + + + + + + {% endfor %} + +
Template NameCategoryLanguageStatusUsage CountLast UpdatedActions
+
+ +
+
{{ template.name }}
+ {{ template.description|truncatewords:8 }} +
+
+
+ {{ template.get_category_display }} + {{ template.get_language_display }} + {% if template.status == 'active' %} + Active + {% elif template.status == 'draft' %} + Draft + {% elif template.status == 'archived' %} + Archived + {% else %} + {{ template.get_status_display }} + {% endif %} + {{ template.usage_count|default:0 }}{{ template.updated_at|date:"M d, Y" }} +
+ + + + + + + +
+
+
+
+
+
+ + + +
+ + + + + + +{% endblock %} + +{% block extra_js %} + + + + +{% endblock %} + diff --git a/templates/patients/insurance/insurance_detail.html b/templates/patients/insurance/insurance_detail.html index df732a47..55da9688 100644 --- a/templates/patients/insurance/insurance_detail.html +++ b/templates/patients/insurance/insurance_detail.html @@ -9,8 +9,8 @@ - - +{# #} + @@ -40,7 +40,7 @@ - + @@ -124,7 +124,7 @@ @@ -285,41 +285,9 @@ - {% if is_paginated %} - - {% endif %} +{# {% if is_paginated %}#} +{# {% include 'partial/pagination.html' %}#} +{# {% endif %}#} @@ -394,10 +362,10 @@ {% endblock %} {% block js %} - - - - + + + + + diff --git a/templates/patients/partials/insurance_claims_history.html b/templates/patients/partials/insurance_claims_history.html new file mode 100644 index 00000000..ac2bc33e --- /dev/null +++ b/templates/patients/partials/insurance_claims_history.html @@ -0,0 +1,483 @@ +{% load static %} + +
+ +
+
+
+
+
+ Claims Summary +
+
+
+
+
+
+
+ +
+
+
{{ summary.total_claims }}
+ Total Claims +
+
+
+ +
+
+
+ +
+
+
ê{{ summary.total_claimed|floatformat:2 }}
+ Total Claimed +
+
+
+ +
+
+
+ +
+
+
ê{{ summary.total_approved|floatformat:2 }}
+ Total Approved +
+
+
+ +
+
+
+ +
+
+
{{ summary.approval_rate }}%
+ Approval Rate +
+
+
+
+ +
+
+
+
{{ summary.approved_claims }}
+ Approved Claims +
+
+
+
+
{{ summary.pending_claims }}
+ Pending Claims +
+
+
+
+
{{ summary.denied_claims }}
+ Denied Claims +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + + + + +
+
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ Claims History +
+
+ + +
+
+
+ {% if claims %} +
+
Provider:{{ object.insurance_provider }}{{ object.insurance_company }}
Policy Number:Copay: {% if object.copay %} - ${{ object.copay }} + ê{{ object.copay }} {% else %} Not specified {% endif %} @@ -134,7 +134,7 @@ Deductible: {% if object.deductible %} - ${{ object.deductible }} + ê{{ object.deductible }} {% else %} Not specified {% endif %} @@ -323,7 +323,7 @@ @@ -486,7 +486,7 @@ function checkEligibility() { $('#eligibility-results').html('
Failed to check eligibility. Please try again.
'); } }); -} + } function renewInsurance() { if (confirm('Mark this insurance policy for renewal?')) { @@ -505,7 +505,7 @@ function renewInsurance() { } }); } -} + } function printInsurance() { window.print(); diff --git a/templates/patients/insurance/insurance_form.html b/templates/patients/insurance/insurance_form.html index 13224795..241bd77c 100644 --- a/templates/patients/insurance/insurance_form.html +++ b/templates/patients/insurance/insurance_form.html @@ -571,25 +571,25 @@ function verifyWithProvider() { }); } -function checkEligibility() { - var formData = $('#insurance-form').serialize(); - - $.ajax({ - url: '{% url "patients:check_insurance_eligibility" %}', - method: 'POST', - data: formData, - beforeSend: function() { - $('#verification-results').html('

Checking eligibility...
'); - $('#verificationModal').modal('show'); - }, - success: function(response) { - $('#verification-results').html(response.html); - }, - error: function() { - $('#verification-results').html('
Failed to check eligibility. Please try again.
'); - } - }); -} +{#function checkEligibility() {#} +{# var formData = $('#insurance-form').serialize();#} +{# #} +{# $.ajax({#} +{# url: '{% url "patients:check_eligibility" pk %}',#} +{# method: 'POST',#} +{# data: formData,#} +{# beforeSend: function() {#} +{# $('#verification-results').html('

Checking eligibility...
');#} +{# $('#verificationModal').modal('show');#} +{# },#} +{# success: function(response) {#} +{# $('#verification-results').html(response.html);#} +{# },#} +{# error: function() {#} +{# $('#verification-results').html('
Failed to check eligibility. Please try again.
');#} +{# }#} +{# });#} +{# }#} function scanInsuranceCard() { toastr.info('Insurance card scanning feature coming soon!'); diff --git a/templates/patients/insurance/insurance_list.html b/templates/patients/insurance/insurance_list.html index 5607f67f..48dbf451 100644 --- a/templates/patients/insurance/insurance_list.html +++ b/templates/patients/insurance/insurance_list.html @@ -4,8 +4,8 @@ {% block title %}Insurance Information - Patients{% endblock %} {% block css %} - - + + {% endblock %} {% block content %} @@ -32,7 +32,7 @@

Insurance Records

- + Add Insurance
- {% if insurance.expiration_date %} - {{ insurance.expiration_date|date:"M d, Y" }} + {% if insurance.termination_date %} + {{ insurance.termination_date|date:"M d, Y" }} {% if insurance.is_expired %}
Expired @@ -274,7 +274,7 @@
No insurance records found
- + Add First Insurance Record
+ + + + + + + + + + + + + + + {% for claim in claims %} + + + + + + + + + + + + {% endfor %} + +
Claim IDService DateService TypeProviderAmountApprovedPatient Resp.StatusActions
+
{{ claim.claim_id }}
+ Filed: {{ claim.claim_date }} +
+
{{ claim.service_date }}
+ {% if claim.diagnosis_code %} + {{ claim.diagnosis_code }} + {% endif %} +
+
{{ claim.service_type }}
+ {% if claim.procedure_code %} + {{ claim.procedure_code }} + {% endif %} +
+
{{ claim.provider }}
+
+
ê{{ claim.claim_amount|floatformat:'2g' }}
+
+ {% if claim.approved_amount > 0 %} +
ê{{ claim.approved_amount|floatformat:'2g' }}
+ {% else %} + - + {% endif %} +
+ {% if claim.patient_responsibility > 0 %} +
ê{{ claim.patient_responsibility|floatformat:'2g' }}
+ {% else %} + - + {% endif %} +
+ + {{ claim.status|title }} + + {% if claim.processed_date %} +
{{ claim.processed_date }} + {% endif %} +
+
+ + {% if claim.status == 'denied' %} + + {% endif %} + {% if claim.status == 'paid' %} + + {% endif %} +
+
+ + {% else %} +
+ +
No Claims History
+

No insurance claims found for this policy.

+
+ {% endif %} + + + + + + + {% if summary.total_patient_responsibility > 0 %} +
+
+
+
+ +
+
+
Patient Financial Responsibility
+

+ Total patient responsibility for all claims: ê{{ summary.total_patient_responsibility|floatformat:'2g' }} +
This includes copays, deductibles, and non-covered services. +

+
+
+ +
+
+
+
+ {% endif %} + + + + + + + + + diff --git a/templates/patients/partials/provider_verification_results.html b/templates/patients/partials/provider_verification_results.html new file mode 100644 index 00000000..d096ef85 --- /dev/null +++ b/templates/patients/partials/provider_verification_results.html @@ -0,0 +1,547 @@ +{% load static %} + +
+ +
+
+
+
+
+
+ + Provider Verification Results +
+
+ + {{ verification.status|title }} + + {{ verification.response_time }} +
+
+
+
+
+
+ + + + + + + + + + + + + +
Provider:{{ verification.provider }}
Policy Number:{{ verification.policy_number }}
Verification ID:{{ verification.verification_id }}
+
+
+ + + + + + + + + + + + + +
Verification Date:{{ verification.verification_date }}
Response Time:{{ verification.response_time }}
Status: + + {{ verification.status|title }} + +
+
+
+
+
+
+
+ + {% if verification.status == 'verified' %} + +
+
+
+
+
+ Policy Holder Information +
+
+
+ + + + + + + + + + + + + + + + + +
Name:{{ verification.policy_holder.name }}
Date of Birth:{{ verification.policy_holder.dob }}
Member ID:{{ verification.policy_holder.member_id }}
Relationship:{{ verification.policy_holder.relationship|title }}
+
+
+
+ +
+
+
+
+ Coverage Details +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Plan Name:{{ verification.coverage_details.plan_name }}
Plan Type:{{ verification.coverage_details.plan_type }}
Effective Date:{{ verification.coverage_details.effective_date }}
Expiration Date:{{ verification.coverage_details.expiration_date }}
Group Number:{{ verification.coverage_details.group_number }}
Network:{{ verification.coverage_details.network }}
+
+
+
+
+ + +
+
+
+
+
+ Financial Benefits +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Deductible:${{ verification.benefits.deductible|floatformat:0 }}
Out-of-Pocket Max:${{ verification.benefits.out_of_pocket_max|floatformat:0 }}
Primary Care Copay:${{ verification.benefits.copay_primary }}
Specialist Copay:${{ verification.benefits.copay_specialist }}
Coinsurance:{{ verification.benefits.coinsurance }}%
+
+
+
+ +
+
+
+
+ Authorization Requirements +
+
+
+
+
+
+ Prior Authorization Required: + + {% if verification.authorization.prior_auth_required %}Yes{% else %}No{% endif %} + +
+
+
+
+ Referral Required: + + {% if verification.authorization.referral_required %}Yes{% else %}No{% endif %} + +
+
+
+
+ Pre-certification Required: + + {% if verification.authorization.pre_certification_required %}Yes{% else %}No{% endif %} + +
+
+
+ +
+ +
Additional Coverage:
+
+
+ + Prescription: + + +
+
+ + Dental: + + +
+
+ + Vision: + + +
+
+
+
+
+
+ + +
+
+
+
+
+ Provider Contact Information +
+
+
+
+
+
+ +
Customer Service
+

{{ verification.contact_info.customer_service }}

+
+
+
+
+ +
Provider Services
+

{{ verification.contact_info.provider_services }}

+
+
+ +
+
+ +
Claims Address
+

{{ verification.contact_info.claims_address }}

+
+
+
+
+
+
+
+ + {% elif verification.status == 'not_found' %} + +
+
+
+
+ +
+
+
Policy Not Found
+

{{ verification.error_details.message }}

+
+
Suggestions:
+
    + {% for suggestion in verification.error_details.suggestions %} +
  • {{ suggestion }}
  • + {% endfor %} +
+
+
+
+
+ + {% elif verification.status == 'expired' %} + +
+
+
+
+
+ Policy Expired +
+
+
+ + + + + + + + + + + + + + + + + +
Policy Holder:{{ verification.policy_holder.name }}
Member ID:{{ verification.policy_holder.member_id }}
Expired Date:{{ verification.expiration_details.expired_date }}
Days Expired:{{ verification.expiration_details.days_expired }} days
+
+
+
+
+
+
+
+ Renewal Options +
+
+
+
    + {% for option in verification.expiration_details.renewal_options %} +
  • + {{ option }} +
  • + {% endfor %} +
+
+
+
+
+ + {% elif verification.status == 'suspended' %} + +
+
+
+
+ +
+
+
Policy Suspended
+
+
+

Reason: {{ verification.suspension_details.reason }}

+

Suspended Date: {{ verification.suspension_details.suspended_date }}

+
+
+

Reinstatement Required: + {% if verification.suspension_details.reinstatement_required %} + Yes + {% else %} + No + {% endif %} +

+

Contact Provider: + {% if verification.suspension_details.contact_required %} + Required + {% else %} + Not Required + {% endif %} +

+
+
+
+
+
+
+ + {% elif verification.status == 'pending' %} + +
+
+
+
+ +
+
+
Verification Pending
+

Reason: {{ verification.pending_details.reason }}

+

Expected Resolution: {{ verification.pending_details.expected_resolution }}

+

Reference Number: {{ verification.pending_details.reference_number }}

+
+
+
+
+ {% endif %} + + +
+
+
+
+ + +
+
+ {% if verification.status == 'verified' %} + + {% endif %} + +
+
+
+
+
+ + + + + diff --git a/templates/patients/patient_detail.html b/templates/patients/patient_detail.html index 029c926b..69fa1f2f 100644 --- a/templates/patients/patient_detail.html +++ b/templates/patients/patient_detail.html @@ -192,7 +192,7 @@
diff --git a/templates/patients/profiles/patient_detail.html b/templates/patients/profiles/patient_detail.html index 7dff30ee..bb61a0d1 100644 --- a/templates/patients/profiles/patient_detail.html +++ b/templates/patients/profiles/patient_detail.html @@ -15,7 +15,7 @@
- + Edit Profile
- + Schedule Appointment - + New Encounter - + Order Lab Test - + New Prescription
{% endfor %} @@ -318,7 +318,7 @@

No emergency contacts

- + Add Contact
@@ -334,7 +334,7 @@ Insurance Information @@ -352,7 +352,7 @@
{% endfor %} @@ -409,7 +409,7 @@ function addNote() { if (note) { console.log('Adding note:', note); // Redirect to add note page or submit via AJAX - window.location.href = "{% url 'patients:patient_note_form' %}?patient={{ object.pk }}¬e=" + encodeURIComponent(note); + window.location.href = "{% url 'patients:patient_note_create' object.pk %}?patient={{ object.pk }}¬e=" + encodeURIComponent(note); } }