From f2e823c5c3f9ded548ce5c604d2670da22ec6ccb Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Thu, 6 Nov 2025 15:28:37 +0300 Subject: [PATCH] update --- db.sqlite3 | Bin 8691712 -> 8699904 bytes logs/django.log | 231 ++++++++++++++++++ referrals/__pycache__/views.cpython-312.pyc | Bin 31310 -> 30231 bytes .../referrals/external_referral_form.html | 8 + referrals/views.py | 111 +++------ 5 files changed, 278 insertions(+), 72 deletions(-) diff --git a/db.sqlite3 b/db.sqlite3 index be4b60755c80da58742ac1b8cf876207174117c8..93a9a57f10be63ae958f589ba01c0c21706a045e 100644 GIT binary patch delta 2039 zcmdtj?@t?b90%|_dM*8Rcl>6vLfd0g!L{67d;O&YN;z1il!{OR6^=q1WKU{%Ao=(p$e*D5A1~}zyVJ}4b*}YT-xegcca^9BnX0J zAK}-WU>{k(w4}`jlSb4TN6BvtPLv7aywzOQ6^%L^G=13Vj7HTHMlN2lxhKIN5e2U= z$V;N6{$%802V>n`sf64sx9!|K1`3ilz>B_c;IV(!r|^fuYWAMdt%giohMltJmn~mk zmWZl97HwZvhzNo=6!e9{g1XPZHFLWys}J<6%im(|cMV*IB8Z~cl?AS)NV8L1AE{k6 zaWM<7g}KxET?t2iR>K$w8$D0Z^K3i2!d#s%|Dzd;_0Ix}7D(*FH{v$!^+Ay_qn&F2Fl+z`8hkc~T{k$;$6v>v38ZKT2E zX7rM|P%FhH->MaYs^l=|wr$HO)jlhEdBKW`$5(FR!AqYbRo`dJ%AT&WUv_KSE zAqH(ALpyZ9A&A2Z&0k6YRI0ln21#iG{n1&ND1GDfZoP<*_2lKE1r{OJl8{UC4a2C!%2C}dS=e3(n z7Xl+b8Xe9`)DebI^JBgsez~;3{amtmoYXtJ!-*DqjoIE}rHJVB z@?t0)EOhor{l=lvPoDnd7v64yK3-6>XH9N3!*UtTMsevvfBmNzM~qBsUo%_}`N=I4 zWg_V%f?mpZtTS}kg*n?^wELRUc$Up}IPjjibdgK#!P$}WogRIj=LNaHSMEth6WzV) lEt0EM?Id@3*Y}MS;r-sQ!1F%ov7m(+Lt)9MUM0D;{{ZG;W;Or- delta 1270 zcmZ|NO>7ip7zgl~-I?vqZfD*tYq!*K+u65*QfNCfZTCxQyWQQEE#2)>x3yJVrq#9x zR-m-?1BDiuaKQvL_+Cu#z)6iaGK3K5nQ*C?5J^NYBpeJWH@%4eC9tB2ll+p&%$w)` zJa3+rl`n;rwJ(ITsuSlMFVYKN{&A>l1X>_-D>QO!F^xcu?gx2bLJ=SIF z|93uN#^a~g@5-P6fdJIOCJ4fFP!Az!fX&bd&w~mtKp2{!88m18Zloj9By$|+=N38T zTY0RO^L;0cd)*#Kv;@D);TBnBgC7@8_4yl}7B}s4kv+apK9vfpvOLoq<~X*-(;V~N zY*ai(%!tLiSlC5-y{U9MTP$TW?BV=kgni?pC)_7TCH8}lhMZ#}-N|n*c`J3)$8}VW zlVv$yc{uh<6V=Y|r5YQ$eEe}yT-N!sG+k577BacQAX~jJM%a&c#Aa6H>6CNXL(>xb zZL3H8sz|+#H$eZqfW|n#;^xRLGC(dWR}@{jueeErQdT}EOHN%txF<91dPrnzi3P3p zNo9YVkPoxenQ}yW+P{yLuh9-+hmcpDbJu7;FXA;Uu_K3SH0O`&RMM(Z11Num+^Pg1 ztgPq=c0U{C+DHErRfkEQje1axdhkya|EovaQthWQ7?C&T46ivfHr7{ z4$#2>6FQ*_x*-ZNh(iLB@Cv*NJD~@9p$}5f4{69i76xDtc0mq?U^fgy9tto5Mc4zQ z@EVk0494Mgn1D%m1Kxza@D`L|A6PI2)9^OD12ZrSbFd%Yg#&O9-h+8~9}dA`I06fB l6c%9#mf-{V5I%yB;TU`ZpTcoC0V}WyC*d>aM$f6})ZYopxO4yj diff --git a/logs/django.log b/logs/django.log index 76bd2413..b5615082 100644 --- a/logs/django.log +++ b/logs/django.log @@ -84991,3 +84991,234 @@ WARNING 2025-11-06 14:52:05,540 basehttp 82325 6214938624 "GET /.well-known/apps WARNING 2025-11-06 14:52:05,553 log 82325 6214938624 Not Found: /.well-known/appspecific/com.chrome.devtools.json WARNING 2025-11-06 14:52:05,553 basehttp 82325 6214938624 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 3165 INFO 2025-11-06 14:52:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:52:41,295 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 14:52:43,512 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +ERROR 2025-11-06 14:52:53,550 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 14:53:11,300 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:53:41,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:54:11,292 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 14:54:31,096 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 14:54:41,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:55:11,300 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:55:41,300 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 14:55:43,882 tasks 76869 8426217792 Appointment 69dcd286-66b4-4619-9870-fda6fe206ff3 not found +INFO 2025-11-06 14:56:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:56:41,293 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:57:11,301 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 14:57:25,814 tasks 76869 8426217792 Appointment 36b67a10-fe1e-41a7-8f62-0b0ca127c128 not found +INFO 2025-11-06 14:57:41,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:58:11,294 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:58:41,300 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:59:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 14:59:41,301 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:00:00,008 tasks 76869 8426217792 Radiology results sync started +INFO 2025-11-06 15:00:00,008 tasks 76869 8426217792 Radiology results sync completed: {'status': 'success', 'new_studies': 0, 'new_reports': 0, 'errors': 0, 'timestamp': '2025-11-06 12:00:00.008395+00:00'} +INFO 2025-11-06 15:00:00,013 tasks 76869 8426217792 Lab results sync started +INFO 2025-11-06 15:00:00,013 tasks 76869 8426217792 Lab results sync completed: {'status': 'success', 'new_results': 0, 'updated_results': 0, 'errors': 0, 'timestamp': '2025-11-06 12:00:00.013443+00:00'} +INFO 2025-11-06 15:00:11,295 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:00:41,301 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:01:11,301 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:01:41,302 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:02:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:02:41,298 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:03:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:03:32,068 tasks 76869 8426217792 Appointment f10d4cf7-f909-486f-bc21-6b5ff87374c7 not found +INFO 2025-11-06 15:03:41,300 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:04:11,154 tasks 76869 8426217792 Appointment f10d4cf7-f909-486f-bc21-6b5ff87374c7 not found +INFO 2025-11-06 15:04:11,289 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:04:41,301 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:05:11,299 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:05:41,298 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:05:51,656 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 15:05:52,338 basehttp 82325 6214938624 "GET /en/notifications/api/dropdown/ HTTP/1.1" 200 1005 +INFO 2025-11-06 15:06:08,956 basehttp 82325 6214938624 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31609 +INFO 2025-11-06 15:06:08,992 basehttp 82325 6214938624 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:06:15,806 log 82325 6214938624 Internal Server Error: /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ +Traceback (most recent call last): + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.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/AgdarCentre/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 105, in view + return self.dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 73, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/contrib/auth/mixins.py", line 135, in dispatch + return super().dispatch(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/views/generic/base.py", line 144, in dispatch + return handler(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 202, in get + return super().get(request, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.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/AgdarCentre/.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/AgdarCentre/.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/AgdarCentre/.venv/lib/python3.12/site-packages/django/views/generic/edit.py", line 108, in get_form_class + return model_forms.modelform_factory(model, fields=self.fields) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.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/AgdarCentre/.venv/lib/python3.12/site-packages/django/forms/models.py", line 334, in __new__ + raise FieldError(message) +django.core.exceptions.FieldError: Unknown field(s) (completion_notes) specified for Referral +ERROR 2025-11-06 15:06:15,807 basehttp 82325 6214938624 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ HTTP/1.1" 500 119631 +WARNING 2025-11-06 15:06:15,840 log 82325 6214938624 Not Found: /favicon.ico +WARNING 2025-11-06 15:06:15,840 basehttp 82325 6214938624 "GET /favicon.ico HTTP/1.1" 404 3054 +INFO 2025-11-06 15:06:54,510 autoreload 82325 8426217792 /Users/marwanalwali/AgdarCentre/referrals/views.py changed, reloading. +INFO 2025-11-06 15:06:54,935 autoreload 90704 8426217792 Watching for file changes with StatReloader +ERROR 2025-11-06 15:07:07,858 log 90704 6202109952 Internal Server Error: /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ +Traceback (most recent call last): + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 90, in rendered_content + template = self.resolve_template(self.template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 72, in resolve_template + return select_template(template, using=self.using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader.py", line 47, in select_template + raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain) +django.template.exceptions.TemplateDoesNotExist: referrals/referral_complete.html +ERROR 2025-11-06 15:07:07,858 basehttp 90704 6202109952 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ HTTP/1.1" 500 94029 +ERROR 2025-11-06 15:07:25,201 tasks 76869 8426217792 Appointment f10d4cf7-f909-486f-bc21-6b5ff87374c7 not found +INFO 2025-11-06 15:07:50,027 autoreload 90704 8426217792 /Users/marwanalwali/AgdarCentre/referrals/views.py changed, reloading. +INFO 2025-11-06 15:07:50,303 autoreload 91192 8426217792 Watching for file changes with StatReloader +INFO 2025-11-06 15:08:03,872 basehttp 91192 6171914240 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ HTTP/1.1" 200 36263 +INFO 2025-11-06 15:08:03,884 basehttp 91192 6171914240 "GET /static/plugins/select2/css/select2.min.css HTTP/1.1" 200 16263 +INFO 2025-11-06 15:08:03,885 basehttp 91192 6188740608 "GET /static/plugins/select2/dist/js/select2.min.js HTTP/1.1" 200 70851 +INFO 2025-11-06 15:08:03,905 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:08:19,489 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:08:20,634 basehttp 91192 6188740608 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31609 +INFO 2025-11-06 15:08:20,667 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:08:22,399 basehttp 91192 6188740608 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ HTTP/1.1" 200 36263 +INFO 2025-11-06 15:08:22,435 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:08:22,765 tasks 76869 8426217792 Appointment f10d4cf7-f909-486f-bc21-6b5ff87374c7 not found +ERROR 2025-11-06 15:08:41,238 tasks 76869 8426217792 Appointment b0c611dd-314f-4f02-8011-ac5519bdd525 not found +INFO 2025-11-06 15:08:50,677 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:09:20,680 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:09:45,707 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 15:09:50,681 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:10:20,668 basehttp 91192 6188740608 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:10:41,026 autoreload 91192 8426217792 /Users/marwanalwali/AgdarCentre/referrals/views.py changed, reloading. +INFO 2025-11-06 15:10:41,369 autoreload 92576 8426217792 Watching for file changes with StatReloader +ERROR 2025-11-06 15:10:47,597 tasks 70301 8426217792 Appointment b7386e99-0cbb-420c-9fa8-13a2200e5715 not found +ERROR 2025-11-06 15:10:47,597 tasks 76869 8426217792 Appointment b5a77fcd-5a4b-4e96-9a68-fd3018073de1 not found +INFO 2025-11-06 15:10:50,675 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:05,674 basehttp 92576 6127595520 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31609 +INFO 2025-11-06 15:11:05,711 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:06,651 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:07,329 basehttp 92576 6127595520 "GET /en/referrals/ HTTP/1.1" 200 60832 +INFO 2025-11-06 15:11:07,368 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:10,699 basehttp 92576 6127595520 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31609 +INFO 2025-11-06 15:11:10,726 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:11,875 basehttp 92576 6127595520 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/complete/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:11:11,884 basehttp 92576 6127595520 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31768 +INFO 2025-11-06 15:11:11,914 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:11:18,569 basehttp 92576 6127595520 "GET /en/dashboard/ HTTP/1.1" 200 54259 +INFO 2025-11-06 15:11:18,578 basehttp 92576 6127595520 "GET /static/plugins/apexcharts/dist/apexcharts.min.js HTTP/1.1" 200 574941 +INFO 2025-11-06 15:11:18,592 basehttp 92576 6127595520 "GET /static/css/saudiriyalsymbol.woff2 HTTP/1.1" 200 720 +INFO 2025-11-06 15:11:18,607 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:11:34,554 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 15:11:48,616 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:12:17,369 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:12:29,519 basehttp 92576 6127595520 "GET /en/referrals/a4dcd79c-7eb8-4d89-a723-63b24d5a0fb8/ HTTP/1.1" 200 31448 +INFO 2025-11-06 15:12:30,365 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:12:31,541 basehttp 92576 6127595520 "GET /en/referrals/ HTTP/1.1" 200 60834 +INFO 2025-11-06 15:12:31,579 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:12:35,674 basehttp 92576 6127595520 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/ HTTP/1.1" 200 32014 +INFO 2025-11-06 15:12:35,700 basehttp 92576 6127595520 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +ERROR 2025-11-06 15:12:36,949 log 92576 6127595520 Internal Server Error: /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/accept/ +Traceback (most recent call last): + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 90, in rendered_content + template = self.resolve_template(self.template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 72, in resolve_template + return select_template(template, using=self.using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader.py", line 47, in select_template + raise TemplateDoesNotExist(", ".join(template_name_list), chain=chain) +django.template.exceptions.TemplateDoesNotExist: referrals/referral_accept.html +ERROR 2025-11-06 15:12:36,950 basehttp 92576 6127595520 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/accept/ HTTP/1.1" 500 93768 +INFO 2025-11-06 15:14:05,343 autoreload 92576 8426217792 /Users/marwanalwali/AgdarCentre/referrals/views.py changed, reloading. +INFO 2025-11-06 15:14:05,938 autoreload 94289 8426217792 Watching for file changes with StatReloader +INFO 2025-11-06 15:14:15,636 basehttp 94289 6190821376 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/accept/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:14:15,658 basehttp 94289 6190821376 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/ HTTP/1.1" 200 32365 +INFO 2025-11-06 15:14:15,692 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:14:21,372 basehttp 94289 6190821376 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/complete/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:14:21,383 basehttp 94289 6190821376 "GET /en/referrals/038d9aa4-dbce-4fe3-92f5-e9cc4ac9cb11/ HTTP/1.1" 200 32202 +INFO 2025-11-06 15:14:21,415 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:14:36,134 basehttp 94289 6190821376 "GET /en/referrals/ HTTP/1.1" 200 60610 +INFO 2025-11-06 15:14:36,167 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:14:42,339 basehttp 94289 6190821376 "GET /en/referrals/65e40b91-cfa3-4eb8-97db-1e82392a6169/ HTTP/1.1" 200 31017 +INFO 2025-11-06 15:14:42,368 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:01,526 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/ HTTP/1.1" 200 32042 +INFO 2025-11-06 15:15:01,561 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:04,911 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/accept/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:15:04,921 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/ HTTP/1.1" 200 32393 +INFO 2025-11-06 15:15:04,944 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:11,391 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/complete/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:15:11,406 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/ HTTP/1.1" 200 32230 +INFO 2025-11-06 15:15:11,439 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:13,700 basehttp 94289 6190821376 "GET /en/referrals/0df8ecaa-4174-47cd-9fcf-27969dbfc513/ HTTP/1.1" 200 31910 +INFO 2025-11-06 15:15:14,220 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:16,841 basehttp 94289 6190821376 "GET /en/referrals/ HTTP/1.1" 200 60384 +INFO 2025-11-06 15:15:16,873 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:22,166 basehttp 94289 6190821376 "GET /en/referrals/e70c1ace-5ecb-4148-bf42-9c6d8cd6561a/ HTTP/1.1" 200 31614 +INFO 2025-11-06 15:15:22,194 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:23,032 basehttp 94289 6190821376 "GET /en/referrals/e70c1ace-5ecb-4148-bf42-9c6d8cd6561a/complete/ HTTP/1.1" 302 0 +INFO 2025-11-06 15:15:23,048 basehttp 94289 6190821376 "GET /en/referrals/e70c1ace-5ecb-4148-bf42-9c6d8cd6561a/ HTTP/1.1" 200 31773 +INFO 2025-11-06 15:15:23,081 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:25,358 basehttp 94289 6190821376 "GET /en/referrals/e70c1ace-5ecb-4148-bf42-9c6d8cd6561a/ HTTP/1.1" 200 31453 +INFO 2025-11-06 15:15:26,740 basehttp 94289 6190821376 "GET /en/referrals/ HTTP/1.1" 200 60386 +INFO 2025-11-06 15:15:26,776 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:37,808 basehttp 94289 6190821376 "GET /en/referrals/148c8163-7038-4b5b-b737-50138f9171d3/ HTTP/1.1" 200 31036 +INFO 2025-11-06 15:15:37,835 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:50,024 basehttp 94289 6190821376 "GET /en/dashboard/ HTTP/1.1" 200 54259 +INFO 2025-11-06 15:15:50,074 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:53,403 basehttp 94289 6190821376 "GET /en/finance/packages/ HTTP/1.1" 200 36253 +INFO 2025-11-06 15:15:53,429 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:15:57,163 basehttp 94289 6190821376 "GET /en/finance/packages/create/ HTTP/1.1" 200 46283 +INFO 2025-11-06 15:15:57,198 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:16:06,882 basehttp 94289 6190821376 "GET /en/dashboard/ HTTP/1.1" 200 54259 +INFO 2025-11-06 15:16:06,919 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:16:36,933 basehttp 94289 6190821376 "GET /en/notifications/api/unread-count/ HTTP/1.1" 200 19 +INFO 2025-11-06 15:16:38,795 basehttp 94289 6190821376 "GET /en/referrals/external/ HTTP/1.1" 200 12947 +ERROR 2025-11-06 15:16:45,938 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +ERROR 2025-11-06 15:17:58,903 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +INFO 2025-11-06 15:18:24,128 basehttp 94289 6190821376 "GET /en/referrals/external/ HTTP/1.1" 200 13099 +ERROR 2025-11-06 15:18:50,288 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +ERROR 2025-11-06 15:18:50,341 tasks 76869 8426217792 Appointment c60c62dc-20a8-4e2a-85e9-96e82744d880 not found +ERROR 2025-11-06 15:23:14,282 tasks 76869 8426217792 Appointment 236f3e70-6d16-466f-a04f-eaf12cee9ba2 not found +ERROR 2025-11-06 15:23:14,285 tasks 70301 8426217792 Appointment c61467c7-19c0-454f-9b46-9b011f167dbf not found +ERROR 2025-11-06 15:25:43,908 tasks 76869 8426217792 Appointment b0c611dd-314f-4f02-8011-ac5519bdd525 not found +ERROR 2025-11-06 15:27:25,850 tasks 76869 8426217792 Appointment b7386e99-0cbb-420c-9fa8-13a2200e5715 not found +ERROR 2025-11-06 15:27:25,850 tasks 70301 8426217792 Appointment b5a77fcd-5a4b-4e96-9a68-fd3018073de1 not found diff --git a/referrals/__pycache__/views.cpython-312.pyc b/referrals/__pycache__/views.cpython-312.pyc index 59102880d4565ae435c3b192428e52971c610eea..f40e488e01add23bb77b0b42c2fc67d872535a45 100644 GIT binary patch delta 3803 zcmeHKdrVVj6u)0zT&1NzTWJAD6&0&Ohk&5d3DWvPJ1lWRF|tZ8wFtC+y@+;Q_VN$S z*nFHUnk9RfZHhuv(#_#xQ@5FEW~7ihmWH`UFnh#hGKpC-XZC%4`Iv$+GydZZ{Bpi? z&pqGcoc`|bo*zOxFQbI7WwOx>xun~rj=!q6C#cbHoms1qIF(bkOJEyHiC71smhT*D z&qe!u8}fdapf;$RH31#;y*A4zh;JilFi&A0jLTF&ae+Ds@2BIf6b@3T1++{f>7Zr@ z%$V~!>Hz&jjWQiE%ua@5EXc-K1U6(5aw2dgtKf=GA&8jUv@z3_6En->VrF+q%xqLC zrr0GGsZFqnvB+#ff(aW%I&m=B%++xiTN_GhYdIJHtb=Ruyb3etn%9~+n*(#Tyq0%r zZ5(fPG-zE`JEv`N@N2a0W)kjpYa0m==V&dtY6WB$(MwDWIr+bOjd*u5JlRk9;$u-> zp$%z>(~F>FlnSO!S0r=@+J)h;7ernWtkWw6ya3+KPKQ5qN+>TA3$uASBr4O>y~rkP zkEB8juZU!4Z1lO8TsX_B$eh#63Ya~w@Ybx7=wl;h4XBe2e*>V;|~ddzqG!}lMyXxEF@a4y5@$4jpKAFm{td;Q+S%f4hne` zI0_C5w0J==X$>dF66$CLk0~AAFvyibDdyZRXOoSy)mZtU$ZcKE!7)R|i@~@^U+fcO z6Mbe5O(L>lyBjysv6q0GPEPwpi_O%xn1E+Ybj>&0FvrgEW#ri041t%J0mXz5Di2NS zQg%)|+47b5l(%nzrDuU9ps3!=UXd_T<<_}iFls6a{S%f3q^5pFnm@g;YvGBqBV_@_ zLcet35An%cXK$IktEewc-;<{Ajn^Mq@X3bx%YMEsHXfZX6`4KQ{7TS>KKPk1-oegy%OP7d!`R4_49 zPDx@;m?Y@I;NuilM+3trc9;$+6q77hR}y0rGboUV*((Xmm{cfVwjgng*odw^DHO{> z`SIaLL@H*ko-jy=RGx?GMdsRJN#!w_JTfxDp+enBCR(_@RF1kpYARaniM=TZ3(=~Q z;QMD1e1!IFj7M@MN9p(&95aop3C6Wpag(FTjz1&L;pyRKLs5F5ZAM1 z>tS_mlLKttZLBaOz!u(>6*9--Q}k3qzxL1RQPB5WlqS!>it_xVRbrFnC5gB1izIYaA(D6|AT9sDq(gN;x{^qTvF5y<)V$4XtGxdK zG(<^&o%aB2(G69W!laMymo2(!5$;eK=ctduj@#MdoUgN*7bNeYx91ZGit8NM&EvgL zxT+@ZOM2St7U{yQ3ek;3;BsNyu?0fIU~Sbh$`^}6-w0=Vsk zl3!`a1>YfiHi{plb^(Py;g>ZYRcv1T4Rwaw2U;8kbP0|-YQ*?c;)V(Jdi5oG|0;nX zs=?RjU^<1%u(rM&_4WUf-w3(H(TqPf1jbti@B2n_MF&>qk?8^!npi2+Zu9WD0#)ZB`Y z!RKt5iO}D$Z$q&v^tBffaUn(y9ds|;*pM}PDmgv!$GDZC-?-l}3CaALss8L@|GWzS e@~R<*IEKt<7Uq8=pSngj@9f=05C+A;$)%HjL delta 4058 zcmeH~e@q+a8OQIn@ei;K1{>_m#yJ96W)e(j954h@5(kP1kQ9ehv(h@ocMveYa(A?w z$JVUPq@X0rl1E#*?vF03y3o-k%e+jbTN~OxBK22fH|{`IHf3rnb=oG8Hk+z0llDHg z&(J`kuG^$d>Ir>$-shh8p1b#X{ki8(|CwC5N%G$?81fi;v>(+EI07g0tz_ZCx?ZBO z^A0|LS_9uDmbDoh!x+ZzQZV;1oc%DvmGTPS#%In(FO%sS;*1KL{-P#lVSht~`Wy|9 z*dXSyM9(xh6}q!@EJ!F*Kw3BGo<;Kn$~m}F;ZRSbISm_|j+1GaZC#~kCh%5{HNT(u z)tu6=;d1<1J{M}L&G5X&tjL%P%~|ug+G3JEA6uKTPSwdSqtD#Xul5&ms>6)G=m^tC zIQ3zz-^6L?*nEWf8u1tV7^gN_)Xn$tf)E_q77FoW(%u37k;o(z+}r)=HjZNjUK|@8 z5qWlGRN}=vmL64X&lne!cvh5x(zwVw3p{taXb`)4sR}WdXCx_Z_L%tO94E`i(+707`h)m@>Jw180P!r zG&4aU=rqH5wF*AmXM&AZ9fV8FFt&x-?J8xRq=SNzq^C*eUDsW5FZ45ye- z3>L|w#sAMK;~M1b#^Ez}1K%{xDxBuAe1uOQzihxyC0N`q{K*Vb>Hqq+|YLsIrTcNOg4V?GpI)u}7oHS%>j9Wq2f-z4}fj7OY zP0y-?E_6JJGJ*0VaQLmY7!WCytG%SGeWSu~;NjrV0M|pGL;QrseSCyEST zw{`9p%$Mvl_PP4@czyd^{jPZZu7vM_Ip4mxZ{M7+H}30wyT13D-h85Kvg?UVf`=0N z!14q)p>l5?TtofC3ZRM0Fp>O-ybX7{1a`I0(#d2@GxMP>clJxY}!l~TC)zd)C6 zevl8P>2eeb+hn?+b6|9YawaH_j@*ea-7W1cUYRe#ujneQ2o)ifBMp@-*65`%3D3Dg zbP2Nu_&wjUE#B1aWckh)WcjzqB3BH_!Wy$B5RTFU2s3bNdpTG-inGYE2?coKMU)lD zV~0~6#YO~=@N1MbZs7TjGKKIG9BeS%hL$CDT|~)XgA4dsjy$d zb?8Nzr6S_%jAeyxbXBo~KuPsS1xq%{r#qx%DO}%Mn&Flw z)e>bJVDFO6>RKe%ODmGg1Q&Y>m>Y%1zN-$#n%T@2xZb_H&Z!N{U>sVGU5G?no{+W+=mssTMn?%`1@W zwdi9HNQ$Co@KUW*lB&J|L6n4_g4Q1(??(^#Yc=F*^r@hptht6kzeD*w$|)*c!n;(R ziqt@O7vAc9m?U6Fs80O>h9sij4pkA|0@|BVZomu|Db8jS-a%)2(?J`*gS-dF`9N+` zllk(28+^6(J&gH~N|FSGzvAE?ls|!|Z#VfUI@xzaNp8V620f$)emN*XWN;nq3KtPS z^oE`Ei}hG|t@;+u_y?|9UK~x7Ymf|kNgNzQe<1sRF+8gzFTyKh4dfZPHP)g|<^+X) z5n2!SlW_Fh!DEE*(Jf*5b{5iRg{>1X%V u5JPO$`dC%-Y}LGV{gnTvl6r0)Ab0cIs$$jKXFKO@uAk>+;^B|uu73h<28LGv diff --git a/referrals/templates/referrals/external_referral_form.html b/referrals/templates/referrals/external_referral_form.html index 9389f95a..c5648db2 100644 --- a/referrals/templates/referrals/external_referral_form.html +++ b/referrals/templates/referrals/external_referral_form.html @@ -34,6 +34,11 @@ margin-bottom: 20px; text-align: center; } + .page-header .tenant-logo { + max-width: 150px; + max-height: 80px; + margin-bottom: 15px; + } .page-header h1 { margin: 0; font-size: 2rem; @@ -78,6 +83,9 @@
diff --git a/referrals/views.py b/referrals/views.py index f24d8994..8a7e9e59 100644 --- a/referrals/views.py +++ b/referrals/views.py @@ -317,51 +317,40 @@ class ReferralUpdateView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMi return context -class ReferralAcceptView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, - SuccessMessageMixin, UpdateView): +class ReferralAcceptView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMixin, View): """ Accept referral view. Features: - Accept pending referral - - Add response notes - - Update status to ACCEPTED + - Redirect to detail page with success message """ - model = Referral - fields = ['response_notes'] - template_name = 'referrals/referral_accept.html' - success_message = "Referral accepted successfully!" allowed_roles = [User.Role.ADMIN, User.Role.DOCTOR, User.Role.NURSE, User.Role.OT, User.Role.SLP, User.Role.ABA] - def get_success_url(self): - """Redirect to referral detail.""" - return reverse_lazy('referrals:referral_detail', kwargs={'pk': self.object.pk}) - - def form_valid(self, form): - """Update status to ACCEPTED.""" - referral = form.instance + def get(self, request, *args, **kwargs): + """Mark referral as accepted.""" + referral = get_object_or_404(Referral, pk=kwargs['pk'], tenant=request.user.tenant) # Check if user can accept if referral.status != Referral.Status.PENDING: - messages.error(self.request, 'Only pending referrals can be accepted.') + messages.error(request, 'Only pending referrals can be accepted.') return redirect('referrals:referral_detail', pk=referral.pk) - if self.request.user != referral.to_provider and self.request.user.role != User.Role.ADMIN: - messages.error(self.request, 'You do not have permission to accept this referral.') + if request.user != referral.to_provider and request.user.role != User.Role.ADMIN: + messages.error(request, 'You do not have permission to accept this referral.') return redirect('referrals:referral_detail', pk=referral.pk) # Update status referral.status = Referral.Status.ACCEPTED - referral.response_date = timezone.now().date() + referral.responded_at = timezone.now() + referral.save() - # Save - response = super().form_valid(form) - - # Send notification to referrer + # Send notification to referrer (TODO) self._send_acceptance_notification(referral) - return response + messages.success(request, 'Referral accepted successfully!') + return redirect('referrals:referral_detail', pk=referral.pk) def _send_acceptance_notification(self, referral): """Send notification to referrer.""" @@ -369,51 +358,40 @@ class ReferralAcceptView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, pass -class ReferralRejectView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, - SuccessMessageMixin, UpdateView): +class ReferralRejectView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMixin, View): """ Reject referral view. Features: - Reject pending referral - - Add rejection reason - - Update status to REJECTED + - Redirect to detail page with message """ - model = Referral - fields = ['response_notes'] - template_name = 'referrals/referral_reject.html' - success_message = "Referral rejected." allowed_roles = [User.Role.ADMIN, User.Role.DOCTOR, User.Role.NURSE, User.Role.OT, User.Role.SLP, User.Role.ABA] - def get_success_url(self): - """Redirect to referral detail.""" - return reverse_lazy('referrals:referral_detail', kwargs={'pk': self.object.pk}) - - def form_valid(self, form): - """Update status to REJECTED.""" - referral = form.instance + def get(self, request, *args, **kwargs): + """Mark referral as rejected.""" + referral = get_object_or_404(Referral, pk=kwargs['pk'], tenant=request.user.tenant) # Check if user can reject if referral.status != Referral.Status.PENDING: - messages.error(self.request, 'Only pending referrals can be rejected.') + messages.error(request, 'Only pending referrals can be rejected.') return redirect('referrals:referral_detail', pk=referral.pk) - if self.request.user != referral.to_provider and self.request.user.role != User.Role.ADMIN: - messages.error(self.request, 'You do not have permission to reject this referral.') + if request.user != referral.to_provider and request.user.role != User.Role.ADMIN: + messages.error(request, 'You do not have permission to reject this referral.') return redirect('referrals:referral_detail', pk=referral.pk) # Update status referral.status = Referral.Status.REJECTED - referral.response_date = timezone.now().date() + referral.responded_at = timezone.now() + referral.save() - # Save - response = super().form_valid(form) - - # Send notification to referrer + # Send notification to referrer (TODO) self._send_rejection_notification(referral) - return response + messages.warning(request, 'Referral rejected.') + return redirect('referrals:referral_detail', pk=referral.pk) def _send_rejection_notification(self, referral): """Send notification to referrer.""" @@ -421,51 +399,40 @@ class ReferralRejectView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, pass -class ReferralCompleteView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, - SuccessMessageMixin, UpdateView): +class ReferralCompleteView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMixin, View): """ Complete referral view. Features: - Mark accepted referral as completed - - Add completion notes - - Update status to COMPLETED + - Redirect to detail page with success message """ - model = Referral - fields = ['completion_notes'] - template_name = 'referrals/referral_complete.html' - success_message = "Referral marked as completed!" allowed_roles = [User.Role.ADMIN, User.Role.DOCTOR, User.Role.NURSE, User.Role.OT, User.Role.SLP, User.Role.ABA] - def get_success_url(self): - """Redirect to referral detail.""" - return reverse_lazy('referrals:referral_detail', kwargs={'pk': self.object.pk}) - - def form_valid(self, form): - """Update status to COMPLETED.""" - referral = form.instance + def get(self, request, *args, **kwargs): + """Mark referral as completed.""" + referral = get_object_or_404(Referral, pk=kwargs['pk'], tenant=request.user.tenant) # Check if user can complete if referral.status != Referral.Status.ACCEPTED: - messages.error(self.request, 'Only accepted referrals can be completed.') + messages.error(request, 'Only accepted referrals can be completed.') return redirect('referrals:referral_detail', pk=referral.pk) - if self.request.user != referral.to_provider and self.request.user.role != User.Role.ADMIN: - messages.error(self.request, 'You do not have permission to complete this referral.') + if request.user != referral.to_provider and request.user.role != User.Role.ADMIN: + messages.error(request, 'You do not have permission to complete this referral.') return redirect('referrals:referral_detail', pk=referral.pk) # Update status referral.status = Referral.Status.COMPLETED - referral.completion_date = timezone.now().date() + referral.completed_at = timezone.now() + referral.save() - # Save - response = super().form_valid(form) - - # Send notification to referrer + # Send notification to referrer (TODO) self._send_completion_notification(referral) - return response + messages.success(request, 'Referral marked as completed!') + return redirect('referrals:referral_detail', pk=referral.pk) def _send_completion_notification(self, referral): """Send notification to referrer."""