from datetime import datetime import logging from banco import SessionLocal from models import LogAcesso # Configuração mínima de logger (opcional; mantenha neutro) logger = logging.getLogger(__name__) def registrar_log(usuario, acao, tabela, registro_id=None): """ Registra um log de acesso/ação na tabela LogAcesso. Mantém assinatura e padrão original, mas com tratamento de exceções e normalização. :param usuario: str | usuário responsável pela ação (fallback para 'sistema' se None/vazio) :param acao: str | ação realizada (ex.: 'CRIAR', 'DESATIVAR', 'EXCLUIR') :param tabela: str | nome da tabela/entidade relacionada (ex.: 'eventos_calendario') :param registro_id: int | id do registro afetado (opcional) """ # Normalização defensiva (mantendo comportamento atual) usuario = (usuario or "sistema") acao = (acao or "").strip() or "DESCONHECIDA" tabela = (tabela or "").strip() or "desconhecida" db = SessionLocal() try: log = LogAcesso( usuario=usuario, acao=acao, tabela=tabela, registro_id=registro_id, data_hora=datetime.now() ) db.add(log) db.commit() except Exception as e: # Em caso de falha, desfazer transação e registrar o problema no logger try: db.rollback() except Exception: # Se rollback também falhar, seguimos fechando a sessão pass logger.exception( "Falha ao registrar log: usuario=%r, acao=%r, tabela=%r, registro_id=%r. Erro: %s", usuario, acao, tabela, registro_id, e ) # Não propaga exceção: evita quebrar o fluxo da aplicação finally: db.close() # ✅ Opcional: uma versão 'safe' que nunca lança erro para o chamador. # Mantém o padrão existente; use quando o log não pode interromper a operação. def registrar_log_safe(usuario, acao, tabela, registro_id=None): try: registrar_log(usuario, acao, tabela, registro_id) except Exception: # Defesa adicional: se algo escapar do registrar_log, não quebra o chamador logger.exception( "registrar_log_safe: erro inesperado ao registrar log (usuario=%r, acao=%r, tabela=%r, registro_id=%r)", usuario, acao, tabela, registro_id )