From 00a617721d3a80dd5041969d7ba2dff729beb6b6 Mon Sep 17 00:00:00 2001 From: k9845 Date: Thu, 13 Jun 2024 15:44:01 +0545 Subject: [PATCH] Fix duplicate stats generation in country page --- api/drf_views.py | 12 +++++++----- api/serializers.py | 1 + api/test_views.py | 6 +++++- api/views.py | 4 ++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/api/drf_views.py b/api/drf_views.py index 541566c846..5b7c2b0b5c 100644 --- a/api/drf_views.py +++ b/api/drf_views.py @@ -268,10 +268,12 @@ def get_country_figure(self, request, pk): end_date = request.GET.get("end_date", end_date) appeal_conditions = Q(atype=AppealType.APPEAL) - all_appealhistory = AppealHistory.objects.select_related("appeal").filter(appeal__code__isnull=False) - all_appealhistory = all_appealhistory.filter(country=country) + all_appealhistory = AppealHistory.objects.select_related("appeal").filter( + appeal__code__isnull=False, needs_confirmation=True + ) + all_appealhistory = all_appealhistory.filter(country=country).order_by().values("aid") if start_date and end_date: - all_appealhistory = all_appealhistory.filter(start_date__lte=end_date, end_date__gte=start_date) + all_appealhistory = all_appealhistory.filter(start_date__gte=start_date, end_date__lte=end_date) appeals_aggregated = all_appealhistory.annotate( appeal_with_dref=Count( Case( @@ -358,7 +360,7 @@ def get_country_disaster_monthly_count(self, request, pk): countries__in=[country.id], dtype__isnull=False, ) - .annotate(date=TruncMonth("created_at")) + .annotate(date=TruncMonth("disaster_start_date")) .values("date", "countries", "dtype") .annotate( appeal_targeted_population=Coalesce( @@ -415,7 +417,7 @@ def get_country_historical_disaster(self, request, pk): countries__in=[country.id], dtype__isnull=False, ) - .annotate(date=TruncMonth("created_at")) + .annotate(date=TruncMonth("disaster_start_date")) .values("date", "dtype", "countries") .annotate( appeal_targeted_population=Coalesce( diff --git a/api/serializers.py b/api/serializers.py index 371f5370a4..bf74dac358 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -2118,6 +2118,7 @@ class AggregateHeaderFiguresSerializer(serializers.Serializer): amount_requested = serializers.IntegerField() amount_requested_dref_included = serializers.IntegerField() amount_funded = serializers.IntegerField() + amount_funded_dref_included = serializers.IntegerField() # SearchPage Serializer diff --git a/api/test_views.py b/api/test_views.py index 9d0a2227d7..be55854239 100644 --- a/api/test_views.py +++ b/api/test_views.py @@ -562,6 +562,7 @@ def test_appeal_key_figure(self): atype=AppealType.APPEAL, start_date="2024-1-1", end_date="2024-1-1", + needs_confirmation=True, ) AppealHistoryFactory.create( appeal=appeal2, @@ -573,6 +574,7 @@ def test_appeal_key_figure(self): atype=AppealType.DREF, start_date="2024-2-2", end_date="2024-2-2", + needs_confirmation=True, ) AppealHistoryFactory.create( appeal=appeal3, @@ -584,6 +586,7 @@ def test_appeal_key_figure(self): atype=AppealType.APPEAL, start_date="2024-3-3", end_date="2024-3-3", + needs_confirmation=True, ) AppealHistoryFactory.create( appeal=appeal3, @@ -595,6 +598,7 @@ def test_appeal_key_figure(self): atype=AppealType.APPEAL, start_date="2024-4-4", end_date="2024-4-4", + needs_confirmation=True, ) url = f"/api/v2/country/{country1.id}/figure/" self.client.force_authenticate(self.user) @@ -602,4 +606,4 @@ def test_appeal_key_figure(self): self.assert_200(response) self.assertIsNotNone(response.json()) self.assertEqual(response.data["active_drefs"], 1) - self.assertEqual(response.data["active_appeals"], 3) + self.assertEqual(response.data["active_appeals"], 2) # distinct `appeal` diff --git a/api/views.py b/api/views.py index 6ea078360d..b623b41200 100644 --- a/api/views.py +++ b/api/views.py @@ -649,6 +649,9 @@ def get(self, request): ), # Active Appeals' funded amount, which are not DREF amof=Case(When(appeal_conditions, then=F("amount_funded")), output_field=IntegerField()), + amofdref=Case( + When(Q(end_date__gt=date) & Q(start_date__lt=date), then=F("amount_funded")), output_field=IntegerField() + ), ).aggregate( active_drefs=Sum("actd"), active_appeals=Sum("acta"), @@ -657,6 +660,7 @@ def get(self, request): amount_requested=Sum("amor"), amount_requested_dref_included=Sum("amordref"), amount_funded=Sum("amof"), + amount_funded_dref_included=Sum("amofdref"), ) return Response(AggregateHeaderFiguresSerializer(appeals_aggregated).data)