import streamlit as st
import pandas as pd
import json
import os
# Função para carregar usuários e senhas de um arquivo JSON
def carregar_usuarios(arquivo="users.json"):
if os.path.exists(arquivo):
with open(arquivo, "r", encoding="utf-8") as f:
return json.load(f)
return {}
# Função para carregar anotações de um arquivo específico para cada usuário
def carregar_anotacoes_usuario(usuario, pasta="anotacoes"):
if not os.path.exists(pasta):
os.makedirs(pasta)
arquivo_usuario = os.path.join(pasta, f"{usuario}_anotacoes_discursivas.json")
if os.path.exists(arquivo_usuario):
with open(arquivo_usuario, "r", encoding="utf-8") as f:
return json.load(f)
return {}
# Função para salvar anotações de um usuário
def salvar_anotacoes_usuario(usuario, dados, pasta="anotacoes"):
arquivo_usuario = os.path.join(pasta, f"{usuario}_anotacoes_discursivas.json")
with open(arquivo_usuario, "w", encoding="utf-8") as f:
json.dump(dados, f, ensure_ascii=False, indent=4)
# Função para autenticar o login
def autenticar(usuario, senha, usuarios):
return usuarios.get(usuario) == senha
# Função para extrair questões do texto
def extrai_questoes(texto):
enunciado = texto.split('A)')[0]
opcao_A = texto.split('B)')[0].split('A)')[1]
opcao_B = texto.split('B)')[1].split('Obs.')[0]
disclaimer = texto.split('Obs.')[1]
return {
'enunciado': enunciado,
'A': opcao_A,
'B': opcao_B,
'warning': disclaimer
}
# Função principal da aplicação
def run():
#st.set_page_config(layout="wide")
# Tela de login
usuarios = carregar_usuarios()
if "usuario" not in st.session_state:
st.session_state["usuario"] = None
if "selected_criterio" not in st.session_state:
st.session_state["selected_criterio"] = None
if st.session_state["usuario"] is None:
st.title("ICAIL - Benchmark jurídico OAB segunda fase")
st.markdown("Questões discursivas")
usuario = st.text_input("Usuário")
senha = st.text_input("Senha", type="password")
if st.button("Entrar"):
if autenticar(usuario, senha, usuarios):
st.session_state["usuario"] = usuario
st.success(f"Bem-vindo, {usuario}!")
st.rerun()
else:
st.error("Usuário ou senha inválidos.")
else:
usuario = st.session_state["usuario"]
# Carregar anotações do usuário
anotacoes_salvas = carregar_anotacoes_usuario(usuario)
# Carregar os dados do arquivo pickle correspondente
dados_pickle = "df_evaluated_discursive.pkl"
df = pd.read_pickle(dados_pickle)
# Configuração da barra lateral para escolher a questão
st.sidebar.title(f"Usuário: {usuario}")
questao_id = st.sidebar.selectbox("Selecione a questão", df["id"].tolist())
# Filtrar o DataFrame para a questão selecionada
questao = df[df["id"] == questao_id].iloc[0]
# Inicializar o JSON para a questão selecionada, se não existir
if str(questao_id) not in anotacoes_salvas:
anotacoes_salvas[str(questao_id)] = {}
# Layout principal
col1, col2 = st.columns([2, 1])
with col1:
st.header("Leitura e Contexto")
st.write(f"{questao['exam']} º exame da OAB, área Direito {questao['area']} - prova aplicada em {questao['exam date']}")
tab1, tab2, tab3 = st.tabs(["Questão discursiva", "Gabarito", "Resposta do Candidato"])
with tab1:
st.markdown(f"{questao['question']}", unsafe_allow_html=True)
with tab2:
st.markdown(f"{questao['answer']}", unsafe_allow_html=True)
with tab3:
questoes = extrai_questoes(questao['question'])
st.markdown(f"Enunciado:
{questoes['enunciado']}
", unsafe_allow_html=True)
st.markdown("Resposta do candidato:", unsafe_allow_html=True)
respostas = json.loads(questao['model_answer'])
for resposta in respostas:
for key, value in resposta.items():
st.markdown(f"{key}) {questoes[key]}", unsafe_allow_html=True)
st.markdown(f"{value}
", unsafe_allow_html=True)
with col2:
st.header("Lista de Critérios")
for idx, criterio in enumerate(questao["formated_criteria"]):
texto_botao = f"Critério {criterio['letra']} - {criterio['parte']}"
if st.button(texto_botao, key=f"menu_criterio_{idx}"):
st.session_state["selected_criterio"] = idx
st.rerun()
# Exibir o critério selecionado
if st.session_state["selected_criterio"] is not None:
criterio = questao["formated_criteria"][st.session_state["selected_criterio"]]
st.subheader(f"Critério {criterio['letra']} - {criterio['parte']}")
st.write(f"Gabarito: {criterio['gabarito']}")
st.write(f"Critério: {criterio['criterio']} (Peso: {criterio['pontos']})")
chave_anotacao = f"exame_{questao['exam']}_area_{questao['area']}_questao_numero_{questao['number']}_letra_{criterio['letra']}_parte_{criterio['parte']}"
valor_salvo = anotacoes_salvas[str(questao_id)].get(chave_anotacao, "-")
# Rádio para escolher a decisão
atende = st.radio(
f"Atende ao critério?",
options=["-", "Sim", "Não"],
index=["-", "Sim", "Não"].index(valor_salvo) if valor_salvo in ["-", "Sim", "Não"] else 0,
key=f"criterio_{questao_id}_{st.session_state['selected_criterio']}"
)
# Atualizar o valor no JSON
anotacoes_salvas[str(questao_id)][chave_anotacao] = atende
# Botão para salvar as anotações
if st.button("Salvar Anotação"):
salvar_anotacoes_usuario(usuario, anotacoes_salvas)
st.success("Anotação salva com sucesso!")
st.write("Resultados da anotação:")
st.json(anotacoes_salvas)
# Opção para logout
if st.sidebar.button("Logout"):
st.session_state["usuario"] = None
st.rerun()