From 9d586a4ed318064cc6c36bc50e686a11fb63261c Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 15 Jan 2026 14:31:54 +0300 Subject: [PATCH] update on the complaint sla and staff hierarchy --- apps/accounts/migrations/0001_initial.py | 4 + apps/accounts/migrations/0002_initial.py | 4 + apps/ai_engine/migrations/0001_initial.py | 4 + apps/analytics/migrations/0001_initial.py | 4 + apps/appreciation/migrations/0001_initial.py | 4 + apps/callcenter/migrations/0001_initial.py | 4 + apps/complaints/forms.py | 19 ++-- apps/complaints/migrations/0001_initial.py | 4 + apps/complaints/migrations/0002_initial.py | 4 + apps/complaints/migrations/0003_initial.py | 4 + apps/complaints/ui_views.py | 88 ++++++++++--------- apps/core/migrations/0001_initial.py | 4 + apps/feedback/migrations/0001_initial.py | 4 + apps/feedback/migrations/0002_initial.py | 4 + apps/feedback/migrations/0003_initial.py | 4 + apps/integrations/migrations/0001_initial.py | 4 + apps/journeys/migrations/0001_initial.py | 4 + apps/journeys/migrations/0002_initial.py | 4 + apps/notifications/migrations/0001_initial.py | 4 + apps/observations/migrations/0001_initial.py | 4 + apps/organizations/migrations/0001_initial.py | 4 + apps/physicians/migrations/0001_initial.py | 4 + apps/projects/migrations/0001_initial.py | 4 + apps/projects/migrations/0002_initial.py | 4 + .../migrations/0001_initial.py | 4 + apps/px_sources/migrations/0001_initial.py | 4 + apps/references/migrations/0001_initial.py | 4 + apps/social/migrations/0001_initial.py | 4 + apps/standards/migrations/0001_initial.py | 4 + apps/surveys/migrations/0001_initial.py | 4 + 30 files changed, 167 insertions(+), 52 deletions(-) diff --git a/apps/accounts/migrations/0001_initial.py b/apps/accounts/migrations/0001_initial.py index 67f5b30..fa18a90 100644 --- a/apps/accounts/migrations/0001_initial.py +++ b/apps/accounts/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.utils.timezone import uuid diff --git a/apps/accounts/migrations/0002_initial.py b/apps/accounts/migrations/0002_initial.py index 3d923a7..1c743f3 100644 --- a/apps/accounts/migrations/0002_initial.py +++ b/apps/accounts/migrations/0002_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/ai_engine/migrations/0001_initial.py b/apps/ai_engine/migrations/0001_initial.py index 3f4e143..bcf1fa6 100644 --- a/apps/ai_engine/migrations/0001_initial.py +++ b/apps/ai_engine/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/analytics/migrations/0001_initial.py b/apps/analytics/migrations/0001_initial.py index 66e3d3d..296208a 100644 --- a/apps/analytics/migrations/0001_initial.py +++ b/apps/analytics/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/appreciation/migrations/0001_initial.py b/apps/appreciation/migrations/0001_initial.py index 572d681..41c2660 100644 --- a/apps/appreciation/migrations/0001_initial.py +++ b/apps/appreciation/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/callcenter/migrations/0001_initial.py b/apps/callcenter/migrations/0001_initial.py index 27f9002..2f3d2a0 100644 --- a/apps/callcenter/migrations/0001_initial.py +++ b/apps/callcenter/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/complaints/forms.py b/apps/complaints/forms.py index 2068471..5e09310 100644 --- a/apps/complaints/forms.py +++ b/apps/complaints/forms.py @@ -318,18 +318,16 @@ class ComplaintForm(forms.ModelForm): user = kwargs.pop('user', None) super().__init__(*args, **kwargs) - # Filter hospital and patient by user permissions + # Filter hospitals and patients based on user permissions if user and not user.is_px_admin() and user.hospital: - self.fields['hospital'].queryset = Hospital.objects.filter( - id=user.hospital.id - ) + self.fields['hospital'].queryset = Hospital.objects.filter(id=user.hospital.id) + self.fields['hospital'].initial = user.hospital self.fields['patient'].queryset = Patient.objects.filter( primary_hospital=user.hospital, status='active' ) # Check for hospital selection in both initial data and POST data - # This is needed for validation to work correctly hospital_id = None if 'hospital' in self.data: hospital_id = self.data.get('hospital') @@ -425,11 +423,11 @@ class InquiryForm(forms.ModelForm): user = kwargs.pop('user', None) super().__init__(*args, **kwargs) - # Filter hospital by user permissions + # Filter hospitals based on user role if user and not user.is_px_admin() and user.hospital: - self.fields['hospital'].queryset = Hospital.objects.filter( - id=user.hospital.id - ) + self.fields['hospital'].queryset = Hospital.objects.filter(id=user.hospital.id) + self.fields['hospital'].initial = user.hospital + self.fields['hospital'].widget.attrs['readonly'] = True # Check for hospital selection in both initial data and POST data hospital_id = None @@ -446,9 +444,6 @@ class InquiryForm(forms.ModelForm): ).order_by('name') - - - class SLAConfigForm(forms.ModelForm): """Form for creating and editing SLA configurations""" diff --git a/apps/complaints/migrations/0001_initial.py b/apps/complaints/migrations/0001_initial.py index 6eec7ce..b8a50bd 100644 --- a/apps/complaints/migrations/0001_initial.py +++ b/apps/complaints/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/complaints/migrations/0002_initial.py b/apps/complaints/migrations/0002_initial.py index 78f119d..6cb6bdb 100644 --- a/apps/complaints/migrations/0002_initial.py +++ b/apps/complaints/migrations/0002_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/complaints/migrations/0003_initial.py b/apps/complaints/migrations/0003_initial.py index b38faa2..40caf5f 100644 --- a/apps/complaints/migrations/0003_initial.py +++ b/apps/complaints/migrations/0003_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/complaints/ui_views.py b/apps/complaints/ui_views.py index 1a38508..a0876d2 100644 --- a/apps/complaints/ui_views.py +++ b/apps/complaints/ui_views.py @@ -1,6 +1,7 @@ """ Complaints UI views - Server-rendered templates for complaints console """ + from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator @@ -241,6 +242,16 @@ def complaint_detail(request, pk): explanation_attachments = explanation.attachments.all() context = { + 'complaint': complaint, + 'timeline': timeline, + 'attachments': attachments, + 'px_actions': px_actions, + 'assignable_users': assignable_users, + 'status_choices': ComplaintStatus.choices, + 'can_edit': user.is_px_admin() or user.is_hospital_admin(), + 'hospital_departments': hospital_departments, + 'base_layout': base_layout, + 'source_user': source_user, "complaint": complaint, "timeline": timeline, "attachments": attachments, @@ -249,8 +260,6 @@ def complaint_detail(request, pk): "status_choices": ComplaintStatus.choices, "can_edit": user.is_px_admin() or user.is_hospital_admin(), "hospital_departments": hospital_departments, - 'base_layout': base_layout, - 'source_user': source_user, "explanation": explanation, "explanations": explanations, "explanation_attachments": explanation_attachments, @@ -390,7 +399,8 @@ def complaint_create(request): user=request.user, content_object=complaint, metadata={ - # "category": category.name_en, + 'severity': complaint.severity, + "category": category.name_en, "severity": complaint.severity, "patient_mrn": complaint.patient.mrn if complaint.patient else None, "ai_analysis_pending": True, @@ -406,9 +416,6 @@ def complaint_create(request): except ComplaintCategory.DoesNotExist: messages.error(request, "Selected category not found.") return redirect("complaints:complaint_create") - except Exception as e: - messages.error(request, f"Error creating complaint: {str(e)}") - return redirect("complaints:complaint_create") # GET request - show form # Check for hospital parameter from URL (for pre-selection) @@ -1035,36 +1042,40 @@ def inquiry_create(request): from .models import Inquiry from .forms import InquiryForm from apps.organizations.models import Patient - from apps.px_sources.models import SourceUser, PXSource - - # Determine base layout based on user type - source_user = SourceUser.objects.filter(user=request.user).first() - base_layout = 'layouts/source_user_base.html' if source_user else 'layouts/base.html' - - if request.method == 'POST': - # Handle form submission - form = InquiryForm(request.POST, user=request.user) - - if not form.is_valid(): - messages.error(request, f"Please correct the errors: {form.errors}") - context = { - 'form': form, - 'base_layout': base_layout, - 'source_user': source_user, - } - return render(request, 'complaints/inquiry_form.html', context) - + + if request.method == "POST": try: - # Save inquiry - inquiry = form.save(commit=False) - - # Set source for source users - source_user = SourceUser.objects.filter(user=request.user).first() - if source_user: - inquiry.source = source_user.source - inquiry.created_by = request.user - - inquiry.save() + # Get form data + patient_id = request.POST.get("patient_id", None) + hospital_id = request.POST.get("hospital_id") + department_id = request.POST.get("department_id", None) + + subject = request.POST.get("subject") + message = request.POST.get("message") + category = request.POST.get("category") + + # Contact info (if no patient) + contact_name = request.POST.get("contact_name", "") + contact_phone = request.POST.get("contact_phone", "") + contact_email = request.POST.get("contact_email", "") + + # Validate required fields + if not all([hospital_id, subject, message, category]): + messages.error(request, "Please fill in all required fields.") + return redirect("complaints:inquiry_create") + + # Create inquiry + inquiry = Inquiry.objects.create( + patient_id=patient_id if patient_id else None, + hospital_id=hospital_id, + department_id=department_id if department_id else None, + subject=subject, + message=message, + category=category, + contact_name=contact_name, + contact_phone=contact_phone, + contact_email=contact_email, + ) # Log audit AuditService.log_event( @@ -1083,15 +1094,12 @@ def inquiry_create(request): return redirect("complaints:inquiry_create") # GET request - show form - form = InquiryForm(user=request.user) - hospitals = Hospital.objects.filter(status='active') + hospitals = Hospital.objects.filter(status="active") if not request.user.is_px_admin() and request.user.hospital: hospitals = hospitals.filter(id=request.user.hospital.id) context = { - 'form': form, - 'base_layout': base_layout, - 'source_user': source_user, + "hospitals": hospitals, } return render(request, "complaints/inquiry_form.html", context) diff --git a/apps/core/migrations/0001_initial.py b/apps/core/migrations/0001_initial.py index 7fae5e7..d4b7acc 100644 --- a/apps/core/migrations/0001_initial.py +++ b/apps/core/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/feedback/migrations/0001_initial.py b/apps/feedback/migrations/0001_initial.py index 24eebd5..5d70bc5 100644 --- a/apps/feedback/migrations/0001_initial.py +++ b/apps/feedback/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/feedback/migrations/0002_initial.py b/apps/feedback/migrations/0002_initial.py index 7a12514..73a5436 100644 --- a/apps/feedback/migrations/0002_initial.py +++ b/apps/feedback/migrations/0002_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/feedback/migrations/0003_initial.py b/apps/feedback/migrations/0003_initial.py index b86ab6a..b4ca1c2 100644 --- a/apps/feedback/migrations/0003_initial.py +++ b/apps/feedback/migrations/0003_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/integrations/migrations/0001_initial.py b/apps/integrations/migrations/0001_initial.py index dc082dc..fbeda59 100644 --- a/apps/integrations/migrations/0001_initial.py +++ b/apps/integrations/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/journeys/migrations/0001_initial.py b/apps/journeys/migrations/0001_initial.py index 07dedf4..10327e9 100644 --- a/apps/journeys/migrations/0001_initial.py +++ b/apps/journeys/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/journeys/migrations/0002_initial.py b/apps/journeys/migrations/0002_initial.py index fb75bfe..132216f 100644 --- a/apps/journeys/migrations/0002_initial.py +++ b/apps/journeys/migrations/0002_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.db import migrations, models diff --git a/apps/notifications/migrations/0001_initial.py b/apps/notifications/migrations/0001_initial.py index 12978eb..7e3295c 100644 --- a/apps/notifications/migrations/0001_initial.py +++ b/apps/notifications/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/observations/migrations/0001_initial.py b/apps/observations/migrations/0001_initial.py index dfaacfd..5ffafdd 100644 --- a/apps/observations/migrations/0001_initial.py +++ b/apps/observations/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import apps.observations.models import django.db.models.deletion diff --git a/apps/organizations/migrations/0001_initial.py b/apps/organizations/migrations/0001_initial.py index 04d519d..26e17de 100644 --- a/apps/organizations/migrations/0001_initial.py +++ b/apps/organizations/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/physicians/migrations/0001_initial.py b/apps/physicians/migrations/0001_initial.py index bba5ef5..79210e7 100644 --- a/apps/physicians/migrations/0001_initial.py +++ b/apps/physicians/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/projects/migrations/0001_initial.py b/apps/projects/migrations/0001_initial.py index de3c36b..9360298 100644 --- a/apps/projects/migrations/0001_initial.py +++ b/apps/projects/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/projects/migrations/0002_initial.py b/apps/projects/migrations/0002_initial.py index 2fe3f6d..46a13cb 100644 --- a/apps/projects/migrations/0002_initial.py +++ b/apps/projects/migrations/0002_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion from django.conf import settings diff --git a/apps/px_action_center/migrations/0001_initial.py b/apps/px_action_center/migrations/0001_initial.py index 57eb05c..6d7ab9b 100644 --- a/apps/px_action_center/migrations/0001_initial.py +++ b/apps/px_action_center/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/px_sources/migrations/0001_initial.py b/apps/px_sources/migrations/0001_initial.py index 94fd2c3..d26085a 100644 --- a/apps/px_sources/migrations/0001_initial.py +++ b/apps/px_sources/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid diff --git a/apps/references/migrations/0001_initial.py b/apps/references/migrations/0001_initial.py index 0059d7a..4fde651 100644 --- a/apps/references/migrations/0001_initial.py +++ b/apps/references/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import apps.references.models import django.db.models.deletion diff --git a/apps/social/migrations/0001_initial.py b/apps/social/migrations/0001_initial.py index ae7f23f..4f9628f 100644 --- a/apps/social/migrations/0001_initial.py +++ b/apps/social/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) from django.db import migrations, models diff --git a/apps/standards/migrations/0001_initial.py b/apps/standards/migrations/0001_initial.py index 5150aac..02f5065 100644 --- a/apps/standards/migrations/0001_initial.py +++ b/apps/standards/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.core.validators import django.db.models.deletion diff --git a/apps/surveys/migrations/0001_initial.py b/apps/surveys/migrations/0001_initial.py index 96193fb..de07dd1 100644 --- a/apps/surveys/migrations/0001_initial.py +++ b/apps/surveys/migrations/0001_initial.py @@ -1,4 +1,8 @@ +<<<<<<< HEAD # Generated by Django 6.0 on 2026-01-12 09:50 +======= +# Generated by Django 6.0.1 on 2026-01-12 09:50 +>>>>>>> 1f9d8a7 (update on the complaint sla and staff hierarchy) import django.db.models.deletion import uuid