Merge branch 'main96' of https://scodoc.org/git/iziram/ScoDoc into iziram-main96

This commit is contained in:
Emmanuel Viennet 2024-03-29 16:37:19 +01:00
commit 3e0b19c4a8
5 changed files with 112 additions and 1127 deletions

View File

@ -372,12 +372,38 @@ def str_to_time(time_str: str) -> time:
def get_assiduites_stats(
assiduites: Query, metric: str = "all", filtered: dict[str, object] = None
) -> dict[str, int | float]:
"""Compte les assiduités en fonction des filtres"""
# XXX TODO-assiduite : documenter !!!
# Que sont les filtres ? Quelles valeurs ?
# documenter permet de faire moins de bug: qualité du code non satisfaisante.
#
# + on se perd entre les clés en majuscules et en minuscules. Pourquoi
"""
Calcule les statistiques sur les assiduités
(nombre de jours, demi-journées et heures passées,
non justifiées, justifiées et total)
Les filtres :
- etat : filtre les assiduités par leur état
valeur : (absent, present, retard)
- date_debut/date_fin : prend les assiduités qui se trouvent entre les dates
valeur : datetime.datetime
- moduleimpl_id : filtre les assiduités en fonction du moduleimpl_id
valeur : int | None
- formsemestre : prend les assiduités du formsemestre donné
valeur : FormSemestre
- formsemestre_modimpls : prend les assiduités avec un moduleimpl du formsemestre
valeur : FormSemestre
- est_just : filtre les assiduités en fonction de si elles sont justifiées ou non
valeur : bool
- user_id : filtre les assiduités en fonction de l'utilisateur qui les a créées
valeur : int
- split : effectue un comptage par état d'assiduité
valeur : str (du moment que la clé est présente dans filtered)
Les métriques :
- journee : comptage en nombre de journée
- demi : comptage en nombre de demi journée
- heure : comptage en heure
- compte : nombre d'objets
- all : renvoi toute les métriques
"""
if filtered is not None:
deb, fin = None, None
@ -414,34 +440,71 @@ def get_assiduites_stats(
calculator: CountCalculator = CountCalculator()
calculator.compute_assiduites(assiduites)
# S'il n'y a pas de filtre ou que le filtre split n'est pas dans les filtres
if filtered is None or "split" not in filtered:
# On récupère le comptage total
# only_total permet de ne récupérer que le total
count: dict = calculator.to_dict(only_total=True)
# On ne garde que les métriques demandées
for key, val in count.items():
if key in metrics:
output[key] = val
# On renvoie le total si on a rien demandé (ou que metrics == ["all"])
return output if output else count
# Récupération des états
etats: list[str] = (
filtered["etat"].split(",") if "etat" in filtered else scu.EtatAssiduite.all()
)
# être sur que les états sont corrects
etats = [etat for etat in etats if etat.upper() in scu.EtatAssiduite.all()]
# Préparation du dictionnaire de retour avec les valeurs du calcul
count: dict = calculator.to_dict(only_total=False)
# Récupération des états depuis la saisie utilisateur
etats: list[str] = (
filtered["etat"].split(",") if "etat" in filtered else scu.EtatAssiduite.all()
)
for etat in etats:
# TODO-assiduite: on se perd entre les lower et upper.
# Pourquoi EtatAssiduite est en majuscules si tout le reste est en minuscules ?
etat = etat.lower()
# On vérifie que l'état est bien un état d'assiduité
# sinon on passe à l'état suivant
if not scu.EtatAssiduite.contains(etat):
continue
# On récupère le comptage pour chaque état
if etat != "present":
output[etat] = count[etat]
output[etat]["justifie"] = count[etat + "_just"]
output[etat]["non_justifie"] = count[etat + "_non_just"]
else:
output[etat] = count[etat]
output["total"] = count["total"]
# le dictionnaire devrait ressembler à :
# {
# "absent": {
# "journee": 1,
# "demi": 2,
# "heure": 3,
# "compte": 4,
# "justifie": {
# "journee": 1,
# "demi": 2,
# "heure": 3,
# "compte": 4
# },
# "non_justifie": {
# "journee": 1,
# "demi": 2,
# "heure": 3,
# "compte": 4
# }
# },
# ...
# "total": {
# "journee": 1,
# "demi": 2,
# "heure": 3,
# "compte": 4
# }
# }
return output

View File

@ -202,6 +202,7 @@ class BiDirectionalEnum(Enum):
"""Permet la recherche inverse d'un enum
Condition : les clés et les valeurs doivent être uniques
les clés doivent être en MAJUSCULES
=> (respect de la convention des constantes)
"""
@classmethod
@ -213,10 +214,17 @@ class BiDirectionalEnum(Enum):
return attr.upper() in cls._member_names_
@classmethod
def all(cls, keys=True):
"""Retourne toutes les clés de l'enum"""
def all(cls, keys=True) -> tuple[str | object]:
"""Retourne toutes les clés de l'enum (en minuscules) ou les valeurs"""
return (
tuple(
k.lower()
# pylint: disable-next=no-member
return cls._member_names_ if keys else list(cls._value2member_map_.keys())
for k in cls._member_names_
) # renvoie les clés en minuscules
if keys
else tuple(cls._value2member_map_.keys()) # renvoie les valeurs
)
@classmethod
def get(cls, attr: str, default: any = None):

View File

@ -616,7 +616,7 @@ main();
- Bouton conflit si conflit de période
--->
<div id="tableau-periode" class="grid-table">
<div id="tableau-periode" class="grid-table hidden">
<!-- Première ligne : Plages -->
<div class="ligne" id="tete-table">
<div class="cell header sticky">Étudiants</div>

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,10 @@
"assiduites";"/assiduites/1";"ScoView";"GET";
"assiduites";"/assiduites/1/query?etat=retard";"ScoView";"GET";
"assiduites";"/assiduites/1/query?moduleimpl_id=1";"ScoView";"GET";
"assiduites";"/assiduites/1/query?with_justifs=";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count/query?etat=retard";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count/query?split";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
"assiduites_formsemestre";"/assiduites/formsemestre/1";"ScoView";"GET";
"assiduites_formsemestre";"/assiduites/formsemestre/1/query?etat=retard";"ScoView";"GET";
@ -12,15 +14,23 @@
"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count";"ScoView";"GET";
"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=retard";"ScoView";"GET";
"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
"assiduite_create";"/assiduite/1/create";"ScoView";"POST";"[{""date_debut"": ""2022-10-27T08:00"",""date_fin"": ""2022-10-27T10:00"",""etat"": ""absent""}]"
"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""etat"":""absent""}"
"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""moduleimpl_id"":2}"
"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""etat"": ""retard"",""moduleimpl_id"":3}"
"assiduite_delete";"/assiduite/delete";"ScoView";"POST";"[2,2,3]"
"assiduites_group";"/assiduites/group/query?etudids=1,2,3";"ScoView";"GET";
"assiduites_justificatifs";"/assiduite/1/justificatifs";"ScoView";"GET";
"assiduites_justificatifs";"/assiduite/1/justificatifs/long";"ScoView";"GET";
"assiduite_create";"/assiduite/1/create";"UsersAdmin";"POST";"[{""date_debut"": ""2023-10-27T08:00"",""date_fin"": ""2023-10-27T10:00"",""etat"": ""absent""}]"
"assiduite_create";"/assiduite/1/create";"UsersAdmin";"POST";"[{""date_debut"": ""2023-10-27T08:00"",""date_fin"": ""2023-10-27T10:00"",""etat"": ""absent""}]"
"assiduites_create";"/assiduites/create";"UsersAdmin";"POST";"[{""etudid"":1,""date_debut"": ""2023-10-26T08:00"",""date_fin"": ""2023-10-26T10:00"",""etat"": ""absent""}]"
"assiduites_create";"/assiduites/create";"UsersAdmin";"POST";"[{""etudid"":-1,""date_debut"": ""2023-10-26T08:00"",""date_fin"": ""2023-10-26T10:00"",""etat"": ""absent""}]"
"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""etat"":""absent""}"
"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""moduleimpl_id"":2}"
"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""etat"": ""retard"",""moduleimpl_id"":3}"
"assiduite_delete";"/assiduite/delete";"UsersAdmin";"POST";"[2,2,3]"
"justificatif";"/justificatif/1";"ScoView";"GET";
"justificatifs";"/justificatifs/1";"ScoView";"GET";
"justificatifs";"/justificatifs/1/query?etat=attente";"ScoView";"GET";
"justificatif_create";"/justificatif/1/create";"ScoView";"POST";"[{""date_debut"": ""2022-10-27T08:00"",""date_fin"": ""2022-10-27T10:00"",""etat"": ""attente""}]"
"justificatif_edit";"/justificatif/1/edit";"ScoView";"POST";"{""etat"":""valide""}"
"justificatif_edit";"/justificatif/1/edit";"ScoView";"POST";"{""raison"":""MEDIC""}"
"justificatif_delete";"/justificatif/delete";"ScoView";"POST";"[2,2,3]"
"justificatifs";"/justificatifs/dept/1";"ScoView";"GET";
"justificatifs";"/justificatifs/formsemestre/1";"ScoView";"GET";
"justificatif_create";"/justificatif/1/create";"UsersAdmin";"POST";"[{""date_debut"": ""2023-10-27T08:00"",""date_fin"": ""2023-10-27T10:00"",""etat"": ""attente""}]"
"justificatif_edit";"/justificatif/1/edit";"UsersAdmin";"POST";"{""etat"":""valide""}"
"justificatif_edit";"/justificatif/1/edit";"UsersAdmin";"POST";"{""raison"":""MEDIC""}"
"justificatif_delete";"/justificatif/delete";"UsersAdmin";"POST";"[2,2,3]"
1 entry_name url permission method content
3 assiduites /assiduites/1 ScoView GET
4 assiduites /assiduites/1/query?etat=retard ScoView GET
5 assiduites /assiduites/1/query?moduleimpl_id=1 ScoView GET
6 assiduites /assiduites/1/query?with_justifs= ScoView GET
7 assiduites_count /assiduites/1/count ScoView GET
8 assiduites_count /assiduites/1/count/query?etat=retard ScoView GET
9 assiduites_count /assiduites/1/count/query?split ScoView GET
10 assiduites_count /assiduites/1/count/query?etat=present,retard&metric=compte,heure ScoView GET
11 assiduites_formsemestre /assiduites/formsemestre/1 ScoView GET
12 assiduites_formsemestre /assiduites/formsemestre/1/query?etat=retard ScoView GET
14 assiduites_formsemestre_count /assiduites/formsemestre/1/count ScoView GET
15 assiduites_formsemestre_count /assiduites/formsemestre/1/count/query?etat=retard ScoView GET
16 assiduites_formsemestre_count /assiduites/formsemestre/1/count/query?etat=present,retard&metric=compte,heure ScoView GET
17 assiduite_create assiduites_group /assiduite/1/create /assiduites/group/query?etudids=1,2,3 ScoView POST GET [{"date_debut": "2022-10-27T08:00","date_fin": "2022-10-27T10:00","etat": "absent"}]
18 assiduite_edit assiduites_justificatifs /assiduite/1/edit /assiduite/1/justificatifs ScoView POST GET {"etat":"absent"}
19 assiduite_edit assiduites_justificatifs /assiduite/1/edit /assiduite/1/justificatifs/long ScoView POST GET {"moduleimpl_id":2}
20 assiduite_edit assiduite_create /assiduite/1/edit /assiduite/1/create ScoView UsersAdmin POST {"etat": "retard","moduleimpl_id":3} [{"date_debut": "2023-10-27T08:00","date_fin": "2023-10-27T10:00","etat": "absent"}]
21 assiduite_delete assiduite_create /assiduite/delete /assiduite/1/create ScoView UsersAdmin POST [2,2,3] [{"date_debut": "2023-10-27T08:00","date_fin": "2023-10-27T10:00","etat": "absent"}]
22 assiduites_create /assiduites/create UsersAdmin POST [{"etudid":1,"date_debut": "2023-10-26T08:00","date_fin": "2023-10-26T10:00","etat": "absent"}]
23 assiduites_create /assiduites/create UsersAdmin POST [{"etudid":-1,"date_debut": "2023-10-26T08:00","date_fin": "2023-10-26T10:00","etat": "absent"}]
24 assiduite_edit /assiduite/1/edit UsersAdmin POST {"etat":"absent"}
25 assiduite_edit /assiduite/1/edit UsersAdmin POST {"moduleimpl_id":2}
26 assiduite_edit /assiduite/1/edit UsersAdmin POST {"etat": "retard","moduleimpl_id":3}
27 assiduite_delete /assiduite/delete UsersAdmin POST [2,2,3]
28 justificatif /justificatif/1 ScoView GET
29 justificatifs /justificatifs/1 ScoView GET
30 justificatifs /justificatifs/1/query?etat=attente ScoView GET
31 justificatif_create justificatifs /justificatif/1/create /justificatifs/dept/1 ScoView POST GET [{"date_debut": "2022-10-27T08:00","date_fin": "2022-10-27T10:00","etat": "attente"}]
32 justificatif_edit justificatifs /justificatif/1/edit /justificatifs/formsemestre/1 ScoView POST GET {"etat":"valide"}
33 justificatif_edit justificatif_create /justificatif/1/edit /justificatif/1/create ScoView UsersAdmin POST {"raison":"MEDIC"} [{"date_debut": "2023-10-27T08:00","date_fin": "2023-10-27T10:00","etat": "attente"}]
34 justificatif_delete justificatif_edit /justificatif/delete /justificatif/1/edit ScoView UsersAdmin POST [2,2,3] {"etat":"valide"}
35 justificatif_edit /justificatif/1/edit UsersAdmin POST {"raison":"MEDIC"}
36 justificatif_delete /justificatif/delete UsersAdmin POST [2,2,3]