alterações gerais
This commit is contained in:
@ -2,7 +2,7 @@ import re
|
||||
from datetime import datetime
|
||||
from typing import Optional, Dict, Any, List
|
||||
from elasticsearch import Elasticsearch, AsyncElasticsearch
|
||||
from .schemas import ResultadoSchema, PaginaSchema
|
||||
from .schemas import BuscaDiariosResponseSchema, ResultadoSchema, PaginaSchema
|
||||
import unicodedata
|
||||
import asyncio
|
||||
from django.conf import settings
|
||||
@ -588,16 +588,19 @@ async def processar_paginas_encontradas(
|
||||
Returns:
|
||||
List[PaginaSchema]: Lista de páginas encontradas
|
||||
"""
|
||||
if not query:
|
||||
return []
|
||||
|
||||
paginas = []
|
||||
source = hit.get("_source", {})
|
||||
|
||||
if not query and "paginas" in source:
|
||||
for pagina in source["paginas"]:
|
||||
paginas.append(
|
||||
PaginaSchema(
|
||||
numero=pagina.get("numero", 0), conteudo=pagina.get("conteudo", "")
|
||||
)
|
||||
)
|
||||
#if not query and "paginas" in source:
|
||||
# for pagina in source["paginas"]:
|
||||
# paginas.append(
|
||||
# PaginaSchema(
|
||||
# numero=pagina.get("numero", 0), conteudo=pagina.get("conteudo", "")
|
||||
# )
|
||||
# )
|
||||
# Se temos uma query e há inner_hits, processamos todas as páginas correspondentes
|
||||
if query and "inner_hits" in hit and "paginas" in hit["inner_hits"]:
|
||||
paginas_inner_hits = hit["inner_hits"]["paginas"]["hits"]["hits"]
|
||||
@ -731,3 +734,115 @@ async def buscar_diarios_simples(
|
||||
|
||||
# Processar e retornar os resultados
|
||||
return await processar_resultados(response, query, page, page_size)
|
||||
|
||||
|
||||
async def list_diarios(
|
||||
es_client: AsyncElasticsearch,
|
||||
page: int = 1,
|
||||
page_size: int = 10,
|
||||
data_inicio: Optional[str] = None,
|
||||
data_fim: Optional[str] = None,
|
||||
tipo_diario: Optional[str] = None,
|
||||
numero_diario: Optional[str] = None,
|
||||
ordenar_por: str = "data_desc"
|
||||
) -> Dict[str, any]:
|
||||
"""
|
||||
Lista diários com paginação e filtros opcionais
|
||||
|
||||
Args:
|
||||
es_client: Cliente do Elasticsearch
|
||||
page: Número da página
|
||||
page_size: Itens por página
|
||||
data_inicio: Data inicial (YYYY-MM-DD)
|
||||
data_fim: Data final (YYYY-MM-DD)
|
||||
tipo_diario: Filtro por tipo de diário
|
||||
numero_diario: Filtro por número do diário
|
||||
ordenar_por: Campo para ordenação (data_desc, data_asc)
|
||||
|
||||
Returns:
|
||||
Dict com total de itens e lista de diários
|
||||
"""
|
||||
# Construir query de filtros
|
||||
filters = []
|
||||
|
||||
# Filtro por data
|
||||
if data_inicio or data_fim:
|
||||
date_range = {}
|
||||
if data_inicio:
|
||||
try:
|
||||
datetime.strptime(data_inicio, "%Y-%m-%d")
|
||||
date_range["gte"] = data_inicio
|
||||
except ValueError:
|
||||
pass
|
||||
if data_fim:
|
||||
try:
|
||||
datetime.strptime(data_fim, "%Y-%m-%d")
|
||||
date_range["lte"] = data_fim
|
||||
except ValueError:
|
||||
pass
|
||||
if date_range:
|
||||
filters.append({"range": {"data": date_range}})
|
||||
|
||||
# Filtro por tipo
|
||||
if tipo_diario:
|
||||
filters.append({"term": {"tipo.nome": tipo_diario}})
|
||||
|
||||
# Filtro por número
|
||||
if numero_diario:
|
||||
filters.append({"wildcard": {"numero": f"*{numero_diario}*"}})
|
||||
|
||||
# Construir query completa
|
||||
query = {
|
||||
"bool": {
|
||||
"must": [{"match_all": {}}],
|
||||
"filter": filters
|
||||
}
|
||||
}
|
||||
|
||||
# Definir ordenação
|
||||
sort = [{"data": {"order": "asc" if ordenar_por == "data_asc" else "desc"}}]
|
||||
|
||||
# Executar consulta
|
||||
try:
|
||||
response = await es_client.search(
|
||||
index="diario_oficial",
|
||||
body={
|
||||
"query": query,
|
||||
"sort": sort,
|
||||
"from": (page - 1) * page_size,
|
||||
"size": page_size,
|
||||
"_source": ["numero", "data", "tipo", "link"]
|
||||
}
|
||||
)
|
||||
|
||||
hits = response["hits"]["hits"]
|
||||
total = response["hits"]["total"]["value"]
|
||||
|
||||
# Processar resultados
|
||||
diarios = []
|
||||
for hit in hits:
|
||||
source = hit["_source"]
|
||||
diarios.append(BuscaDiariosResponseSchema(
|
||||
id=hit["_id"],
|
||||
numero=source.get("numero"),
|
||||
data=source.get("data"),
|
||||
tipo=source.get("tipo", {}).get("nome"),
|
||||
link=source.get("link")
|
||||
))
|
||||
|
||||
return {
|
||||
"total": total,
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"results": diarios
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erro ao listar diários: {e}")
|
||||
return {
|
||||
"total": 0,
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"results": []
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user