|
import streamlit as st |
|
import pandas as pd |
|
import json |
|
import os |
|
|
|
|
|
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 {} |
|
|
|
|
|
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 {} |
|
|
|
|
|
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) |
|
|
|
|
|
def autenticar(usuario, senha, usuarios): |
|
return usuarios.get(usuario) == senha |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
def run(): |
|
|
|
|
|
|
|
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"] |
|
|
|
|
|
anotacoes_salvas = carregar_anotacoes_usuario(usuario) |
|
|
|
|
|
dados_pickle = "df_evaluated_discursive.pkl" |
|
df = pd.read_pickle(dados_pickle) |
|
|
|
|
|
st.sidebar.title(f"Usuário: {usuario}") |
|
questao_id = st.sidebar.selectbox("Selecione a questão", df["id"].tolist()) |
|
|
|
|
|
questao = df[df["id"] == questao_id].iloc[0] |
|
|
|
|
|
if str(questao_id) not in anotacoes_salvas: |
|
anotacoes_salvas[str(questao_id)] = {} |
|
|
|
|
|
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() |
|
|
|
|
|
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, "-") |
|
|
|
|
|
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']}" |
|
) |
|
|
|
|
|
anotacoes_salvas[str(questao_id)][chave_anotacao] = atende |
|
|
|
|
|
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) |
|
|
|
|
|
if st.sidebar.button("Logout"): |
|
st.session_state["usuario"] = None |
|
st.rerun() |
|
|