|
import streamlit as st |
|
from pronotepy import Client |
|
import datetime |
|
|
|
def afficher_details_periode(client: Client, nom_periode: str): |
|
if nom_periode == "Année entière": |
|
absences = [absence for periode in client.periods for absence in periode.absences] |
|
retards = [retard for periode in client.periods for retard in periode.delays] |
|
punitions = [punition for periode in client.periods for punition in periode.punishments] |
|
else: |
|
periode = next((p for p in client.periods if p.name == nom_periode), None) |
|
if periode: |
|
absences = periode.absences |
|
retards = periode.delays |
|
punitions = periode.punishments |
|
rapports = [periode.report] if periode.report else [] |
|
else: |
|
absences, retards, punitions, rapports = [], [], [], [] |
|
|
|
|
|
afficher_absences(absences) |
|
afficher_retards(retards) |
|
afficher_punitions(punitions) |
|
if rapports: |
|
afficher_rapports(rapports) |
|
else: |
|
st.info("🔴 Aucun rapport disponible pour cette période.") |
|
|
|
def afficher_absences(absences): |
|
if absences: |
|
for absence in absences: |
|
with st.expander(f"🚫 Absence du {absence.from_date.strftime('%d/%m/%Y')} au {absence.to_date.strftime('%d/%m/%Y')}"): |
|
st.write(f"🕒 Heures manquées: {absence.hours}") |
|
st.write(f"📆 Jours manqués: {absence.days}") |
|
st.write(f"✅ Justifiée: {'Oui' if absence.justified else 'Non'}") |
|
st.write(f"📝 Raisons: {', '.join(absence.reasons)}") |
|
else: |
|
st.info("🔴 Aucune absence enregistrée pour cette période.") |
|
|
|
def afficher_retards(retards): |
|
if retards: |
|
for retard in retards: |
|
with st.expander(f"⏰ Retard le {retard.date.strftime('%d/%m/%Y')}"): |
|
st.write(f"⏳ Minutes manquées: {retard.minutes}") |
|
st.write(f"✅ Justifié: {'Oui' if retard.justified else 'Non'}") |
|
st.write(f"📜 Justification: {retard.justification}") |
|
st.write(f"📝 Raisons: {', '.join(retard.reasons)}") |
|
else: |
|
st.info("🔴 Aucun retard enregistré pour cette période.") |
|
|
|
def afficher_punitions(punitions): |
|
if punitions: |
|
for punition in punitions: |
|
with st.expander(f"🚨 Punition: {punition.nature} le {punition.given.strftime('%d/%m/%Y')}"): |
|
st.write(f"🔹 Donnée par: {punition.giver}") |
|
st.write(f"🔸 Raisons: {', '.join(punition.reasons)}") |
|
else: |
|
st.info("🔴 Aucune punition enregistrée pour cette période.") |
|
|
|
subject_emojis = { |
|
'ANGLAIS LV SECTION': '🇬🇧', |
|
'FRANCAIS': '🇫🇷', |
|
'EPS': '🏃♂️', |
|
'Sport': '🏃♂️', |
|
'Histoire/Géographie': '🌍', |
|
'HIST/GEO': '🌍', |
|
'Mathématiques': '🔢', |
|
'MATHS': '🔢', |
|
'PH-CHIMIE': '🧪', |
|
'Physique-Chimie': '🧪', |
|
'ANGLAIS LV1': '🇬🇧', |
|
'ESPAGNOL LV2': '🇪🇸', |
|
'SVT': '🌿', |
|
'Technologie': '🔧', |
|
'TECHNO': '🔧', |
|
'TECHNOLOGIE': '🔧', |
|
'Arts Plastiques': '🎨', |
|
'ARTS PLASTIQUES': '🎨', |
|
'Musique': '🎵', |
|
'MUSIQUE': '🎵', |
|
'ED MUSICALE': '🎵' |
|
} |
|
|
|
def afficher_rapports(rapports): |
|
if rapports: |
|
for rapport in rapports: |
|
if rapport.subjects: |
|
for sujet in rapport.subjects: |
|
with st.expander(f"{subject_emojis.get(sujet.name, '📚')} Matière: {sujet.name} ({', '.join(sujet.teachers) if sujet.teachers else ''})", expanded=False): |
|
st.subheader("🧷 Information") |
|
st.markdown(f""" |
|
- 📋 **Moyenne de l'élève**: `{sujet.student_average if sujet.student_average else 'Pas visible'}` |
|
- 📊 **Moyenne de la classe**: `{sujet.class_average if sujet.class_average else 'Bizarement invisible'}` |
|
- 📈 **Moyenne minimale**: `{sujet.min_average if sujet.min_average else 'On ne sait pas'}` |
|
- 📉 **Moyenne maximale**: `{sujet.max_average if sujet.max_average else 'Inconnu'}` |
|
- 🧑🏫 **Enseignants**: `{', '.join(sujet.teachers) if sujet.teachers else 'Apparemment, il accun enseignants, étrange ?'}`""") |
|
if sujet.comments: |
|
st.subheader("📃 Commentaires") |
|
for commentaire in sujet.comments: |
|
st.write(f"- {commentaire}") |
|
if rapport.comments: |
|
st.subheader("📄 Commentaires globaux") |
|
for commentaire in rapport.comments: |
|
st.write(f"- {commentaire}") |
|
else: |
|
st.info("🔴 Aucun rapport disponible pour cette période.") |
|
|
|
def app(client: Client): |
|
st.title('📍 Vie Scolaire') |
|
|
|
options_periode = ["Trimestre 1", "Trimestre 2", "Trimestre 3"] |
|
nom_periode_selectionnee = st.selectbox("📅 Sélectionner la période", options_periode) |
|
|
|
tabs = st.tabs(["Tout", "🚫 Absences", "⏰ Retards", "🚨 Punitions", "📊 Bulletin"]) |
|
|
|
if nom_periode_selectionnee: |
|
with tabs[0]: |
|
afficher_details_periode(client, nom_periode_selectionnee) |
|
with tabs[1]: |
|
afficher_absences([absence for periode in client.periods for absence in periode.absences] if nom_periode_selectionnee == "Année entière" else [absence for periode in client.periods if periode.name == nom_periode_selectionnee for absence in periode.absences]) |
|
with tabs[2]: |
|
afficher_retards([retard for periode in client.periods for retard in periode.delays] if nom_periode_selectionnee == "Année entière" else [retard for periode in client.periods if periode.name == nom_periode_selectionnee for retard in periode.delays]) |
|
with tabs[3]: |
|
afficher_punitions([punition for periode in client.periods for punition in periode.punishments] if nom_periode_selectionnee == "Année entière" else [punition for periode in client.periods if periode.name == nom_periode_selectionnee for punition in periode.punishments]) |
|
with tabs[4]: |
|
if nom_periode_selectionnee == "Année entière": |
|
rapports = [periode.report for periode in client.periods if periode.report] |
|
if rapports: |
|
afficher_rapports(rapports) |
|
else: |
|
st.info("🔴 Aucun rapport disponible pour cette période.") |
|
else: |
|
periode = next((p for p in client.periods if p.name == nom_periode_selectionnee), None) |
|
if periode and periode.report: |
|
afficher_rapports([periode.report]) |
|
else: |
|
st.info("🔴 Aucun rapport disponible pour cette période.") |
|
|
|
if __name__ == "__main__": |
|
client = Client() |
|
app(client) |
|
|
|
|
|
|