99 lines
3.9 KiB
Python
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 |