diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py
index 07e778cf..3990cd82 100644
--- a/app/scodoc/sco_assiduites.py
+++ b/app/scodoc/sco_assiduites.py
@@ -4,9 +4,9 @@ Ecrit par Matthias Hartmann.
from datetime import date, datetime, time, timedelta
from pytz import UTC
-from app import log
+from app import log, db
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.formsemestre import FormSemestre, FormSemestreInscription
from app.scodoc import sco_formsemestre_inscriptions
@@ -141,11 +141,11 @@ class CountCalculator:
self.hours += finish_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"""
assi: Assiduite
assiduites: list[Assiduite] = (
- assiduites.all() if isinstance(assiduites, Assiduite) else assiduites
+ assiduites.all() if isinstance(assiduites, Query) else assiduites
)
for assi in assiduites:
self.count += 1
@@ -408,6 +408,42 @@ def get_all_justified(
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
def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]:
"""Les comptes d'absences de cet étudiant dans ce semestre:
diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py
index b27098ef..728ccb36 100644
--- a/app/scodoc/sco_groups_view.py
+++ b/app/scodoc/sco_groups_view.py
@@ -833,7 +833,7 @@ def tab_absences_html(groups_infos, etat=None):
"
",
form_choix_jour_saisie_hebdo(groups_infos),
"",
- f"""État des assiduités du groupe""",
"",
@@ -890,76 +890,38 @@ def form_choix_jour_saisie_hebdo(groups_infos, moduleimpl_id=None):
authuser = current_user
if not authuser.has_permission(Permission.ScoAbsChange):
return ""
- sem = groups_infos.formsemestre
- first_monday = sco_cal.ddmmyyyy(sem["date_debut"]).prev_monday()
- today_idx = datetime.date.today().weekday()
-
- FA = [] # formulaire avec menu saisi absences
- FA.append(
- # TODO-ASSIDUITE et utiliser url_for... (was Absences/SignaleAbsenceGrSemestre)
- '")
- return "\n".join(FA)
+ return f"""
+
+ """
-# Ajout Le Havre
-# Formulaire saisie absences semaine
+# Saisie de l'assiduité par semaine
def form_choix_saisie_semaine(groups_infos):
authuser = current_user
if not authuser.has_permission(Permission.ScoAbsChange):
return ""
- # construit l'URL "destination"
- # (a laquelle on revient apres saisie absences)
query_args = parse_qs(request.query_string)
- moduleimpl_id = query_args.get("moduleimpl_id", [""])[0]
- if "head_message" in query_args:
- del query_args["head_message"]
- destination = "%s?%s" % (
- request.base_url,
- urllib.parse.urlencode(query_args, True),
- )
- destination = destination.replace(
- "%", "%%"
- ) # car ici utilisee dans un format string !
-
- DateJour = time.strftime("%d/%m/%Y")
- datelundi = sco_cal.ddmmyyyy(DateJour).prev_monday()
- FA = [] # formulaire avec menu saisie hebdo des absences
- # XXX TODO-ASSIDUITE et utiliser un POST
- FA.append('")
- return "\n".join(FA)
+ moduleimpl_id = query_args.get("moduleimpl_id", [None])[0]
+ semaine = datetime.date.today().isocalendar().week
+ return f"""
+
+ """
def export_groups_as_moodle_csv(formsemestre_id=None):
diff --git a/app/scodoc/sco_moduleimpl_status.py b/app/scodoc/sco_moduleimpl_status.py
index 8d438d79..68c04f01 100644
--- a/app/scodoc/sco_moduleimpl_status.py
+++ b/app/scodoc/sco_moduleimpl_status.py
@@ -331,6 +331,21 @@ def moduleimpl_status(moduleimpl_id=None, partition_id=None):
}&formsemestre_id={formsemestre.id}
&moduleimpl_id={moduleimpl_id}
"
+ >Saisie Absences journée
+ """
+ )
+
+ H.append(
+ f"""
+ Saisie Absences hebdo
"""
)
diff --git a/app/views/absences.py b/app/views/absences.py
index 3268bb4c..fd8a1443 100644
--- a/app/views/absences.py
+++ b/app/views/absences.py
@@ -56,6 +56,7 @@ from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import html_sco_header
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_etud
from app.scodoc import sco_preferences
@@ -312,54 +313,16 @@ def _ProcessBilletAbsence(
n = 0 # nombre de demi-journées d'absence ajoutées
# 1-- Ajout des absences (et justifs)
- datedebut = billet.abs_begin.strftime("%d/%m/%Y")
- datefin = billet.abs_end.strftime("%d/%m/%Y")
- dates = sco_cal.DateRangeISO(datedebut, datefin)
- # commence après-midi ?
- if dates and billet.abs_begin.hour > 11:
- # XXX TODO-ASSIDUITE
- raise ScoValueError("Fonction non disponible")
- sco_abs.add_absence(
- billet.etudid,
- 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
+ datedebut = billet.abs_begin
+ datefin = billet.abs_end
+ log(f"Gestion du billet n°{billet.id}")
+ n = scass.create_absence(
+ date_debut=datedebut,
+ date_fin=datefin,
+ etudid=billet.etudid,
+ description=description,
+ est_just=estjust,
+ )
# 2- Change état du billet
billet.etat = True
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index 4e13e807..958a3ae5 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -1002,7 +1002,9 @@ def signal_assiduites_diff():
"assiduites/pages/signal_assiduites_diff.j2",
diff=_differee(
etudiants=etudiants,
- moduleimpl_select=_module_selector(formsemestre),
+ moduleimpl_select=_module_selector(
+ formsemestre, request.args.get("moduleimpl_id", None)
+ ),
date=date,
periode={
"deb": formsemestre.date_debut.isoformat(),
@@ -1162,6 +1164,11 @@ def _module_selector(
)
modules.append({"moduleimpl_id": modimpl["moduleimpl_id"], "name": modname})
+ try:
+ moduleimpl_id = int(moduleimpl_id)
+ except (ValueError, TypeError):
+ moduleimpl_id = None
+
return render_template(
"assiduites/widgets/moduleimpl_selector.j2",
selected=selected,