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