1- import logging
2-
31from django .apps import apps
42from django .db import models
53from django .db .models import F , OuterRef , Q , Subquery
64from django .db .models .functions import Coalesce , NullIf
7- from django .utils import translation
5+ from django .utils . translation import override
86from django_filters import rest_framework as filters
97from django_filters .filters import CharFilter
108from rest_framework .permissions import AllowAny , DjangoModelPermissionsOrAnonReadOnly
9694 WildFoodGatheringSerializer ,
9795)
9896
99- logger = logging .getLogger (__name__ )
100-
10197
10298class SourceOrganizationFilterSet (filters .FilterSet ):
10399 class Meta :
@@ -1836,26 +1832,41 @@ def get_calculations_on_aggregates(self):
18361832
18371833
18381834MODELS_TO_SEARCH = [
1839- {"app_name" : "common" , "model_name" : "ClassifiedProduct" , "filter" : ("product" , "Product" , "products" )},
1835+ {
1836+ "app_name" : "common" ,
1837+ "model_name" : "ClassifiedProduct" ,
1838+ "filter" : {"key" : "product" , "label" : "Product" , "category" : "products" },
1839+ },
18401840 {
18411841 "app_name" : "metadata" ,
18421842 "model_name" : "LivelihoodCategory" ,
1843- "filter" : ("main_livelihood_category" , "main_livelihood_category" , "zone_types" ),
1843+ "filter" : {"key" : "main_livelihood_category" , "label" : "Main Livelihood Category" , "category" : "zone_types" },
1844+ },
1845+ {
1846+ "app_name" : "baseline" ,
1847+ "model_name" : "LivelihoodZone" ,
1848+ "filter" : {"key" : "livelihood_zone" , "label" : "Livelihood zone" , "category" : "zones" },
18441849 },
18451850 {
18461851 "app_name" : "metadata" ,
18471852 "model_name" : "WealthCharacteristic" ,
1848- "filter" : ("wealth_characteristic" , "Items" , "items" ),
1853+ "filter" : {"key" : "wealth_characteristic" , "label" : "Items" , "category" : "items" },
1854+ },
1855+ {
1856+ "app_name" : "common" ,
1857+ "model_name" : "Country" ,
1858+ "filter" : {"key" : "country" , "label" : "Country" , "category" : "countries" },
18491859 },
1850- {"app_name" : "common" , "model_name" : "Country" , "filter" : ("country" , "Country" , "countries" )},
18511860]
18521861
18531862
18541863class LivelihoodBaselineFacetedSearch (APIView ):
18551864 """
1856- Use a search term to find Livelihood Zone Baselines through various filters .
1865+ Performs a faceted search to find Livelihood Zone Baselines using a specified search term .
18571866
1858- Returns faceted search results
1867+ The search applies to multiple related models, filtering results based on the configured
1868+ criteria for each model. For each matching result, it calculates the number of unique
1869+ livelihodd zones associated with the filter and includes relevant metadata in the response.
18591870 """
18601871
18611872 renderer_classes = [JSONRenderer ]
@@ -1879,54 +1890,57 @@ def get(self, request, format=None):
18791890 for model_entry in MODELS_TO_SEARCH :
18801891 app_name = model_entry ["app_name" ]
18811892 model_name = model_entry ["model_name" ]
1882- filter , filter_label , filter_category = model_entry ["filter" ]
1893+ filter , filter_label , filter_category = (
1894+ model_entry ["filter" ]["key" ],
1895+ model_entry ["filter" ]["label" ],
1896+ model_entry ["filter" ]["category" ],
1897+ )
18831898 ModelClass = apps .get_model (app_name , model_name )
18841899 search_per_model = ModelClass .objects .search (search_term )
18851900 results [filter_category ] = []
1886-
1887- translation .activate (language )
1888-
1889- for search_result in search_per_model :
1890- if model_name == "ClassifiedProduct" :
1891- unique_zones = (
1892- LivelihoodStrategy .objects .filter (product = search_result )
1893- .values ("livelihood_zone_baseline" )
1894- .distinct ()
1895- .count ()
1896- )
1897- value_label , value = search_result .description , search_result .pk
1898- elif model_name == "LivelihoodCategory" :
1899- unique_zones = LivelihoodZoneBaseline .objects .filter (
1900- main_livelihood_category = search_result
1901- ).count ()
1902- value_label , value = search_result .description , search_result .pk
1903- elif model_name == "LivelihoodZone" :
1904- unique_zones = LivelihoodZoneBaseline .objects .filter (livelihood_zone = search_result ).count ()
1905- value_label , value = search_result .name , search_result .pk
1906- elif model_name == "WealthCharacteristic" :
1907- unique_zones = (
1908- WealthGroupCharacteristicValue .objects .filter (wealth_characteristic = search_result )
1909- .values ("wealth_group__livelihood_zone_baseline" )
1910- .distinct ()
1911- .count ()
1912- )
1913- value_label , value = search_result .description , search_result .pk
1914- elif model_name == "Country" :
1915- unique_zones = (
1916- LivelihoodZoneBaseline .objects .filter (livelihood_zone__country = search_result )
1917- .distinct ()
1918- .count ()
1919- )
1920- value_label , value = search_result .iso_en_name , search_result .pk
1921- if unique_zones > 0 :
1922- results [filter_category ].append (
1923- {
1924- "filter" : filter ,
1925- "filter_label" : filter_label ,
1926- "value_label" : value_label ,
1927- "value" : value ,
1928- "count" : unique_zones ,
1929- }
1930- )
1901+ # for activating language
1902+ with override (language ):
1903+ for search_result in search_per_model :
1904+ if model_name == "ClassifiedProduct" :
1905+ unique_zones = (
1906+ LivelihoodStrategy .objects .filter (product = search_result )
1907+ .values ("livelihood_zone_baseline" )
1908+ .distinct ()
1909+ .count ()
1910+ )
1911+ value_label , value = search_result .description , search_result .pk
1912+ elif model_name == "LivelihoodCategory" :
1913+ unique_zones = LivelihoodZoneBaseline .objects .filter (
1914+ main_livelihood_category = search_result
1915+ ).count ()
1916+ value_label , value = search_result .description , search_result .pk
1917+ elif model_name == "LivelihoodZone" :
1918+ unique_zones = LivelihoodZoneBaseline .objects .filter (livelihood_zone = search_result ).count ()
1919+ value_label , value = search_result .name , search_result .pk
1920+ elif model_name == "WealthCharacteristic" :
1921+ unique_zones = (
1922+ WealthGroupCharacteristicValue .objects .filter (wealth_characteristic = search_result )
1923+ .values ("wealth_group__livelihood_zone_baseline" )
1924+ .distinct ()
1925+ .count ()
1926+ )
1927+ value_label , value = search_result .description , search_result .pk
1928+ elif model_name == "Country" :
1929+ unique_zones = (
1930+ LivelihoodZoneBaseline .objects .filter (livelihood_zone__country = search_result )
1931+ .distinct ()
1932+ .count ()
1933+ )
1934+ value_label , value = search_result .iso_en_name , search_result .pk
1935+ if unique_zones > 0 :
1936+ results [filter_category ].append (
1937+ {
1938+ "filter" : filter ,
1939+ "filter_label" : filter_label ,
1940+ "value_label" : value_label ,
1941+ "value" : value ,
1942+ "count" : unique_zones ,
1943+ }
1944+ )
19311945
19321946 return Response (results )
0 commit comments