Skip to content

Commit 8cd1032

Browse files
vigneshhariGeekGawdsainak
authored
Add list and detail serializer with tests for shifting module #1549 (#2392)
* Add list and detail serializer with tests for shifting module * viewset improve select_related for list action * Fix Test Cases * Update care/facility/api/serializers/shifting.py * Fix Linting * Fix Linting and tests --------- Co-authored-by: Suyash Singh <[email protected]> Co-authored-by: GeekGawd <[email protected]> Co-authored-by: Aakash Singh <[email protected]>
1 parent bcf5d7a commit 8cd1032

File tree

4 files changed

+482
-35
lines changed

4 files changed

+482
-35
lines changed

care/facility/api/serializers/shifting.py

+122-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@
2424
)
2525
from care.facility.models.bed import ConsultationBed
2626
from care.facility.models.notification import Notification
27-
from care.facility.models.patient_base import NewDischargeReasonEnum
27+
from care.facility.models.patient_base import (
28+
DISEASE_STATUS_CHOICES,
29+
DiseaseStatusEnum,
30+
NewDischargeReasonEnum,
31+
)
2832
from care.facility.models.patient_consultation import PatientConsultation
33+
from care.users.api.serializers.lsg import StateSerializer
2934
from care.users.api.serializers.user import UserBaseMinimumSerializer
3035
from care.utils.notification_handler import NotificationGenerator
3136
from care.utils.serializer.external_id_field import ExternalIdSerializerField
@@ -436,7 +441,122 @@ class Meta:
436441
read_only_fields = TIMESTAMP_FIELDS
437442

438443

439-
class ShiftingRequestCommentSerializer(serializers.ModelSerializer):
444+
class FacilityShiftingBareMinimumSerializer(serializers.ModelSerializer):
445+
class Meta:
446+
model = Facility
447+
fields = ["id", "name"]
448+
449+
450+
class PatientShiftingBareMinimumSerializer(serializers.ModelSerializer):
451+
id = serializers.CharField(source="external_id", read_only=True)
452+
facility = serializers.UUIDField(
453+
source="facility.external_id", allow_null=True, read_only=True
454+
)
455+
facility_object = FacilityShiftingBareMinimumSerializer(
456+
source="facility", read_only=True
457+
)
458+
state_object = StateSerializer(source="state", read_only=True)
459+
disease_status = ChoiceField(
460+
choices=DISEASE_STATUS_CHOICES, default=DiseaseStatusEnum.SUSPECTED.value
461+
)
462+
age = serializers.SerializerMethodField()
463+
464+
def get_age(self, obj):
465+
return obj.get_age()
466+
467+
class Meta:
468+
model = PatientRegistration
469+
fields = [
470+
"id",
471+
"name",
472+
"allow_transfer",
473+
"age",
474+
"phone_number",
475+
"address",
476+
"disease_status",
477+
"facility",
478+
"facility_object",
479+
"state_object",
480+
]
481+
read_only = TIMESTAMP_FIELDS
482+
483+
484+
class ShiftingListSerializer(serializers.ModelSerializer):
485+
id = serializers.UUIDField(source="external_id", read_only=True)
486+
487+
patient = ExternalIdSerializerField(
488+
queryset=PatientRegistration.objects.all(),
489+
allow_null=False,
490+
required=True,
491+
)
492+
patient_object = PatientShiftingBareMinimumSerializer(
493+
source="patient", read_only=True
494+
)
495+
496+
status = ChoiceField(choices=SHIFTING_STATUS_CHOICES)
497+
origin_facility_object = FacilityShiftingBareMinimumSerializer(
498+
source="origin_facility", read_only=True
499+
)
500+
shifting_approving_facility_object = FacilityShiftingBareMinimumSerializer(
501+
source="shifting_approving_facility", read_only=True
502+
)
503+
504+
assigned_facility = ExternalIdSerializerField(
505+
queryset=Facility.objects.all(), allow_null=True, required=False
506+
)
507+
assigned_facility_external = serializers.CharField(
508+
required=False, allow_null=True, allow_blank=True
509+
)
510+
assigned_facility_object = FacilityShiftingBareMinimumSerializer(
511+
source="assigned_facility", read_only=True
512+
)
513+
514+
class Meta:
515+
model = ShiftingRequest
516+
exclude = [
517+
"created_by",
518+
"last_edited_by",
519+
"assigned_to",
520+
"shifting_approving_facility",
521+
"origin_facility",
522+
"ambulance_number",
523+
"ambulance_phone_number",
524+
"ambulance_driver_name",
525+
"is_assigned_to_user",
526+
"is_kasp",
527+
"refering_facility_contact_number",
528+
"refering_facility_contact_name",
529+
"comments",
530+
"preferred_vehicle_choice",
531+
"vehicle_preference",
532+
"reason",
533+
"is_up_shift",
534+
"assigned_facility_type",
535+
"deleted",
536+
"breathlessness_level",
537+
]
538+
read_only_fields = TIMESTAMP_FIELDS
539+
540+
541+
class ShiftingUserBareMinimumSerializer(serializers.ModelSerializer):
542+
class Meta:
543+
model = User
544+
fields = ["id", "first_name", "last_name"]
545+
546+
547+
class ShiftingRequestCommentListSerializer(serializers.ModelSerializer):
548+
id = serializers.UUIDField(source="external_id", read_only=True)
549+
comment = serializers.CharField(required=True)
550+
created_by_object = ShiftingUserBareMinimumSerializer(
551+
source="created_by", read_only=True
552+
)
553+
554+
class Meta:
555+
model = ShiftingRequestComment
556+
fields = ["id", "comment", "modified_date", "created_by_object"]
557+
558+
559+
class ShiftingRequestCommentDetailSerializer(ShiftingRequestCommentListSerializer):
440560
id = serializers.UUIDField(source="external_id", read_only=True)
441561

442562
created_by_object = UserBaseMinimumSerializer(source="created_by", read_only=True)

care/facility/api/viewsets/shifting.py

+57-33
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.conf import settings
2+
from django.db.models.query import QuerySet
23
from django.db.models.query_utils import Q
34
from django.utils.timezone import localtime, now
45
from django_filters import rest_framework as filters
@@ -15,7 +16,9 @@
1516

1617
from care.facility.api.serializers.shifting import (
1718
ShiftingDetailSerializer,
18-
ShiftingRequestCommentSerializer,
19+
ShiftingListSerializer,
20+
ShiftingRequestCommentDetailSerializer,
21+
ShiftingRequestCommentListSerializer,
1922
ShiftingSerializer,
2023
has_facility_permission,
2124
)
@@ -93,36 +96,7 @@ class ShiftingViewSet(
9396
):
9497
serializer_class = ShiftingSerializer
9598
lookup_field = "external_id"
96-
queryset = ShiftingRequest.objects.all().select_related(
97-
"origin_facility",
98-
"origin_facility__ward",
99-
"origin_facility__local_body",
100-
"origin_facility__district",
101-
"origin_facility__state",
102-
"shifting_approving_facility",
103-
"shifting_approving_facility__ward",
104-
"shifting_approving_facility__local_body",
105-
"shifting_approving_facility__district",
106-
"shifting_approving_facility__state",
107-
"assigned_facility",
108-
"assigned_facility__ward",
109-
"assigned_facility__local_body",
110-
"assigned_facility__district",
111-
"assigned_facility__state",
112-
"patient",
113-
"patient__ward",
114-
"patient__local_body",
115-
"patient__district",
116-
"patient__state",
117-
"patient__facility",
118-
"patient__facility__ward",
119-
"patient__facility__local_body",
120-
"patient__facility__district",
121-
"patient__facility__state",
122-
"assigned_to",
123-
"created_by",
124-
"last_edited_by",
125-
)
99+
queryset = ShiftingRequest.objects.all()
126100
ordering_fields = ["id", "created_date", "modified_date", "emergency"]
127101

128102
permission_classes = (IsAuthenticated, DRYPermissions)
@@ -133,8 +107,52 @@ class ShiftingViewSet(
133107
)
134108
filterset_class = ShiftingFilterSet
135109

110+
def get_queryset(self) -> QuerySet:
111+
if self.action == "list":
112+
self.queryset = self.queryset.select_related(
113+
"origin_facility",
114+
"shifting_approving_facility",
115+
"assigned_facility",
116+
"patient",
117+
)
118+
119+
else:
120+
self.queryset = self.queryset.select_related(
121+
"origin_facility",
122+
"origin_facility__ward",
123+
"origin_facility__local_body",
124+
"origin_facility__district",
125+
"origin_facility__state",
126+
"shifting_approving_facility",
127+
"shifting_approving_facility__ward",
128+
"shifting_approving_facility__local_body",
129+
"shifting_approving_facility__district",
130+
"shifting_approving_facility__state",
131+
"assigned_facility",
132+
"assigned_facility__ward",
133+
"assigned_facility__local_body",
134+
"assigned_facility__district",
135+
"assigned_facility__state",
136+
"patient",
137+
"patient__ward",
138+
"patient__local_body",
139+
"patient__district",
140+
"patient__state",
141+
"patient__facility",
142+
"patient__facility__ward",
143+
"patient__facility__local_body",
144+
"patient__facility__district",
145+
"patient__facility__state",
146+
"assigned_to",
147+
"created_by",
148+
"last_edited_by",
149+
)
150+
return self.queryset
151+
136152
def get_serializer_class(self):
137153
serializer_class = self.serializer_class
154+
if self.action == "list":
155+
return ShiftingListSerializer
138156
if self.action == "retrieve":
139157
serializer_class = ShiftingDetailSerializer
140158
return serializer_class
@@ -186,7 +204,8 @@ def list(self, request, *args, **kwargs):
186204
field_header_map=ShiftingRequest.CSV_MAPPING,
187205
field_serializer_map=ShiftingRequest.CSV_MAKE_PRETTY,
188206
)
189-
return super(ShiftingViewSet, self).list(request, *args, **kwargs)
207+
response = super().list(request, *args, **kwargs)
208+
return response
190209

191210

192211
class ShifitngRequestCommentViewSet(
@@ -195,7 +214,7 @@ class ShifitngRequestCommentViewSet(
195214
mixins.RetrieveModelMixin,
196215
GenericViewSet,
197216
):
198-
serializer_class = ShiftingRequestCommentSerializer
217+
serializer_class = ShiftingRequestCommentDetailSerializer
199218
lookup_field = "external_id"
200219
queryset = ShiftingRequestComment.objects.all().order_by("-created_date")
201220

@@ -243,3 +262,8 @@ def get_request(self):
243262

244263
def perform_create(self, serializer):
245264
serializer.save(request=self.get_request())
265+
266+
def get_serializer_class(self):
267+
if self.action == "list":
268+
return ShiftingRequestCommentListSerializer
269+
return ShiftingRequestCommentDetailSerializer

0 commit comments

Comments
 (0)