IAC/temp/function-source/main.py (93 lines of code) (raw):
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import base64
import functions_framework
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select
from src import DatabaseConnector
from src.models import Requisicao
from src.corretor_gemini import Correcao, Corretor
from src.corretor_gemini.utils.imageUploader import ImageUploader
from uuid import UUID
import json
from datetime import datetime
import pytz
import re
@functions_framework.cloud_event
def handler(cloud_event):
# Decodifica a mensagem do Pub/Sub
message_data = cloud_event.data["message"]["data"]
decoded_message = base64.b64decode(message_data).decode('utf-8')
print(f"id recebido: {decoded_message}")
session = None # Inicialize a variável session
try:
# Converte decoded_message para UUID
uuid_param = UUID(decoded_message)
# Instancia o conector do banco de dados
db_connector = DatabaseConnector()
# Cria a sessão usando o método create_session da classe DatabaseConnector
session = db_connector.create_session()
# Imprime o Schema
db_connector.imprimir_schema()
# Consulta o banco de dados
query = select(Requisicao).where(Requisicao.id == uuid_param)
result = session.execute(query).scalars().first()
if result:
# Baixa imagens do drive e sobe para bucket
reg_links = r"https://drive\.google\.com/file/d/[^/]+\/view\?usp=sharing"
links_no_texto = re.findall(reg_links, result.TextosMotivadores)
images = []
for link in links_no_texto:
img = ImageUploader(link)
if not getattr(img, "fail", False):
images.append(img)
texto_adaptado = result.TextosMotivadores
for img in images:
texto_adaptado.replace(img.url_original, img.url_cloudstorage)
# Instancia o Corretor
corretor = Corretor()
corrigido_validado = False
while not corrigido_validado:
# Monta o dicionário redacao_data com os dados da redação
redacao_data = {
"tema_redacao": result.TitleTema,
"enunciado_redacao": result.DescricaoPedido,
"textos_motivadores": texto_adaptado.replace("\n", "").replace("\r", ""),
"redacao_estudante": result.Redacao.replace("\n", "").replace("\r", "")
}
# Realiza a correção com o dicionário redacao_data
datetime_inicio_correcao = datetime.now(pytz.timezone("America/Sao_Paulo"))
# Aplica a Correção na redação.
correcao = corretor.get_correcao_from_redacao(redacao_data)
# Aplica a Validação.
validacao = corretor.validate_essay(redacao_data)
# Extrai dados da correção
resultado = correcao.get_resposta_completa()
comentarios = correcao.get_comentarios()
notas_competencias = correcao.get_nota_comptencias()
nota_enem = correcao.get_nota_enem()
print(resultado)
# Competências esperadas
competencias = ["competencia_2", "competencia_3", "competencia_4", "competencia_5"]
# Validação Esperada.
validacao_enum = [
'Válida',
'Inválida - Texto Ilegível ou Ininteligível',
'Inválida - Desvio do Gênero Dissertativo-Argumentativo',
'Inválida - Cópia dos textos motivadores',
'Inválida - Violação aos Direitos Humanos'
]
notas_compt = []
corrigido_validado = True
# Loop para verificar cada competência e extrair o valor
for competencia in competencias:
if competencia in notas_competencias:
notas_compt.append(notas_competencias[competencia])
else:
corrigido_validado = False
notas_compt = [] # Limpa a lista de valores, pois não está corrigido
break
if validacao not in validacao_enum:
corrigido_validado = False
print("Correção realizada:", resultado, validacao)
# Salva a correção no banco de dados se `corrigido` for True
if corrigido_validado:
db_connector.salvar_correcao(
id_requisicao=uuid_param,
resultado=resultado,
validacao=validacao,
nota_enem=nota_enem,
notas_competencias=notas_compt,
datetime_inicio_correcao=datetime_inicio_correcao,
plagio=correcao.plagio if hasattr(correcao, 'plagio') else None,
)
else:
print("Correção incompleta, tentando novamente.")
else:
print(f"Nenhum dado encontrado para o UUID: {decoded_message}")
except Exception as e:
print(f"Erro ao buscar dados: {e}")
finally:
if session:
session.close()