|
1 | 1 | from django.core.exceptions import ObjectDoesNotExist |
2 | | -from django.db.models import CharField, Q, Count, Max |
| 2 | +from django.db.models import CharField, Q, Count, Max, OuterRef, Exists |
3 | 3 | from django.db.models.functions import Cast |
4 | 4 | from django.utils.decorators import method_decorator |
5 | 5 | from django_filters import ( # pylint: disable=E0401 |
|
41 | 41 | PatientHospitalMappingWriteSerializer, |
42 | 42 | PreferredHospitalReadSerializer, |
43 | 43 | ReadPatientSerializer, |
44 | | - SurgeonEpisodeSummarySerializer, OwnedEpisodeSerializer, |
| 44 | + SurgeonEpisodeSummarySerializer, OwnedEpisodeSerializer, UnlinkedPatientSerializer, |
45 | 45 | ) |
46 | 46 | from ...users.models import MedicalPersonnel |
47 | 47 |
|
@@ -365,3 +365,39 @@ def get_serializer_class(self): |
365 | 365 | return FollowUpWriteSerializer |
366 | 366 |
|
367 | 367 | raise NotImplementedError |
| 368 | + |
| 369 | + |
| 370 | +class UnlinkedPatientsViewSet(viewsets.ReadOnlyModelViewSet): |
| 371 | + serializer_class = UnlinkedPatientSerializer |
| 372 | + permission_classes = [IsAuthenticated] |
| 373 | + pagination_class = None |
| 374 | + |
| 375 | + def get_queryset(self): |
| 376 | + user = self.request.user |
| 377 | + |
| 378 | + try: |
| 379 | + medical_personnel = user.medical_personnel |
| 380 | + preferred_hospital = medical_personnel.preferred_hospital.hospital |
| 381 | + except (MedicalPersonnel.DoesNotExist, PreferredHospital.DoesNotExist): |
| 382 | + return Patient.objects.none() |
| 383 | + |
| 384 | + # Subquery: check if any Episode exists for a given patient in the preferred hospital |
| 385 | + has_episode_subquery = Episode.objects.filter( |
| 386 | + patient_hospital_mapping__patient=OuterRef('pk'), |
| 387 | + patient_hospital_mapping__hospital=preferred_hospital |
| 388 | + ) |
| 389 | + |
| 390 | + patients = Patient.objects.filter( |
| 391 | + hospital_mappings__hospital=preferred_hospital |
| 392 | + ).annotate( |
| 393 | + has_episode=Exists(has_episode_subquery) |
| 394 | + ).filter( |
| 395 | + has_episode=False |
| 396 | + ).distinct().prefetch_related('hospital_mappings') |
| 397 | + |
| 398 | + return patients |
| 399 | + |
| 400 | + def get_serializer_context(self): |
| 401 | + context = super().get_serializer_context() |
| 402 | + context['request'] = self.request |
| 403 | + return context |
0 commit comments