104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
# Copyright (c) 2023, François Pelletier
|
|
# Disponible sous licence AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
|
|
import json
|
|
import logging
|
|
import random
|
|
from pathlib import Path
|
|
|
|
import streamlit as st
|
|
from streamlit import session_state as ss
|
|
|
|
# Initialize session state
|
|
|
|
if "current_question" not in ss:
|
|
ss.current_question = None
|
|
|
|
if "questions_lues" not in ss:
|
|
ss.questions_lues = False
|
|
|
|
with open("donnees/licences.json") as file:
|
|
licences_data = json.load(file)["licences"]
|
|
licences_dict = {}
|
|
for licence_data in licences_data:
|
|
licences_dict[licence_data["licenceId"]] = licence_data
|
|
licences_dict = licences_dict
|
|
|
|
|
|
# Function to select a random question
|
|
def select_question():
|
|
"""
|
|
This function selects a random question from the list of questions and shuffles the answers for each question.
|
|
"""
|
|
if not ss.questions_lues:
|
|
with open("donnees/questions.json") as file:
|
|
ss.questions = json.load(file)["questions"]
|
|
random.shuffle(ss.questions)
|
|
ss.questions_lues = True
|
|
logging.info("Appel de la fonction select_question()")
|
|
ss.current_question = ss.questions.pop()
|
|
# Shuffle the answers
|
|
answers = ss.current_question["answers"].copy()
|
|
random.shuffle(answers)
|
|
ss.current_answers = answers
|
|
|
|
|
|
# Function to check the selected answer
|
|
def check_answer():
|
|
"""
|
|
This function checks the selected answer.
|
|
:return:
|
|
"""
|
|
logging.info("Appel de la fonction check_answer()")
|
|
correct_answer = ss.current_question["answers"][0]
|
|
selected_answer = ss.selected_answer
|
|
|
|
licence = ss.current_question["licence"]
|
|
nom = licences_dict[licence]["name"]
|
|
url = licences_dict[licence]["url"]
|
|
logo = licences_dict[licence]["logo"]
|
|
|
|
if selected_answer == correct_answer:
|
|
st.success("Bonne réponse!")
|
|
else:
|
|
st.error(f"Mauvaise réponse! La bonne réponse est: {correct_answer}")
|
|
st.subheader("Explication")
|
|
st.write(ss.current_question["explanation"])
|
|
st.markdown(f"Cette licence se nomme [{nom}]({url})")
|
|
st.image(f"logos/{logo}")
|
|
ss.clear()
|
|
|
|
|
|
# Main app
|
|
st.image("images/banniere.jpeg")
|
|
st.title("Culture Créative - Version Bêta !")
|
|
|
|
# Haut de page
|
|
header_content = Path("donnees/header.md").read_text()
|
|
st.markdown(header_content, unsafe_allow_html=True)
|
|
|
|
# Check if a question is already selected
|
|
if not ss.current_question:
|
|
select_question()
|
|
|
|
# Form for answer
|
|
with st.form("answer_form"):
|
|
logging.info("Afficher la question")
|
|
# Display the current question
|
|
st.subheader("Question")
|
|
st.write(ss.current_question["question"])
|
|
# Display the answer options
|
|
logging.info("Afficher les réponses possibles")
|
|
st.subheader("Réponses possibles")
|
|
ss.selected_answer = st.radio(f"Choisis une réponse", options=["---"] + ss.current_answers, key=0)
|
|
# Display the correct answer
|
|
if st.form_submit_button(label="Vérifier") and ss.selected_answer != "---":
|
|
logging.info("Vérifier la réponse")
|
|
check_answer()
|
|
if st.form_submit_button(label="Prochaine question"):
|
|
logging.info("Prochaine question")
|
|
ss.clear()
|
|
select_question()
|
|
# Pied de page
|
|
footer_content = Path("donnees/footer.md").read_text()
|
|
st.markdown(footer_content, unsafe_allow_html=True)
|