noteneingabetool/session_ui.py

99 lines
3.9 KiB
Python

import streamlit as st
import time
from backend import moodle_io
from backend.db import DB, Session
from backend.helpers import update_columns
from backend.his_io import prepare_table, read_excel
def session_ui(db: DB, session: Session | None) -> Session | None:
with st.sidebar:
st.title(":blue[Noteneingabetool]")
st.header("Session :blue[wiederherstellen]", divider='gray')
# DEBUG (select session)
selected_session = st.selectbox(":red[DEBUG] Session auswählen", db.list_tokens(), index=None, key='session_select',
format_func=lambda token: f'{token} - {db.get_session(token).table_name}' )
if selected_session:
token = selected_session
else:
token = st.text_input("Session Token", value=session.token if session else '', key='token_input')
if token:
if not session or token != session.token:
try:
session = db.get_session(token)
st.success("Session gefunden")
except ValueError:
st.error("Session nicht gefunden")
session = None
else:
session = None
st.header(":blue Session :blue[verwalten]", divider='gray')
if st.button("Neue Session"):
new_session_dialog(db)
if st.button("Lösche Session", disabled=session is None):
delete_session_dialog(db, session)
if st.button("Moodle Ergebnisse importieren", disabled=session is None):
upload_moodle_results(db, session)
return session
@st.dialog("Neue Session anlegen")
def new_session_dialog(db: DB):
upload_file = st.file_uploader("HISinOne Excel Datei hochladen", type=['xlsx'], key='file_uploader')
if upload_file:
session = create_new_session(db, upload_file)
db.save_session(session)
st.write(":green[Session erstellt.]")
st.write('Nicht vergessen, den :blue[Token] zu notieren:')
st.code(session.token)
@st.dialog("Session löschen")
def delete_session_dialog(db: DB, session: Session):
st.warning("Sind Sie sicher, dass Sie die Session löschen möchten?")
if st.button(":exclamation: Session löschen :exclamation:"):
db.delete_session(session)
del st.session_state.session
st.success("Session gelöscht")
st.rerun()
@st.dialog("Moodle Ergebnisse hochladen")
def upload_moodle_results(db: DB, session: Session):
moodle_file = st.file_uploader("Moodle Ergebnis CSV hochladen", type=['csv'], key='moodle_file_uploader')
if moodle_file:
moodle_points_df = moodle_io.read_csv(moodle_file)
max_points, exercise_columns = moodle_io.parse_header(moodle_points_df)
st.write(f'Moodle CSV enhält :blue[{len(moodle_points_df.index)}] Einträge')
st.write(f'Aufgaben: ```{", ".join(exercise_columns)}```')
st.write(f'Punktzahl: :blue[{max_points}]')
st.warning("Sind Sie sicher, dass Sie die Ergebnisse importieren möchten? Aktuelle Ergebnisse werden gelöscht!")
if st.button("Importieren :question:"):
session.points_df = update_columns(exercise_columns, session.points_df)
session.points_df, update_count = moodle_io.merge_points(session.points_df, moodle_points_df)
st.session_state.max_points = max_points
st.success(f"{update_count} Ergebnisse importiert")
db.save_session(session)
time.sleep(1)
st.rerun()
def create_new_session(db, upload_file) -> Session:
new_session = db.create_session()
students_df, his_header = read_excel(upload_file)
points_df = prepare_table(students_df)
new_session.students_df = students_df
new_session.his_header = his_header
new_session.points_df = points_df
new_session.table_name = upload_file.name
return new_session