Kwestionariusz - Streamlit (formularz, ładowanie pliku, pobieranie pliku)

Kwestionariusz - Streamlit (formularz, ładowanie pliku, pobieranie pliku)
import streamlit as st
import json
import os

# • wyświetlać odpowiednie pola do wprowadzania pytań / odpowiedzi / punktacji (to wersja minimum) z przyciskiem do dodania takiego zestawu do istniejącego kwestionariusza
# • wyświetlać zawartość kwestionariusza (może to być po prostu wyświetlenie słownika z pytaniami
# / odp)
# • wczytywać pliki z kwestionariuszem w formacie JSON
# • zapisywać (z możliwością pobrania) kwestionariusz jako plik JSON z dodanymi nowymi pytaniami
folder_path = "data"
os.makedirs(folder_path, exist_ok=True)
file_name = 'quiz.json'
path_to_save_quiz = os.path.join(folder_path, file_name)

# def save_to_file():

if os.path.exists(path_to_save_quiz) and os.path.getsize(path_to_save_quiz) > 0:
    try:
        with open(path_to_save_quiz, "r", encoding="utf-8") as plik_json:
            quiz_data = json.load(plik_json)
    except json.JSONDecodeError:
        st.error("Plik quiz.json jest uszkodzony — został nadpisany pustym kwestionariuszem.")
        quiz_data = {}
else:
    quiz_data = {}
    with open(path_to_save_quiz, "w", encoding="utf-8") as plik_json:
        json.dump(quiz_data, plik_json, ensure_ascii=False, indent=2)

if st.session_state.get("clear_form", False):
    st.session_state["question_input"] = ""
    st.session_state["answer1_input"] = ""
    st.session_state["answer2_input"] = ""
    st.session_state["answer3_input"] = ""
    st.session_state["correct_answer"] = None
    st.session_state["clear_form"] = False

    # st.rerun()


with st.container():
    st.markdown("# Twój arkusz do tworzenia quiz-ów")
    st.write("### Wypełnij formularz lub załaduj kwestionariusz z pliku w formacie JSON.")

    uploaded_file = st.file_uploader("Wybierz plik JSON", type="json")
    if uploaded_file is not None:
        file_data = json.load(uploaded_file)
        st.json(file_data)

    col1, col2 = st.columns(2, gap="large")
    
    with col1:
        with st.form("quiz_form"):
            st.subheader("Dodaj nowe pytanie")
            question_val = st.text_input("Wprowadź pytanie", placeholder="Jakie miasto jest stolicą Francji?", key="question_input")
            answer_first_val = st.text_input("Wprowadź pierwszą odpowiedź", placeholder="Barcelona", key="answer1_input")
            answer_second_val = st.text_input("Wprowadź drugą odpowiedź", placeholder="Paryż", key="answer2_input")
            answer_third_val = st.text_input("Wprowadź trzecią odpowiedź", placeholder="Warszawa", key="answer3_input")

            choice_correct_answer = st.radio(
            "Zaznacz prawidłową odpowiedź:",
            # [answer_first_val, answer_second_val, answer_third_val],
            ["1", "2", "3"],
            index=None,
            key="correct_answer"
            )
            # form_ready = all([
            #     st.session_state.get("question_input", "").strip(),
            #     st.session_state.get("answer1_input", "").strip(),
            #     st.session_state.get("answer2_input", "").strip(),
            #     st.session_state.get("answer3_input", "").strip(),
            #     st.session_state.get("correct_answer", None) is not None,
            # ])
            submitted = st.form_submit_button("Dodaj i zapsz plik")
            # submitted = st.form_submit_button("Dodaj i zapsz plik", disabled=not form_ready)
            
            if submitted:
                st.write("Pytanie: ", question_val, "odp1: ", answer_first_val, "odp2: ", answer_second_val, "odp3: ", answer_third_val)
                st.write("Prawidłowa odpowiedź to: ", choice_correct_answer)

                errors = []

                if not question_val.strip():
                    errors.append("Pole 'Pytanie' jest obowiązkowe")

                if (not answer_first_val.strip()) or (not answer_second_val.strip()) or (not answer_third_val.strip()):
                    errors.append("Wszystkie pola odpowiedzi musza byc uzupełnione")
                if choice_correct_answer is None:
                    errors.append("Musisz zaznaczyć prawidłową odpowiedź")
                if errors:
                    for error in errors:
                        st.error(error)
                        # st.form_submit_button JAK ZROBIC ZEBY BYŁ DISABLED???????????????????????
                else:
                    odpowiedzi = []
                    answers = [answer_first_val, answer_second_val, answer_third_val]
                    letters = ["a", "b", "c"]
                
                    for i, txt in enumerate(answers, start=1):
                        punkt = 1 if str(i) == choice_correct_answer else -0.5
                        odpowiedzi.append((f"{letters[i-1]}) {txt}", punkt))

                    quiz_data[question_val] = odpowiedzi

                    with open(path_to_save_quiz, "w", encoding="utf-8") as plik_json:
                        json.dump(quiz_data, plik_json, ensure_ascii=False, indent=2)

                    st.success("Pytanie dodane do kwestionariusza!")
                    st.session_state["clear_form"] = True
                    st.rerun()
        with col2:
            st.write("### Aktualny kwestionariusz:")
            st.write("Pobierz plik w formacie JSON:")

            # zamienia słownik z pytaniami na string JSON, który pobiera użytkownik.
            json_data = json.dumps(quiz_data, ensure_ascii=False, indent=2)
            st.download_button(
                label="Pobierz",
                data=json_data,
                file_name="quiz.json",
                mime="application/json",
                icon=":material/download:",
            )
            if quiz_data:
                for i, (pytanie, odpowiedzi) in enumerate(quiz_data.items(), start=1):
                    st.markdown(f"**{i}. {pytanie}**")
                    for odp, pkt in odpowiedzi:
                        if pkt == 1:
                            st.write(f"{odp} (poprawna, +1 pkt)")
                        else:
                            st.write(f"{odp} (błędna, -0.5 pkt)")
                        st.markdown("------")
            else:
                st.write("Brak pytań w kwestionariuszu. Dodaj pierwsze pytanie powyżej.")