fix(selos): corrigir geração de selos e adicionar ícones visuais

- Corrigir extração de orientações (tipo "Orientação de Discentes")
- Selos de premiação agora usam campo papel (Autor/Orientador/Coorientador)
- Adicionar ícones visuais aos selos (emojis Unicode)
- Adicionar estilos CSS para novos tipos de selos
- Melhorias no Oracle client e ranking repository
This commit is contained in:
Frederico Castro
2025-12-15 05:01:52 -03:00
parent 97322e5ad7
commit d639b82087
14 changed files with 320 additions and 111 deletions

View File

@@ -1,6 +1,6 @@
import logging
import cx_Oracle
import oracledb
from typing import List, Dict, Any, Optional
from contextlib import contextmanager
@@ -12,19 +12,18 @@ class OracleClient:
self.user = user
self.password = password
self.dsn = dsn
self._pool: Optional[cx_Oracle.SessionPool] = None
self._pool: Optional[oracledb.ConnectionPool] = None
self._connected = False
def connect(self) -> None:
try:
self._pool = cx_Oracle.SessionPool(
self._pool = oracledb.create_pool(
user=self.user,
password=self.password,
dsn=self.dsn,
min=2,
max=10,
increment=1,
encoding="UTF-8",
)
self._connected = True
except Exception as e:
@@ -35,7 +34,7 @@ class OracleClient:
if self._pool:
try:
self._pool.close()
except cx_Oracle.Error:
except oracledb.Error:
pass
@property

View File

@@ -15,7 +15,7 @@ class RankingOracleRepository:
Insere ou atualiza um batch de consultores usando MERGE.
Retorna o número de registros processados.
"""
import cx_Oracle
import oracledb
if not consultores:
return 0
@@ -66,18 +66,18 @@ class RankingOracleRepository:
cursor = conn.cursor()
try:
for consultor in consultores:
json_str = json.dumps(consultor.get("detalhes", {}), ensure_ascii=False)
cursor.setinputsizes(json_detalhes=cx_Oracle.CLOB)
json_str = json.dumps(consultor, ensure_ascii=False)
cursor.setinputsizes(json_detalhes=oracledb.DB_TYPE_CLOB)
params = {
"id_pessoa": consultor["id_pessoa"],
"nome": consultor["nome"],
"pontuacao_total": consultor["pontuacao_total"],
"componente_a": consultor["componente_a"],
"componente_b": consultor["componente_b"],
"componente_c": consultor["componente_c"],
"componente_d": consultor["componente_d"],
"ativo": "S" if consultor["ativo"] else "N",
"anos_atuacao": consultor["anos_atuacao"],
"componente_a": consultor.get("bloco_a") or consultor.get("componente_a", 0),
"componente_b": consultor.get("bloco_b") or consultor.get("componente_b", 0),
"componente_c": consultor.get("bloco_c") or consultor.get("componente_c", 0),
"componente_d": consultor.get("bloco_d") or consultor.get("componente_d", 0),
"ativo": "S" if consultor.get("ativo") else "N",
"anos_atuacao": consultor.get("anos_atuacao", 0),
"json_detalhes": json_str
}
cursor.execute(merge_sql, params)

View File

@@ -355,10 +355,52 @@ class ConsultorRepositoryImpl(ConsultorRepository):
orientacoes = []
for a in atuacoes:
tipo = a.get("tipo", "").lower()
if "orientação" not in tipo and "orientacao" not in tipo:
tipo = a.get("tipo", "")
tipo_lower = tipo.lower()
if tipo == "Orientação de Discentes":
dados = a.get("dadosOrientacaoDiscente", {}) or {}
total_mestrado = dados.get("totalOrientacaoFinalizadaMestrado") or 0
total_doutorado = dados.get("totalOrientacaoFinalizadaDoutorado") or 0
total_pos_doc = dados.get("totalAcompanhamentoPosDoutorado") or 0
for _ in range(int(total_pos_doc)):
orientacoes.append(Orientacao(
codigo="ORIENT_POS_DOC",
tipo="Orientação Pós-Doutorado",
nivel="Pós-Doutorado",
ano=None,
coorientacao=False,
premiada=False,
premiacao_tipo=None,
))
for _ in range(int(total_doutorado)):
orientacoes.append(Orientacao(
codigo="ORIENT_TESE",
tipo="Orientação Doutorado",
nivel="Doutorado",
ano=None,
coorientacao=False,
premiada=False,
premiacao_tipo=None,
))
for _ in range(int(total_mestrado)):
orientacoes.append(Orientacao(
codigo="ORIENT_DISS",
tipo="Orientação Mestrado",
nivel="Mestrado",
ano=None,
coorientacao=False,
premiada=False,
premiacao_tipo=None,
))
continue
if "co-orientação" in tipo or "coorientação" in tipo or "co_orient" in tipo:
if "orientação" not in tipo_lower and "orientacao" not in tipo_lower:
continue
if "co-orientação" in tipo_lower or "coorientação" in tipo_lower or "co_orient" in tipo_lower:
continue
dados = a.get("dadosOrientacao", {}) or {}