File size: 6,448 Bytes
9ed81d8 55c2cd3 282e55c 55c2cd3 9ed81d8 55c2cd3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
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"<strong>Enunciado:</strong><br>{questoes['enunciado']}<br>", unsafe_allow_html=True)
st.markdown("<strong>Resposta do candidato:</strong>", unsafe_allow_html=True)
respostas = json.loads(questao['model_answer'])
for resposta in respostas:
for key, value in resposta.items():
st.markdown(f"<strong>{key}) {questoes[key]}</strong>", unsafe_allow_html=True)
st.markdown(f"{value}<br>", 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()
|