22
33from django .core .files .storage import default_storage as storage
44from django .http import JsonResponse
5+ from django .views import View
56from haystack .forms import FacetedSearchForm
67from haystack .generic_views import FacetedSearchView
78from haystack .models import SearchResult
@@ -30,17 +31,6 @@ def search(self):
3031 # Start with all results
3132 sqs = self .searchqueryset .all ()
3233
33- # Debug print to see all form data
34- print (
35- "DEBUG: Form data:" ,
36- {
37- "spatial_coverage" : self .spatial_coverage ,
38- "theme" : self .theme ,
39- "organization" : self .organization ,
40- "tag" : self .tag ,
41- },
42- )
43-
4434 # Text search if provided
4535 if q := self .cleaned_data .get ("q" ):
4636 sqs = (
@@ -109,6 +99,10 @@ class DatasetSearchView(FacetedSearchView):
10999 "contains_tables" ,
110100 "contains_raw_data_sources" ,
111101 "contains_information_requests" ,
102+ "contains_direct_download_free" ,
103+ "contains_direct_download_paid" ,
104+ "contains_temporalcoverage_free" ,
105+ "contains_temporalcoverage_paid" ,
112106 ]
113107
114108 @property
@@ -153,10 +147,10 @@ def get(self, request, *args, **kwargs):
153147 }
154148 )
155149
156- def get_facets (self , sqs : SearchQuerySet , facet_size = 200 ):
150+ def get_facets (self , sqs : SearchQuerySet , facet_size = 6 ):
157151 sqs = sqs .facet ("theme_slug" , size = facet_size )
158152 sqs = sqs .facet ("organization_slug" , size = facet_size )
159- sqs = sqs .facet ("spatial_coverage" , size = facet_size )
153+ # sqs = sqs.facet("spatial_coverage", size=facet_size)
160154 sqs = sqs .facet ("tag_slug" , size = facet_size )
161155 sqs = sqs .facet ("entity_slug" , size = facet_size )
162156
@@ -296,9 +290,7 @@ def as_search_result(result: SearchResult, locale="pt"):
296290 )
297291
298292 entities = []
299- for slug , name in zip (
300- result .entity_slug or [], getattr (result , f"entity_name_{ locale } " ) or []
301- ):
293+ for slug , name in zip (result .entity_slug or [], getattr (result , f"entity_name_{ locale } " ) or []):
302294 entities .append (
303295 {
304296 "slug" : slug ,
@@ -338,6 +330,10 @@ def as_search_result(result: SearchResult, locale="pt"):
338330 "contains_open_data" : result .contains_open_data ,
339331 "contains_closed_data" : result .contains_closed_data ,
340332 "contains_tables" : result .contains_tables ,
333+ "contains_direct_download_free" : result .contains_direct_download_free ,
334+ "contains_direct_download_paid" : result .contains_direct_download_paid ,
335+ "contains_temporalcoverage_free" : result .contains_temporalcoverage_free ,
336+ "contains_temporalcoverage_paid" : result .contains_temporalcoverage_paid ,
341337 "contains_raw_data_sources" : result .contains_raw_data_sources ,
342338 "contains_information_requests" : result .contains_information_requests ,
343339 "n_tables" : result .n_tables ,
@@ -349,3 +345,104 @@ def as_search_result(result: SearchResult, locale="pt"):
349345 "first_raw_data_source_id" : result .first_raw_data_source_id ,
350346 "first_information_request_id" : result .first_information_request_id ,
351347 }
348+
349+
350+ class DatasetFacetValuesView (View ):
351+ """
352+ View para retornar os valores de uma faceta específica baseada nos parâmetros de filtro atuais.
353+ """
354+
355+ facet_fields = [
356+ "tag_slug" ,
357+ "theme_slug" ,
358+ "entity_slug" ,
359+ "organization_slug" ,
360+ "spatial_coverage" ,
361+ ]
362+
363+ @property
364+ def locale (self ):
365+ return self .request .GET .get ("locale" , "pt" )
366+
367+ @property
368+ def facet_name (self ):
369+ return self .request .GET .get ("facet" , "" ).lower ()
370+
371+ def get_form_kwargs (self ):
372+ kwargs = {
373+ "contains" : self .request .GET .getlist ("contains" ),
374+ "theme" : self .request .GET .getlist ("theme" ),
375+ "organization" : self .request .GET .getlist ("organization" ),
376+ "spatial_coverage" : self .request .GET .getlist ("spatial_coverage" ),
377+ "tag" : self .request .GET .getlist ("tag" ),
378+ "observation_level" : self .request .GET .getlist ("observation_level" ),
379+ "locale" : self .locale ,
380+ }
381+
382+ if "q" in self .request .GET :
383+ kwargs ["data" ] = {"q" : self .request .GET ["q" ]}
384+
385+ return kwargs
386+
387+ def get (self , request , * args , ** kwargs ):
388+ if self .facet_name not in self .facet_fields :
389+ return JsonResponse (
390+ {
391+ "error" : f"Facet '{ self .facet_name } ' not available. Choose from: { self .facet_fields } "
392+ },
393+ status = 400 ,
394+ )
395+
396+ form = DatasetSearchForm (** self .get_form_kwargs ())
397+ sqs = form .search ()
398+
399+ sqs = sqs .facet (self .facet_name , size = 1000 ) # Tamanho grande para pegar todos os valores
400+
401+ facet_counts = sqs .facet_counts ()
402+ facet_values = facet_counts .get ("fields" , {}).get (self .facet_name , [])
403+
404+ values = [{"key" : value [0 ], "count" : value [1 ]} for value in facet_values if value [0 ]]
405+
406+ if self .facet_name == "theme_slug" :
407+ model = Theme
408+ name_field = f"name_{ self .locale } "
409+ elif self .facet_name == "organization_slug" :
410+ model = Organization
411+ name_field = f"name_{ self .locale } "
412+ elif self .facet_name == "tag_slug" :
413+ model = Tag
414+ name_field = f"name_{ self .locale } "
415+ elif self .facet_name == "entity_slug" :
416+ model = Entity
417+ name_field = f"name_{ self .locale } "
418+ elif self .facet_name == "spatial_coverage" :
419+ model = Area
420+ name_field = f"name_{ self .locale } "
421+ else :
422+ model = None
423+
424+ if model :
425+ slugs = [v ["key" ] for v in values ]
426+ translated_names = model .objects .filter (slug__in = slugs ).values (
427+ "slug" , name_field , "name"
428+ )
429+ name_map = {
430+ item ["slug" ]: {
431+ "name" : item .get (name_field ) or item .get ("name" ) or item ["slug" ],
432+ "fallback" : name_field not in item or item [name_field ] is None ,
433+ }
434+ for item in translated_names
435+ }
436+
437+ for value in values :
438+ translated = name_map .get (value ["key" ], {"name" : value ["key" ], "fallback" : True })
439+ value .update (translated )
440+
441+ return JsonResponse (
442+ {
443+ "facet" : self .facet_name ,
444+ "values" : values ,
445+ "count" : len (values ),
446+ "locale" : self .locale ,
447+ }
448+ )
0 commit comments