File size: 3,714 Bytes
a01c266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from collections import defaultdict

def calculate_average(grades):
    total_points, total_coefficients = 0, 0
    for grade in grades:
        try:
            if grade.grade.lower() != 'absent':
                numeric_grade = float(grade.grade)
                grade_out_of = float(grade.out_of)
                coefficient = float(grade.coefficient)
                normalized_grade = (numeric_grade / grade_out_of) * 20
                total_points += normalized_grade * coefficient
                total_coefficients += coefficient
        except ValueError:
            continue
    return total_points / total_coefficients if total_coefficients > 0 else "Aucune Note"

def app(client):
    st.title('📝 Notes')

    # Dropdown pour sélectionner la période
    selected_period = st.selectbox("🧷 Sélectionner la période", ["Trimestre 1", "Trimestre 2", "Trimestre 3", "Année"])

    # Filtrer les périodes en fonction de la sélection
    if selected_period == "Année":
        periods_to_display = client.periods
    else:
        periods_to_display = [period for period in client.periods if period.name == selected_period]

    # Créer une liste des matières pour les onglets
    tab_labels = sorted({grade.subject.name for period in periods_to_display for grade in period.grades})

    # Créer des onglets pour les matières
    tabs = st.tabs(tab_labels)

    for tab, subject in zip(tabs, tab_labels):
        with tab:
            # Afficher les notes pour toutes les périodes sélectionnées
            for period in periods_to_display:
                # Organiser les notes par matière
                grades_by_subject = defaultdict(list)
                for grade in period.grades:
                    grades_by_subject[grade.subject.name].append(grade)

                # Afficher les notes pour la matière de l'onglet actuel
                if subject in grades_by_subject:
                    for grade in grades_by_subject[subject]:
                        with st.expander(f"📝 {grade.grade}/{grade.out_of} | {"📎 " + grade.comment if grade.comment else "Et voilà, ça ne donne pas de nom !"} (📅 {grade.date})"):
                            st.markdown("### Information")
                            st.write(f"**Commentaire** : {grade.comment}")
                            st.write(f"**Date** : {grade.date}")
                            st.write(f"**Coefficient** : {grade.coefficient}")
                            if grade.is_bonus:
                                st.write(f"**Note Bonus** (*Est pris en compte seulement les points au-dessus de 10*)")
                            if grade.is_optionnal:
                                st.write(f"**Note Optionnelle** (*Est pris en compte seulement si la note augmente la moyenne*)")
                            st.markdown("### Eleve")
                            st.write(f"{grade.grade}/{grade.out_of}")
                            st.markdown("### Classe")
                            st.write(f"**Moyenne** : {grade.average}")
                            st.write(f"**Minimum** : {grade.min}")
                            st.write(f"**Maximum** : {grade.max}")

    # Instead of directly calculating the overall average, gather all grades
    all_grades = []
    for period in periods_to_display:
        for grade in period.grades:
            all_grades.append(grade)

    # Use the calculate_average function to calculate the overall average
    overall_average = calculate_average(all_grades)
    
    st.subheader("⭐ Moyenne Générale")
    if isinstance(overall_average, str):
        st.write(overall_average)
    else:
        st.write(f"### {overall_average:.2f}/20")