Assiduites: traitement billets absences #699

This commit is contained in:
iziram 2023-09-06 16:41:46 +02:00
parent 483c86d904
commit be6cf7a62d
2 changed files with 51 additions and 52 deletions

View File

@ -4,9 +4,9 @@ Ecrit par Matthias Hartmann.
from datetime import date, datetime, time, timedelta from datetime import date, datetime, time, timedelta
from pytz import UTC from pytz import UTC
from app import log from app import log, db
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.models.assiduites import Assiduite, Justificatif from app.models.assiduites import Assiduite, Justificatif, compute_assiduites_justified
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.models.formsemestre import FormSemestre, FormSemestreInscription from app.models.formsemestre import FormSemestre, FormSemestreInscription
from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_formsemestre_inscriptions
@ -141,11 +141,11 @@ class CountCalculator:
self.hours += finish_hours.total_seconds() / 3600 self.hours += finish_hours.total_seconds() / 3600
self.hours += self.hour_per_day - (start_hours.total_seconds() / 3600) self.hours += self.hour_per_day - (start_hours.total_seconds() / 3600)
def compute_assiduites(self, assiduites: Assiduite): def compute_assiduites(self, assiduites: Query or list):
"""Calcule les métriques pour la collection d'assiduité donnée""" """Calcule les métriques pour la collection d'assiduité donnée"""
assi: Assiduite assi: Assiduite
assiduites: list[Assiduite] = ( assiduites: list[Assiduite] = (
assiduites.all() if isinstance(assiduites, Assiduite) else assiduites assiduites.all() if isinstance(assiduites, Query) else assiduites
) )
for assi in assiduites: for assi in assiduites:
self.count += 1 self.count += 1
@ -408,6 +408,42 @@ def get_all_justified(
return after return after
def create_absence(
date_debut: datetime,
date_fin: datetime,
etudid: int,
description: str = None,
est_just: bool = False,
) -> int:
etud: Identite = Identite.query.filter_by(etudid=etudid).first_or_404()
assiduite_unique: Assiduite = Assiduite.create_assiduite(
etud=etud,
date_debut=date_debut,
date_fin=date_fin,
etat=scu.EtatAssiduite.ABSENT,
description=description,
)
db.session.add(assiduite_unique)
db.session.commit()
if est_just:
justi = Justificatif.create_justificatif(
etud=etud,
date_debut=date_debut,
date_fin=date_fin,
etat=scu.EtatJustificatif.VALIDE,
raison=description,
)
db.session.add(justi)
db.session.commit()
compute_assiduites_justified(etud.id, [justi])
calculator: CountCalculator = CountCalculator()
calculator.compute_assiduites([assiduite_unique])
return calculator.to_dict()["demi"]
# Gestion du cache # Gestion du cache
def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]: def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]:
"""Les comptes d'absences de cet étudiant dans ce semestre: """Les comptes d'absences de cet étudiant dans ce semestre:

View File

@ -56,6 +56,7 @@ from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.TrivialFormulator import TrivialFormulator from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import html_sco_header from app.scodoc import html_sco_header
from app.scodoc import sco_cal from app.scodoc import sco_cal
from app.scodoc import sco_assiduites as scass
from app.scodoc import sco_abs_billets from app.scodoc import sco_abs_billets
from app.scodoc import sco_etud from app.scodoc import sco_etud
from app.scodoc import sco_preferences from app.scodoc import sco_preferences
@ -312,54 +313,16 @@ def _ProcessBilletAbsence(
n = 0 # nombre de demi-journées d'absence ajoutées n = 0 # nombre de demi-journées d'absence ajoutées
# 1-- Ajout des absences (et justifs) # 1-- Ajout des absences (et justifs)
datedebut = billet.abs_begin.strftime("%d/%m/%Y") datedebut = billet.abs_begin
datefin = billet.abs_end.strftime("%d/%m/%Y") datefin = billet.abs_end
dates = sco_cal.DateRangeISO(datedebut, datefin) log(f"Gestion du billet n°{billet.id}")
# commence après-midi ? n = scass.create_absence(
if dates and billet.abs_begin.hour > 11: date_debut=datedebut,
# XXX TODO-ASSIDUITE date_fin=datefin,
raise ScoValueError("Fonction non disponible") etudid=billet.etudid,
sco_abs.add_absence( description=description,
billet.etudid, est_just=estjust,
dates[0], )
0,
estjust,
description=description,
)
n += 1
dates = dates[1:]
# termine matin ?
if dates and billet.abs_end.hour < 12:
# XXX TODO-ASSIDUITE
raise ScoValueError("Fonction non disponible")
sco_abs.add_absence(
billet.etudid,
dates[-1],
1,
estjust,
description=description,
)
n += 1
dates = dates[:-1]
for jour in dates:
raise ScoValueError("Fonction non disponible")
sco_abs.add_absence(
billet.etudid,
jour,
0,
estjust,
description=description,
)
# XXX TODO-ASSIDUITE
sco_abs.add_absence(
billet.etudid,
jour,
1,
estjust,
description=description,
)
n += 2
# 2- Change état du billet # 2- Change état du billet
billet.etat = True billet.etat = True