Spaces:
Sleeping
Sleeping
File size: 8,003 Bytes
ef95085 27ccac5 ef95085 27ccac5 ef95085 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
import streamlit as st
import pronotepy
from pronotepy.ent import *
# Configuration initiale
st.set_page_config(page_title="Contrôle Continu", page_icon="📚")
# Barème des points par niveau de maîtrise
bareme_points = {
"Très bonne maîtrise": 50,
"Maîtrise satisfaisante": 40,
"Maîtrise fragile": 25,
"Maîtrise insuffisante": 10
}
# Fonctions
def niveaux_maitrise_inverses():
return {v: k for k, v in bareme_points.items()}
def moyenne_a_maitrise(moyenne):
niveaux_inverses = niveaux_maitrise_inverses()
niveaux = sorted(niveaux_inverses.keys())
for i in range(len(niveaux) - 1):
if moyenne >= niveaux[i] and moyenne < niveaux[i + 1]:
return niveaux_inverses[niveaux[i + 1]]
return niveaux_inverses[niveaux[-1]]
# Fonction pour arrondir au niveau de maîtrise supérieur
def arrondir_maitrise(moyenne):
niveaux_inverses = niveaux_maitrise_inverses()
niveaux = sorted(niveaux_inverses.keys())
if not niveaux: # Vérifie si la liste des niveaux est vide
return None
# Si la moyenne est inférieure au premier seuil, retourner le niveau associé à ce seuil.
if moyenne < niveaux[0]:
return niveaux_inverses[niveaux[0]]
for i in range(len(niveaux) - 1):
if moyenne >= niveaux[i] and moyenne < niveaux[i + 1]:
# Calculez la différence avec le seuil inférieur et supérieur
diff_inferieur = moyenne - niveaux[i]
diff_superieur = niveaux[i + 1] - moyenne
# Choisissez le seuil le plus proche
if diff_inferieur <= diff_superieur:
return niveaux_inverses[niveaux[i]]
else:
return niveaux_inverses[niveaux[i + 1]]
# Gestion de session pour maintenir l'état
if 'client' not in st.session_state:
st.session_state.client = None
def connecter():
selected_cas = cas if college_selectionne == 'Autre' else colleges[college_selectionne][1]
st.session_state.client = pronotepy.Client(url if college_selectionne == 'Autre' else colleges[college_selectionne][0], username, password, getattr(pronotepy.ent, selected_cas, None))
if not st.session_state.client.logged_in:
st.error("Erreur de connexion. Veuillez vérifier vos identifiants.")
else:
st.success("Connecté avec succès !")
def deconnecter():
st.session_state.client = None
st.rerun()
# Interface utilisateur
st.title('Contrôle Continu 📚')
# Définition des options du menu déroulant
colleges = {
'Autre': ('', ''),
'Louise Weiss': ('https://0952236p.index-education.net/pronote/eleve.html', 'val_doise'),
}
cas_options = [
'Aucune', 'ac_orleans_tours', 'ac_poitiers', 'ac_reunion', 'ac_reims',
'ac_rennes', 'atrium_sud', 'cas_agora06', 'cas_arsene76_edu', 'cas_cybercolleges42_edu',
'cas_kosmos', 'cas_seinesaintdenis_edu', 'eclat_bfc', 'ecollege_haute_garonne_edu',
'ent_94', 'ent_auvergnerhonealpe', 'ent_creuse', 'ent_creuse_educonnect', 'ent_elyco',
'ent_essonne', 'ent_hdf', 'ent_mayotte', 'ent_somme', 'ent_var', 'ent77',
'ent_ecollege78', 'extranet_colleges_somme', 'ile_de_france', 'laclasse_educonnect',
'laclasse_lyon', 'l_normandie', 'lyceeconnecte_aquitaine', 'lyceeconnecte_edu',
'monbureaunumerique', 'neoconnect_guadeloupe', 'occitanie_montpellier',
'occitanie_montpellier_educonnect', 'occitanie_toulouse_edu', 'paris_classe_numerique',
'val_de_marne', 'val_doise'
]
if st.session_state.client is None:
college_selectionne = st.selectbox("🏫 Choisissez votre collège :", list(colleges.keys()))
cas = st.selectbox("📍 Si votre collège n'est pas listé, choisissez votre cas :", cas_options) if college_selectionne == 'Autre' else colleges[college_selectionne][1]
url = st.text_input('🧷 URL Pronote', value=colleges[college_selectionne][0]) if college_selectionne == 'Autre' else colleges[college_selectionne][0]
username = st.text_input('1️⃣ Nom d\'utilisateur', '')
password = st.text_input('2️⃣ Mot de passe', '', type='password')
st.button('🟢 Se connecter', on_click=connecter)
else:
if st.button('🔴 Se déconnecter'):
deconnecter()
# Sélection de la période
periode = st.selectbox("🏫 Voir mes points par domaines des autres Périodes :", ["Contrôle Continu (Toute l'année)", "Trimestre 1", "Trimestre 2", "Trimestre 3"], index=0)
periode_selectionnee = 0 if periode == "Contrôle Continu (Toute l'année)" else int(periode.replace('Trimestre ', ''))
# Initialisation des dictionnaires pour stocker les points par domaine
total_points_par_domaine = {}
nombre_acquisitions_par_domaine = {}
total_arrondi = 0
if periode_selectionnee in [1, 2, 3]:
current_period = [st.session_state.client.periods[periode_selectionnee - 1]]
else:
current_period = st.session_state.client.periods
for period in current_period:
evaluations = period.evaluations
for evaluation in evaluations:
for acquisition in evaluation.acquisitions:
domaines = acquisition.pillar_prefix.split(", ")
niveau_maitrise = acquisition.level
coefficient = acquisition.coefficient # Récupère le coefficient de l'acquisition
points = bareme_points.get(niveau_maitrise, 0) * coefficient # Multiplie les points par le coefficient
for domaine in domaines:
if domaine != "":
if domaine not in total_points_par_domaine:
total_points_par_domaine[domaine] = points
nombre_acquisitions_par_domaine[domaine] = 1
else:
total_points_par_domaine[domaine] += points
nombre_acquisitions_par_domaine[domaine] += 1
with st.expander("🔍 Détails des points par domaine"):
domaine_named = {
"D1.1": "1️⃣ D1.1 - Langue française à l'oral et à l'écrit",
"D1.2": "2️⃣ D1.2 - Langues étrangères et régionales",
"D1.3": "3️⃣ D1.3 - Langages mathématiques, scientifiques et informatiquese",
"D1.4": "4️⃣ D1.4 - Langage des arts et du corps",
"D2": "5️⃣ D2 - Les méthodes et outils pour apprendre",
"D3": "6️⃣ D3 - La formation de la personne et du citoyen",
"D4": "7️⃣ D4 - Les systèmes naturels et les systèmes techniques",
"D5": "8️⃣ D5 - Les représentations du monde et l'activité humaine"
}
# Iterate through sorted domain points to display them with friendly names
for domaine, points in sorted(total_points_par_domaine.items(), key=lambda item: item[0]):
moyenne = points / nombre_acquisitions_par_domaine[domaine]
niveau_maitrise = arrondir_maitrise(moyenne) # Utilise la fonction d'arrondi au niveau de maîtrise supérieur
points_maitrise = bareme_points[niveau_maitrise]
total_arrondi += points_maitrise
st.metric(domaine_named.get(domaine, domaine), f"{points_maitrise} points / 50 points")
# Calcul et affichage de la moyenne totale des points
total_points = sum(total_points_par_domaine.values())
nombre_total_acquisitions = sum(nombre_acquisitions_par_domaine.values())
moyenne_totale = total_points / nombre_total_acquisitions if nombre_total_acquisitions != 0 else 0
niveau_maitrise_totale = moyenne_a_maitrise(moyenne_totale)
# Verifier si c'est un trimestre ou toute l'année
if periode == "Contrôle Continu (Toute l'année)":
st.metric("📁 Points du controle continu (*environ*)", f"{total_arrondi} / 400 points") |