Skip to content

Commit 18e6164

Browse files
committed
Update logics on latest-change-request api
1 parent 4061d6b commit 18e6164

File tree

5 files changed

+66
-30
lines changed

5 files changed

+66
-30
lines changed

local_units/models.py

+1
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ class Validator(models.IntegerChoices):
405405
rejected_reason = models.TextField(verbose_name=_("Rejected reason"), blank=True, null=True)
406406

407407
def __str__(self):
408+
# NOTE: N+1, make sure to use select_related
408409
branch_name = self.local_unit.local_branch_name or self.local_unit.english_branch_name
409410
return f"{branch_name}-Change Request-{self.id}"
410411

local_units/serializers.py

+21
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
HealthData,
2323
HospitalType,
2424
LocalUnit,
25+
LocalUnitChangeRequest,
2526
LocalUnitLevel,
2627
LocalUnitType,
2728
PrimaryHCC,
@@ -529,3 +530,23 @@ class Meta:
529530

530531
class RejectedReasonSerialzier(serializers.Serializer):
531532
reason = serializers.CharField(required=True)
533+
534+
535+
class LocalUnitChangeRequestSerializer(serializers.ModelSerializer):
536+
local_unit_details = PrivateLocalUnitDetailSerializer(source="local_unit", read_only=True)
537+
created_by_details = LocalUnitMiniUserSerializer(source="created_by", read_only=True)
538+
status_details = serializers.CharField(source="get_status_display", read_only=True)
539+
current_validator_details = serializers.CharField(source="get_current_validator_display", read_only=True)
540+
541+
class Meta:
542+
model = LocalUnitChangeRequest
543+
fields = (
544+
"id",
545+
"local_unit_details",
546+
"status",
547+
"status_details",
548+
"current_validator",
549+
"current_validator_details",
550+
"created_by_details",
551+
"previous_data",
552+
)

local_units/test_views.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@ def test_create_local_unit_administrative(self):
337337
# Checking the request changes for the local unit is created or not
338338
request_change = LocalUnitChangeRequest.objects.all()
339339
self.assertEqual(request_change.count(), 1)
340-
print(request_change.first().previous_data)
341340
self.assertEqual(request_change.first().previous_data["id"], response.data["id"])
342341

343342
def test_create_update_local_unit_health(self):
@@ -598,7 +597,7 @@ def test_latest_changes(self):
598597
self.assert_200(response)
599598

600599
# Checking the latest changes
601-
response = self.client.post(f"/api/v2/local-units/{local_unit_id}/latest-changes/")
600+
response = self.client.post(f"/api/v2/local-units/{local_unit_id}/latest-change-request/")
602601
self.assert_200(response)
603-
self.assertEqual(response.data["local_branch_name"], previous_data["local_branch_name"])
604-
self.assertEqual(response.data["english_branch_name"], previous_data["english_branch_name"])
602+
self.assertEqual(response.data["previous_data"]["local_branch_name"], previous_data["local_branch_name"])
603+
self.assertEqual(response.data["previous_data"]["english_branch_name"], previous_data["english_branch_name"])

local_units/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
def format_local_unit(data: dict) -> dict:
1+
def get_local_unit_snapshot_data(data: dict) -> dict:
22
"""
33
Formatting the json local unit data
44
"""

local_units/views.py

+40-25
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@
2929
)
3030
from local_units.serializers import (
3131
DelegationOfficeSerializer,
32+
LocalUnitChangeRequestSerializer,
3233
LocalUnitDetailSerializer,
3334
LocalUnitOptionsSerializer,
3435
LocalUnitSerializer,
3536
PrivateLocalUnitDetailSerializer,
3637
PrivateLocalUnitSerializer,
3738
RejectedReasonSerialzier,
3839
)
39-
from local_units.utils import format_local_unit
40+
from local_units.utils import get_local_unit_snapshot_data
4041
from main.permissions import DenyGuestUserPermission
4142

4243

@@ -67,12 +68,10 @@ def create(self, request, *args, **kwargs):
6768
serializer.is_valid(raise_exception=True)
6869
self.perform_create(serializer)
6970

70-
clean_data = format_local_unit(serializer.data)
71-
7271
# Creating a new change request for the local unit
7372
LocalUnitChangeRequest.objects.create(
7473
local_unit=serializer.instance,
75-
previous_data=clean_data,
74+
previous_data=get_local_unit_snapshot_data(serializer.data),
7675
status=LocalUnitChangeRequest.Status.PENDING,
7776
triggered_by=request.user,
7877
)
@@ -92,12 +91,10 @@ def update(self, request, *args, **kwargs):
9291
serializer.is_valid(raise_exception=True)
9392
self.perform_update(serializer)
9493

95-
clean_data = format_local_unit(serializer.data)
96-
9794
# Creating a new change request for the local unit
9895
LocalUnitChangeRequest.objects.create(
9996
local_unit=local_unit,
100-
previous_data=clean_data,
97+
previous_data=get_local_unit_snapshot_data(serializer.data),
10198
status=LocalUnitChangeRequest.Status.PENDING,
10299
triggered_by=request.user,
103100
)
@@ -115,16 +112,22 @@ def get_validate(self, request, pk=None, version=None):
115112
local_unit = self.get_object()
116113

117114
serializer = PrivateLocalUnitDetailSerializer(local_unit, context={"request": request})
118-
clean_data = format_local_unit(serializer.data)
119115

120-
LocalUnitChangeRequest.objects.create(
116+
# NOTE: Updating the change request with the approval status
117+
change_request_instance = LocalUnitChangeRequest.objects.filter(
121118
local_unit=local_unit,
122-
previous_data=clean_data,
123-
status=LocalUnitChangeRequest.Status.APPROVED,
124-
triggered_by=request.user,
125-
updated_by=request.user,
126-
updated_at=timezone.now(),
127-
)
119+
status=LocalUnitChangeRequest.Status.PENDING,
120+
).last()
121+
122+
if not change_request_instance:
123+
return bad_request("No change request found to validate")
124+
125+
change_request_instance.status = LocalUnitChangeRequest.Status.APPROVED
126+
change_request_instance.previous_data = get_local_unit_snapshot_data(serializer.data)
127+
change_request_instance.updated_by = request.user
128+
change_request_instance.triggered_by = request.user
129+
change_request_instance.updated_at = timezone.now()
130+
change_request_instance.save(update_fields=["status", "previous_data", "updated_by", "triggered_by", "updated_at"])
128131

129132
# Validate the local unit
130133
local_unit.validated = True
@@ -148,18 +151,28 @@ def get_revert(self, request, pk=None, version=None):
148151
return bad_request("Local unit is already validated and cannot be reverted")
149152

150153
full_serializer = PrivateLocalUnitDetailSerializer(local_unit, context={"request": request})
151-
clean_data = format_local_unit(full_serializer.data)
152154

153155
serializer = RejectedReasonSerialzier(data=request.data)
154156
serializer.is_valid(raise_exception=True)
155157
reason = serializer.validated_data["reason"]
156158

157-
LocalUnitChangeRequest.objects.create(
159+
# NOTE: Updating the change request with the rejection reason
160+
change_request_instance = LocalUnitChangeRequest.objects.filter(
158161
local_unit=local_unit,
159-
previous_data=clean_data,
160-
rejected_reason=reason,
161-
status=LocalUnitChangeRequest.Status.REVERT,
162-
triggered_by=request.user,
162+
status=LocalUnitChangeRequest.Status.PENDING,
163+
).last()
164+
165+
if not change_request_instance:
166+
return bad_request("No change request found to revert")
167+
168+
change_request_instance.status = LocalUnitChangeRequest.Status.REVERT
169+
change_request_instance.rejected_reason = reason
170+
change_request_instance.updated_by = request.user
171+
change_request_instance.updated_at = timezone.now()
172+
change_request_instance.triggered_by = request.user
173+
change_request_instance.previous_data = get_local_unit_snapshot_data(full_serializer.data)
174+
change_request_instance.save(
175+
update_fields=["status", "rejected_reason", "updated_at", "updated_by", "triggered_by", "previous_data"]
163176
)
164177

165178
# Reverting the last change request related to this local unit
@@ -174,6 +187,7 @@ def get_revert(self, request, pk=None, version=None):
174187
# NOTE: Unlocking the reverted local unit
175188
local_unit.is_locked = False
176189
local_unit.save(update_fields=["is_locked"])
190+
177191
# reverting the previous data of change request to local unit by passing through serializer
178192
serializer = PrivateLocalUnitDetailSerializer(
179193
local_unit,
@@ -185,12 +199,12 @@ def get_revert(self, request, pk=None, version=None):
185199
self.perform_update(serializer)
186200
return response.Response(serializer.data)
187201

188-
@extend_schema(request=None, responses=PrivateLocalUnitDetailSerializer)
202+
@extend_schema(request=None, responses=LocalUnitChangeRequestSerializer)
189203
@action(
190204
detail=True,
191-
url_path="latest-changes",
205+
url_path="latest-change-request",
192206
methods=["post"],
193-
serializer_class=PrivateLocalUnitDetailSerializer,
207+
serializer_class=LocalUnitChangeRequestSerializer,
194208
permission_classes=[permissions.IsAuthenticated, IsAuthenticatedForLocalUnit, DenyGuestUserPermission],
195209
)
196210
def get_latest_changes(self, request, pk=None, version=None):
@@ -204,7 +218,8 @@ def get_latest_changes(self, request, pk=None, version=None):
204218
if not change_request:
205219
return bad_request("Last change request not found")
206220

207-
return response.Response(change_request.previous_data)
221+
serializer = LocalUnitChangeRequestSerializer(change_request, context={"request": request})
222+
return response.Response(serializer.data)
208223

209224

210225
class LocalUnitViewSet(viewsets.ModelViewSet):

0 commit comments

Comments
 (0)