Skip to content

Commit 4d726bf

Browse files
committed
Update LivelihoodZoneBaselineFacetedSearchView to include livelihood_zone_baselines not just the counts see HEA-947
1 parent 413a6be commit 4d726bf

2 files changed

Lines changed: 65 additions & 30 deletions

File tree

apps/baseline/tests/test_viewsets.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,15 @@ def test_search_with_product(self):
762762
self.assertEqual(search_data["products"][0]["count"], 2) # 2 zones have this product
763763
# confirm the product value is correct
764764
self.assertEqual(search_data["products"][0]["value"], self.product1.cpc)
765+
# confirm livelihood_zone_baselines are present with correct data
766+
baselines = search_data["products"][0]["livelihood_zone_baselines"]
767+
self.assertEqual(len(baselines), 2)
768+
baseline_ids = {b["id"] for b in baselines}
769+
self.assertEqual(baseline_ids, {self.baseline1.id, self.baseline3.id})
770+
for b in baselines:
771+
self.assertIn("name", b)
772+
self.assertIn("livelihood_zone__code", b)
773+
self.assertIn("reference_year_end_date", b)
765774
# Apply the filters to the baseline
766775
baseline_url = reverse("livelihoodzonebaseline-list")
767776
response = self.client.get(
@@ -806,6 +815,14 @@ def test_search_with_wealth_characterstics(self):
806815
self.assertEqual(len(data["items"]), 2)
807816
self.assertEqual(data["items"][0]["count"], 1) # 1 zone for this characteristic
808817
self.assertEqual(data["items"][1]["count"], 1) # 1 zone for this characteristic
818+
# confirm livelihood_zone_baselines are present on each item
819+
for item in data["items"]:
820+
self.assertIn("livelihood_zone_baselines", item)
821+
self.assertEqual(len(item["livelihood_zone_baselines"]), 1)
822+
self.assertIn("id", item["livelihood_zone_baselines"][0])
823+
self.assertIn("name", item["livelihood_zone_baselines"][0])
824+
self.assertIn("livelihood_zone__code", item["livelihood_zone_baselines"][0])
825+
self.assertIn("reference_year_end_date", item["livelihood_zone_baselines"][0])
809826
# Search by the second characteristic
810827
response = self.client.get(
811828
self.url,
@@ -872,6 +889,13 @@ def test_search_with_livelihood_strategy_type(self):
872889
self.assertEqual(milk_results[0]["filter"], "strategy_type")
873890
self.assertEqual(milk_results[0]["value_label"], "Milk Production")
874891
self.assertEqual(milk_results[0]["count"], 1)
892+
# confirm livelihood_zone_baselines on strategy type result
893+
baselines = milk_results[0]["livelihood_zone_baselines"]
894+
self.assertEqual(len(baselines), 1)
895+
self.assertEqual(baselines[0]["id"], self.baseline1.id)
896+
self.assertIn("name", baselines[0])
897+
self.assertIn("livelihood_zone__code", baselines[0])
898+
self.assertIn("reference_year_end_date", baselines[0])
875899

876900
# Test that search "lait" with language=fr returns MilkProduction via French translation
877901
response = self.client.get(self.url, {"search": "lait", "language": "fr"})

apps/baseline/viewsets.py

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,6 +2097,18 @@ class LivelihoodZoneBaselineFacetedSearchView(APIView):
20972097
renderer_classes = [JSONRenderer]
20982098
permission_classes = [AllowAny]
20992099

2100+
def _get_baselines(self, baselines_qs):
2101+
# returs a list of baseline dicts with id, name, livelihood_zone__code, reference_year_end_date.
2102+
return [
2103+
{
2104+
"id": baseline.id,
2105+
"name": baseline.name,
2106+
"livelihood_zone__code": baseline.livelihood_zone.code,
2107+
"reference_year_end_date": baseline.reference_year_end_date,
2108+
}
2109+
for baseline in baselines_qs.select_related("livelihood_zone")
2110+
]
2111+
21002112
def _search_products(self, search_term):
21012113
# Search products using icontains for broader matching than the default iexact search.
21022114
q_object = Q()
@@ -2132,44 +2144,42 @@ def get(self, request, format=None):
21322144
with override(language):
21332145
for search_result in search_per_model:
21342146
if model_name == "ClassifiedProduct":
2135-
unique_zones = (
2136-
LivelihoodStrategy.objects.filter(product=search_result)
2137-
.values("livelihood_zone_baseline")
2138-
.distinct()
2139-
.count()
2140-
)
2147+
baselines_qs = LivelihoodZoneBaseline.objects.filter(
2148+
id__in=LivelihoodStrategy.objects.filter(product=search_result).values(
2149+
"livelihood_zone_baseline"
2150+
)
2151+
).distinct()
21412152
value_label, value = search_result.description, search_result.pk
21422153
elif model_name == "LivelihoodCategory":
2143-
unique_zones = LivelihoodZoneBaseline.objects.filter(
2154+
baselines_qs = LivelihoodZoneBaseline.objects.filter(
21442155
main_livelihood_category=search_result
2145-
).count()
2156+
)
21462157
value_label, value = search_result.description, search_result.pk
21472158
elif model_name == "LivelihoodZone":
2148-
unique_zones = LivelihoodZoneBaseline.objects.filter(livelihood_zone=search_result).count()
2159+
baselines_qs = LivelihoodZoneBaseline.objects.filter(livelihood_zone=search_result)
21492160
value_label, value = search_result.name, search_result.pk
21502161
elif model_name == "WealthCharacteristic":
2151-
unique_zones = (
2152-
WealthGroupCharacteristicValue.objects.filter(wealth_characteristic=search_result)
2153-
.values("wealth_group__livelihood_zone_baseline")
2154-
.distinct()
2155-
.count()
2156-
)
2162+
baselines_qs = LivelihoodZoneBaseline.objects.filter(
2163+
id__in=WealthGroupCharacteristicValue.objects.filter(
2164+
wealth_characteristic=search_result
2165+
).values("wealth_group__livelihood_zone_baseline")
2166+
).distinct()
21572167
value_label, value = search_result.description, search_result.pk
21582168
elif model_name == "Country":
2159-
unique_zones = (
2160-
LivelihoodZoneBaseline.objects.filter(livelihood_zone__country=search_result)
2161-
.distinct()
2162-
.count()
2163-
)
2169+
baselines_qs = LivelihoodZoneBaseline.objects.filter(
2170+
livelihood_zone__country=search_result
2171+
).distinct()
21642172
value_label, value = search_result.iso_en_name, search_result.pk
2165-
if unique_zones > 0:
2173+
baselines = self._get_baselines(baselines_qs)
2174+
if baselines:
21662175
results[filter_category].append(
21672176
{
21682177
"filter": filter_key,
21692178
"filter_label": filter_label,
21702179
"value_label": value_label,
21712180
"value": value,
2172-
"count": unique_zones,
2181+
"count": len(baselines),
2182+
"livelihood_zone_baselines": baselines,
21732183
}
21742184
)
21752185

@@ -2189,20 +2199,21 @@ def get(self, request, format=None):
21892199
or search_lower in english_labels[strategy_type.value]
21902200
or search_lower in translated_label.lower()
21912201
):
2192-
unique_zones = (
2193-
LivelihoodStrategy.objects.filter(strategy_type=strategy_type.value)
2194-
.values("livelihood_zone_baseline")
2195-
.distinct()
2196-
.count()
2197-
)
2198-
if unique_zones > 0:
2202+
baselines_qs = LivelihoodZoneBaseline.objects.filter(
2203+
id__in=LivelihoodStrategy.objects.filter(strategy_type=strategy_type.value).values(
2204+
"livelihood_zone_baseline"
2205+
)
2206+
).distinct()
2207+
baselines = self._get_baselines(baselines_qs)
2208+
if baselines:
21992209
results["livelihood_strategy_types"].append(
22002210
{
22012211
"filter": "strategy_type",
22022212
"filter_label": "Livelihood Strategy Type",
22032213
"value_label": translated_label,
22042214
"value": strategy_type.value,
2205-
"count": unique_zones,
2215+
"count": len(baselines),
2216+
"livelihood_zone_baselines": baselines,
22062217
}
22072218
)
22082219

0 commit comments

Comments
 (0)