fix(backend): corrigir exibicao de idiomas e selos multilingue

- Adicionar idiomas e formacoes ao _source das queries ES (client.py)
- Corrigir type mismatch int/str no endpoint paginado (routes.py)
- Adicionar campo evento nas inscricoes para nome do premio
- Implementar extracao de idiomas do ES no repository
- Ajustar frontend para exibir selo multilingue corretamente
This commit is contained in:
Frederico Castro
2025-12-24 18:12:22 -03:00
parent 0d355e705e
commit 919d95d1e8
14 changed files with 266 additions and 12 deletions

View File

@@ -206,6 +206,8 @@ async def ranking_paginado(
ativo: Optional[bool] = Query(default=None, description="Filtrar por status ativo"),
selos: Optional[str] = Query(default=None, description="Filtrar por selos (separados por vírgula)"),
oracle_repo = Depends(get_ranking_oracle_repo),
es_client: ElasticsearchClient = Depends(get_es_client),
repository: ConsultorRepositoryImpl = Depends(get_repository),
):
import json as json_lib
@@ -223,12 +225,46 @@ async def ranking_paginado(
total_pages = (total + size - 1) // size
consultores_schema = []
consultores_dados = []
faltando_idiomas = []
for c in consultores:
try:
d = json_lib.loads(c.json_detalhes) if isinstance(c.json_detalhes, str) else c.json_detalhes or {}
except (json_lib.JSONDecodeError, TypeError):
d = {}
consultores_dados.append((c, d))
if not d.get("idiomas"):
faltando_idiomas.append((c.id_pessoa, d))
if faltando_idiomas:
ids = [item[0] for item in faltando_idiomas]
docs = await es_client.buscar_por_ids(
ids,
source_fields=["id", "dadosPessoais", "idiomas", "atuacoes", "formacoes"],
)
docs_map = {int(doc.get("id")): doc for doc in docs if doc.get("id")}
for id_pessoa, detalhes in faltando_idiomas:
doc = docs_map.get(int(id_pessoa))
if not doc:
continue
idiomas = repository._extrair_idiomas(doc)
if idiomas:
detalhes["idiomas"] = [
{
"idioma": i.idioma,
"nivel_leitura": i.nivel_leitura,
"nivel_escrita": i.nivel_escrita,
"nivel_fala": i.nivel_fala,
"nivel_compreensao": i.nivel_compreensao,
}
for i in idiomas
]
if not detalhes.get("titulacao"):
titulacao = repository._extrair_titulacao(doc)
if titulacao:
detalhes["titulacao"] = titulacao
for c, d in consultores_dados:
tipos_atuacao = RankingMapper._extrair_tipos_atuacao(d)
consultores_schema.append(
ConsultorRankingResumoSchema(
@@ -255,6 +291,8 @@ async def ranking_paginado(
orientacoes=d.get("orientacoes"),
membros_banca=d.get("membros_banca"),
docencias=d.get("docencias"),
idiomas=d.get("idiomas"),
titulacao=d.get("titulacao"),
pontuacao=d.get("pontuacao"),
)
)