Refatoracao de qualidade de codigo
- Mover logica de routes.py para RankingMapper na camada de aplicacao - Consolidar funcoes mesclar_periodos e anos_completos_periodos em periodo.py - Extrair RankingCache para modulo separado em infrastructure/cache - Substituir todos os print() por logging adequado - Corrigir exception handlers genericos para tipos especificos - Remover classe Atuacao e atributo atuacoes_raw nao utilizados - Documentar status dos scripts utilitarios
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import logging
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from .routes import router
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
from .config import settings
|
||||
from .dependencies import (
|
||||
es_client,
|
||||
@@ -18,19 +22,17 @@ from ...application.jobs.scheduler import RankingScheduler
|
||||
async def lifespan(app: FastAPI):
|
||||
await es_client.connect()
|
||||
|
||||
# Conectar Oracle LOCAL (Docker)
|
||||
try:
|
||||
oracle_local_client.connect()
|
||||
print("Oracle LOCAL conectado (Docker)")
|
||||
logger.info("Oracle LOCAL conectado (Docker)")
|
||||
except Exception as e:
|
||||
print(f"AVISO: Oracle LOCAL não conectou: {e}")
|
||||
logger.warning(f"Oracle LOCAL não conectou: {e}")
|
||||
|
||||
# Conectar Oracle REMOTO (CAPES)
|
||||
try:
|
||||
oracle_remote_client.connect()
|
||||
print("Oracle REMOTO conectado (CAPES)")
|
||||
logger.info("Oracle REMOTO conectado (CAPES)")
|
||||
except Exception as e:
|
||||
print(f"AVISO: Oracle REMOTO não conectou: {e}. Sistema rodando sem Componente B (PPG).")
|
||||
logger.warning(f"Oracle REMOTO não conectou: {e}. Sistema rodando sem Componente B (PPG).")
|
||||
|
||||
scheduler = None
|
||||
try:
|
||||
@@ -39,7 +41,7 @@ async def lifespan(app: FastAPI):
|
||||
scheduler = RankingScheduler(job, job_componente_b=job_b)
|
||||
await scheduler.iniciar()
|
||||
except Exception as e:
|
||||
print(f"AVISO: Scheduler não iniciou: {e}")
|
||||
logger.warning(f"Scheduler não iniciou: {e}")
|
||||
|
||||
yield
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ from typing import Optional, List
|
||||
|
||||
from ...application.use_cases.obter_ranking import ObterRankingUseCase
|
||||
from ...application.use_cases.obter_consultor import ObterConsultorUseCase
|
||||
from ...application.mappers import RankingMapper
|
||||
from ...infrastructure.repositories.consultor_repository_impl import ConsultorRepositoryImpl
|
||||
from ..schemas.consultor_schema import (
|
||||
RankingResponseSchema,
|
||||
@@ -21,7 +22,6 @@ from ..schemas.ranking_schema import (
|
||||
)
|
||||
from .dependencies import get_repository, get_ranking_repository, get_processar_job
|
||||
from ...application.jobs.job_status import job_status
|
||||
import json
|
||||
|
||||
router = APIRouter(prefix="/api/v1", tags=["ranking"])
|
||||
|
||||
@@ -100,7 +100,7 @@ async def ranking_paginado(
|
||||
|
||||
total_pages = (total + size - 1) // size
|
||||
|
||||
consultores_schema = [_consultor_resumo_from_ranking(c) for c in consultores]
|
||||
consultores_schema = [RankingMapper.consultor_ranking_to_schema(c) for c in consultores]
|
||||
|
||||
return RankingPaginadoResponseSchema(
|
||||
total=total,
|
||||
@@ -129,87 +129,6 @@ async def buscar_por_nome(
|
||||
]
|
||||
|
||||
|
||||
def _consultor_resumo_from_ranking(c):
|
||||
consultoria = None
|
||||
coordenacoes_capes = None
|
||||
inscricoes = None
|
||||
avaliacoes_comissao = None
|
||||
premiacoes = None
|
||||
bolsas_cnpq = None
|
||||
participacoes = None
|
||||
orientacoes = None
|
||||
membros_banca = None
|
||||
pontuacao = None
|
||||
|
||||
try:
|
||||
jd = json.loads(c.json_detalhes) if c.json_detalhes else {}
|
||||
if isinstance(jd, dict):
|
||||
consultoria = jd.get("consultoria")
|
||||
coordenacoes_capes = jd.get("coordenacoes_capes")
|
||||
inscricoes = jd.get("inscricoes")
|
||||
avaliacoes_comissao = jd.get("avaliacoes_comissao")
|
||||
premiacoes = jd.get("premiacoes")
|
||||
bolsas_cnpq = jd.get("bolsas_cnpq")
|
||||
participacoes = jd.get("participacoes")
|
||||
orientacoes = jd.get("orientacoes")
|
||||
membros_banca = jd.get("membros_banca")
|
||||
pontuacao = jd.get("pontuacao")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Ajusta pontuação detalhada para refletir os valores atuais do ranking (incluindo COMPONENTE_B),
|
||||
# já que o JSON pode ter sido gerado antes do job de preenchimento do Componente B.
|
||||
pontuacao_total = float(c.pontuacao_total or 0)
|
||||
bloco_a = float(c.componente_a or 0)
|
||||
bloco_b = float(c.componente_b or 0)
|
||||
bloco_c = float(c.componente_c or 0)
|
||||
bloco_d = float(c.componente_d or 0)
|
||||
|
||||
if isinstance(pontuacao, dict):
|
||||
pontuacao_ajustada = dict(pontuacao)
|
||||
else:
|
||||
pontuacao_ajustada = {}
|
||||
|
||||
def _ajustar_bloco(chave: str, total: float, letra: str):
|
||||
b = pontuacao_ajustada.get(chave)
|
||||
if isinstance(b, dict):
|
||||
b2 = dict(b)
|
||||
b2["bloco"] = letra
|
||||
b2["total"] = total
|
||||
pontuacao_ajustada[chave] = b2
|
||||
else:
|
||||
pontuacao_ajustada[chave] = {"bloco": letra, "total": total, "atuacoes": []}
|
||||
|
||||
_ajustar_bloco("bloco_a", bloco_a, "A")
|
||||
_ajustar_bloco("bloco_b", bloco_b, "B")
|
||||
_ajustar_bloco("bloco_c", bloco_c, "C")
|
||||
_ajustar_bloco("bloco_d", bloco_d, "D")
|
||||
pontuacao_ajustada["pontuacao_total"] = pontuacao_total
|
||||
|
||||
return ConsultorRankingResumoSchema(
|
||||
id_pessoa=c.id_pessoa,
|
||||
nome=c.nome,
|
||||
posicao=c.posicao,
|
||||
pontuacao_total=pontuacao_total,
|
||||
bloco_a=bloco_a,
|
||||
bloco_b=bloco_b,
|
||||
bloco_c=bloco_c,
|
||||
bloco_d=bloco_d,
|
||||
ativo=c.ativo,
|
||||
anos_atuacao=c.anos_atuacao,
|
||||
consultoria=consultoria,
|
||||
coordenacoes_capes=coordenacoes_capes,
|
||||
inscricoes=inscricoes,
|
||||
avaliacoes_comissao=avaliacoes_comissao,
|
||||
premiacoes=premiacoes,
|
||||
bolsas_cnpq=bolsas_cnpq,
|
||||
participacoes=participacoes,
|
||||
orientacoes=orientacoes,
|
||||
membros_banca=membros_banca,
|
||||
pontuacao=pontuacao_ajustada if pontuacao_ajustada else None,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/ranking/estatisticas", response_model=EstatisticasRankingSchema)
|
||||
async def ranking_estatisticas(
|
||||
ranking_repo = Depends(get_ranking_repository),
|
||||
|
||||
Reference in New Issue
Block a user