208 lines
7.2 KiB
Python
208 lines
7.2 KiB
Python
"""
|
|
Integrations UI Views
|
|
"""
|
|
|
|
from rest_framework import viewsets, status
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from django.shortcuts import render, redirect
|
|
from django.contrib import messages
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from .models import SurveyTemplateMapping
|
|
from .serializers import SurveyTemplateMappingSerializer
|
|
|
|
|
|
class SurveyTemplateMappingViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
ViewSet for managing survey template mappings.
|
|
|
|
Provides CRUD operations for mapping patient types to survey templates.
|
|
"""
|
|
|
|
queryset = SurveyTemplateMapping.objects.select_related("hospital", "survey_template").all()
|
|
serializer_class = SurveyTemplateMappingSerializer
|
|
filterset_fields = ["hospital", "patient_type", "is_active"]
|
|
search_fields = ["hospital__name", "patient_type", "survey_template__name"]
|
|
ordering_fields = ["hospital", "patient_type", "is_active"]
|
|
ordering = ["hospital", "patient_type", "is_active"]
|
|
|
|
def get_queryset(self):
|
|
"""
|
|
Filter mappings by user's accessible hospitals.
|
|
"""
|
|
queryset = super().get_queryset()
|
|
user = self.request.user
|
|
|
|
# Superusers see all mappings
|
|
if user.is_superuser:
|
|
return queryset
|
|
|
|
# PX Admins filter by session hospital
|
|
if user.is_px_admin():
|
|
tenant_hospital = getattr(self.request, "tenant_hospital", None)
|
|
if tenant_hospital:
|
|
return queryset.filter(hospital=tenant_hospital)
|
|
# If no session hospital, show all (for management)
|
|
return queryset
|
|
|
|
# Hospital users filter by their assigned hospital
|
|
if hasattr(user, "hospital") and user.hospital:
|
|
return queryset.filter(hospital=user.hospital)
|
|
|
|
# User without hospital assignment - no access
|
|
return queryset.none()
|
|
|
|
def perform_create(self, serializer):
|
|
"""Add created_by information"""
|
|
serializer.save()
|
|
|
|
@action(detail=False, methods=["get"])
|
|
def by_hospital(self, request):
|
|
"""
|
|
Get all mappings for a specific hospital.
|
|
|
|
Query param: hospital_id
|
|
"""
|
|
hospital_id = request.query_params.get("hospital_id")
|
|
|
|
if not hospital_id:
|
|
return Response({"error": "hospital_id parameter is required"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
mappings = self.get_queryset().filter(hospital_id=hospital_id)
|
|
serializer = self.get_serializer(mappings, many=True)
|
|
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=["get"])
|
|
def by_patient_type(self, request):
|
|
"""
|
|
Get mapping for a specific patient type and hospital.
|
|
|
|
Query params: hospital_id, patient_type_code
|
|
"""
|
|
hospital_id = request.query_params.get("hospital_id")
|
|
patient_type_code = request.query_params.get("patient_type_code")
|
|
|
|
if not hospital_id or not patient_type_code:
|
|
return Response(
|
|
{"error": "hospital_id and patient_type_code parameters are required"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
mapping = SurveyTemplateMapping.get_template_for_patient_type(patient_type_code, hospital_id)
|
|
|
|
if not mapping:
|
|
return Response({"error": "No mapping found"}, status=status.HTTP_404_NOT_FOUND)
|
|
|
|
serializer = self.get_serializer(mapping)
|
|
return Response(serializer.data)
|
|
|
|
@action(detail=False, methods=["post"])
|
|
def bulk_create(self, request):
|
|
"""
|
|
Create multiple mappings at once.
|
|
|
|
Expects: {
|
|
"mappings": [
|
|
{
|
|
"hospital": 1,
|
|
"patient_type_code": "1",
|
|
"patient_type_name": "Inpatient",
|
|
"survey_template": 1,
|
|
"priority": 1
|
|
},
|
|
...
|
|
]
|
|
}
|
|
"""
|
|
mappings_data = request.data.get("mappings", [])
|
|
|
|
if not mappings_data:
|
|
return Response({"error": "mappings array is required"}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
created_mappings = []
|
|
for mapping_data in mappings_data:
|
|
serializer = self.get_serializer(data=mapping_data)
|
|
if serializer.is_valid():
|
|
serializer.save()
|
|
created_mappings.append(serializer.data)
|
|
|
|
return Response(
|
|
{"created": len(created_mappings), "mappings": created_mappings}, status=status.HTTP_201_CREATED
|
|
)
|
|
|
|
|
|
def survey_mapping_settings(request):
|
|
"""
|
|
Survey mapping settings page.
|
|
|
|
Allows administrators to configure which survey templates
|
|
are sent for each patient type at each hospital.
|
|
"""
|
|
from apps.organizations.models import Hospital
|
|
|
|
user = request.user
|
|
|
|
# Determine user's hospital context
|
|
user_hospital = None
|
|
if user.is_px_admin():
|
|
user_hospital = getattr(request, "tenant_hospital", None)
|
|
elif user.hospital:
|
|
user_hospital = user.hospital
|
|
|
|
# Get user's accessible hospitals based on role
|
|
if user.is_superuser:
|
|
# Superusers can see all hospitals
|
|
hospitals = Hospital.objects.filter(status="active")
|
|
elif user.is_px_admin():
|
|
# PX Admins see all active hospitals for the dropdown
|
|
# They use session-based hospital selection (request.tenant_hospital)
|
|
hospitals = Hospital.objects.filter(status="active")
|
|
elif user.hospital:
|
|
# Regular users can only see their assigned hospital
|
|
hospitals = Hospital.objects.filter(id=user.hospital.id)
|
|
else:
|
|
# User without hospital assignment - no access
|
|
hospitals = Hospital.objects.none()
|
|
|
|
# Get all mappings based on user role
|
|
if user.is_superuser:
|
|
# Superusers see all mappings
|
|
mappings = SurveyTemplateMapping.objects.select_related("hospital", "survey_template").all()
|
|
elif user.is_px_admin():
|
|
# PX Admins filter by session hospital
|
|
if user_hospital:
|
|
mappings = SurveyTemplateMapping.objects.filter(hospital=user_hospital).select_related(
|
|
"hospital", "survey_template"
|
|
)
|
|
else:
|
|
# No session hospital - show all (for management)
|
|
mappings = SurveyTemplateMapping.objects.select_related("hospital", "survey_template").all()
|
|
else:
|
|
# Regular users see only their hospital's mappings
|
|
mappings = SurveyTemplateMapping.objects.filter(hospital__in=hospitals).select_related(
|
|
"hospital", "survey_template"
|
|
)
|
|
|
|
# Group mappings by hospital
|
|
mappings_by_hospital = {}
|
|
for mapping in mappings:
|
|
# Skip mappings with missing hospital (orphaned records)
|
|
if mapping.hospital is None:
|
|
continue
|
|
hospital_name = mapping.hospital.name
|
|
if hospital_name not in mappings_by_hospital:
|
|
mappings_by_hospital[hospital_name] = []
|
|
mappings_by_hospital[hospital_name].append(mapping)
|
|
|
|
context = {
|
|
"hospitals": hospitals,
|
|
"mappings": mappings,
|
|
"mappings_by_hospital": mappings_by_hospital,
|
|
"page_title": _("Survey Template Mappings"),
|
|
"user_hospital": user_hospital,
|
|
}
|
|
|
|
return render(request, "integrations/survey_mapping_settings.html", context)
|