File size: 5,877 Bytes
55c2cd3 282e55c 55c2cd3 6f2ce65 55c2cd3 6f2ce65 55c2cd3 6f2ce65 |
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 |
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_praticas.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_praticas.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 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 práticas")
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.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 prova", 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(["Caso da Prova Prática", "Gabarito", "Resposta do Candidato"])
with tab1:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['question']}</div>", unsafe_allow_html=True)
with tab2:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['answer']}</div>", unsafe_allow_html=True)
with tab3:
st.markdown(f"<div style='height: 400px; overflow-y: auto; border: 1px solid #ddd; padding: 10px;'>{questao['model_answer']}</div>", unsafe_allow_html=True)
if st.session_state["selected_criterio"] is not None:
criterio = questao["formated_criteria"][st.session_state["selected_criterio"]]
identificador = f"Critério {criterio['numero']} - {criterio['parte']}"
st.subheader(identificador + f" - {criterio['titulo']}")
st.markdown(f"**Critério:**<br>{criterio['descricao']} (Peso: {criterio['pontos']})", unsafe_allow_html=True)
chave_anotacao = f"exame_{questao['exam']}_area_{questao['area']}_questao_numero_{criterio['numero']}_parte_{criterio['parte']}"
valor_salvo = anotacoes_salvas[str(questao_id)].get(chave_anotacao, "-")
# Atualizar imediatamente a anotação ao interagir com o rádio
atende = st.radio(
f"Cumpre o 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 dicionário de anotações
anotacoes_salvas[str(questao_id)][chave_anotacao] = atende
# Botão para salvar todas as anotações no arquivo
if st.button("Gravar"):
salvar_anotacoes_usuario(usuario, anotacoes_salvas)
st.success("Anotações salvas com sucesso!")
st.json(anotacoes_salvas)
with col2:
st.header("Lista de Critérios")
for idx, criterio in enumerate(questao["formated_criteria"]):
texto_botao = f"Critério {criterio['numero']} - {criterio['parte']}"
if st.button(texto_botao, key=f"menu_criterio_{idx}"):
st.session_state["selected_criterio"] = idx
st.rerun()
# Logout
if st.sidebar.button("Logout"):
st.session_state["usuario"] = None
st.rerun()
|