Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
2 changed files with 30 additions and 18 deletions
Showing only changes of commit e7081bb367 - Show all commits

View File

@ -10,6 +10,7 @@ from app.models import ModuleImpl, Module, Scolog, FormSemestre, FormSemestreIns
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.auth.models import User from app.auth.models import User
from app.scodoc import sco_abs_notification from app.scodoc import sco_abs_notification
from app.scodoc.sco_archives_justificatifs import JustificatifArchiver
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_utils import ( from app.scodoc.sco_utils import (
EtatAssiduite, EtatAssiduite,
@ -209,6 +210,7 @@ class Assiduite(db.Model):
return nouv_assiduite return nouv_assiduite
def set_moduleimpl(self, moduleimpl_id: int | str) -> bool: def set_moduleimpl(self, moduleimpl_id: int | str) -> bool:
"""TODO"""
moduleimpl: ModuleImpl = ModuleImpl.query.get(moduleimpl_id) moduleimpl: ModuleImpl = ModuleImpl.query.get(moduleimpl_id)
if moduleimpl is not None: if moduleimpl is not None:
# Vérification de l'inscription de l'étudiant # Vérification de l'inscription de l'étudiant
@ -236,13 +238,14 @@ class Assiduite(db.Model):
if formsemestre: if formsemestre:
force = is_assiduites_module_forced(formsemestre_id=formsemestre.id) force = is_assiduites_module_forced(formsemestre_id=formsemestre.id)
else: else:
force = is_assiduites_module_forced(dept_id=etud.dept_id) force = is_assiduites_module_forced(dept_id=self.etudiant.dept_id)
if force: if force:
raise ScoValueError("Module non renseigné") raise ScoValueError("Module non renseigné")
return True return True
def supprimer(self): def supprime(self):
"Supprime l'assiduité. Log et commit."
from app.scodoc import sco_assiduites as scass from app.scodoc import sco_assiduites as scass
if g.scodoc_dept is None and self.etudiant.dept_id is not None: if g.scodoc_dept is None and self.etudiant.dept_id is not None:
@ -262,9 +265,14 @@ class Assiduite(db.Model):
scass.simple_invalidate_cache(obj_dict) scass.simple_invalidate_cache(obj_dict)
def get_formsemestre(self) -> FormSemestre: def get_formsemestre(self) -> FormSemestre:
"""Le formsemestre associé.
Attention: en cas d'inscription multiple prend arbitrairement l'un des semestres.
A utiliser avec précaution !
"""
return get_formsemestre_from_data(self.to_dict()) return get_formsemestre_from_data(self.to_dict())
def get_module(self, traduire: bool = False) -> int | str: def get_module(self, traduire: bool = False) -> int | str:
"TODO"
if self.moduleimpl_id is not None: if self.moduleimpl_id is not None:
if traduire: if traduire:
modimpl: ModuleImpl = ModuleImpl.query.get(self.moduleimpl_id) modimpl: ModuleImpl = ModuleImpl.query.get(self.moduleimpl_id)
@ -412,7 +420,8 @@ class Justificatif(db.Model):
) )
return nouv_justificatif return nouv_justificatif
def supprimer(self): def supprime(self):
"Supprime le justificatif. Log et commit."
from app.scodoc import sco_assiduites as scass from app.scodoc import sco_assiduites as scass
# Récupération de l'archive du justificatif # Récupération de l'archive du justificatif
@ -433,7 +442,7 @@ class Justificatif(db.Model):
# Suppression de l'objet et LOG # Suppression de l'objet et LOG
log(f"delete_justificatif: {self.etudiant.id} {self}") log(f"delete_justificatif: {self.etudiant.id} {self}")
Scolog.logdb( Scolog.logdb(
method=f"delete_justificatif", method="delete_justificatif",
etudid=self.etudiant.id, etudid=self.etudiant.id,
msg=f"Justificatif: {self}", msg=f"Justificatif: {self}",
) )
@ -541,7 +550,8 @@ def get_assiduites_justif(assiduite_id: int, long: bool) -> list[int | dict]:
des identifiants des justificatifs des identifiants des justificatifs
Returns: Returns:
list[int | dict]: La liste des justificatifs (par défaut uniquement les identifiants, sinon les Dict si long est vrai) list[int | dict]: La liste des justificatifs (par défaut uniquement
les identifiants, sinon les dict si long est vrai)
""" """
assi: Assiduite = Assiduite.query.get_or_404(assiduite_id) assi: Assiduite = Assiduite.query.get_or_404(assiduite_id)
return get_justifs_from_date(assi.etudid, assi.date_debut, assi.date_fin, long) return get_justifs_from_date(assi.etudid, assi.date_debut, assi.date_fin, long)
@ -571,7 +581,8 @@ def get_justifs_from_date(
Defaults to False. Defaults to False.
Returns: Returns:
list[int | dict]: La liste des justificatifs (par défaut uniquement les identifiants, sinon les Dict si long est vrai) list[int | dict]: La liste des justificatifs (par défaut uniquement
les identifiants, sinon les dict si long est vrai)
""" """
# On récupère les justificatifs d'un étudiant couvrant la période donnée # On récupère les justificatifs d'un étudiant couvrant la période donnée
justifs: Query = Justificatif.query.filter( justifs: Query = Justificatif.query.filter(
@ -584,8 +595,11 @@ def get_justifs_from_date(
if valid: if valid:
justifs = justifs.filter(Justificatif.etat == EtatJustificatif.VALIDE) justifs = justifs.filter(Justificatif.etat == EtatJustificatif.VALIDE)
# On renvoie la liste des id des justificatifs si long est Faux, sinon on renvoie les dicts des justificatifs # On renvoie la liste des id des justificatifs si long est Faux,
return [j.justif_id if not long else j.to_dict(True) for j in justifs] # sinon on renvoie les dicts des justificatifs
if long:
return [j.to_dict(True) for j in justifs]
return [j.justif_id for j in justifs]
def get_formsemestre_from_data(data: dict[str, datetime | int]) -> FormSemestre: def get_formsemestre_from_data(data: dict[str, datetime | int]) -> FormSemestre:
@ -593,7 +607,8 @@ def get_formsemestre_from_data(data: dict[str, datetime | int]) -> FormSemestre:
get_formsemestre_from_data récupère un formsemestre en fonction des données passées get_formsemestre_from_data récupère un formsemestre en fonction des données passées
Si l'étudiant est inscrit à plusieurs formsemestre, prend le premier. Si l'étudiant est inscrit à plusieurs formsemestre, prend le premier.
Args: Args:
data (dict[str, datetime | int]): Une représentation simplifiée d'une assiduité ou d'un justificatif data (dict[str, datetime | int]): Une représentation simplifiée d'une
assiduité ou d'un justificatif
data = { data = {
"etudid" : int, "etudid" : int,

View File

@ -26,6 +26,7 @@
import datetime import datetime
import re import re
from typing import Any
from flask import g, request, render_template, flash from flask import g, request, render_template, flash
from flask import abort, url_for, redirect, Response from flask import abort, url_for, redirect, Response
@ -88,7 +89,7 @@ class HTMLElement:
self.children: list["HTMLElement"] = [] self.children: list["HTMLElement"] = []
self.self_close: bool = kattr.get("self_close", False) self.self_close: bool = kattr.get("self_close", False)
self.text_content: str = kattr.get("text_content", "") self.text_content: str = kattr.get("text_content", "")
self.key_attributes: dict[str, any] = kattr self.key_attributes: dict[str, Any] = kattr
self.attributes: list[str] = list(attr) self.attributes: list[str] = list(attr)
def add(self, *child: "HTMLElement") -> None: def add(self, *child: "HTMLElement") -> None:
@ -248,7 +249,7 @@ def bilan_dept():
return "\n".join(H) return "\n".join(H)
@bp.route("/ajout_assiduite_etud", methods=["GEt", "POST"]) @bp.route("/ajout_assiduite_etud", methods=["GET", "POST"])
@scodoc @scodoc
@permission_required(Permission.AbsChange) @permission_required(Permission.AbsChange)
def ajout_assiduite_etud(): def ajout_assiduite_etud():
@ -270,9 +271,6 @@ def ajout_assiduite_etud():
# Gestion évaluations (appel à la page depuis les évaluations) # Gestion évaluations (appel à la page depuis les évaluations)
evaluation_id: int = request.args.get("evaluation_id") evaluation_id: int = request.args.get("evaluation_id")
saisie_eval = evaluation_id is not None saisie_eval = evaluation_id is not None
date_deb: str = request.args.get("date_deb")
date_fin: str = request.args.get("date_fin")
moduleimpl_id: int = request.args.get("moduleimpl_id", "") moduleimpl_id: int = request.args.get("moduleimpl_id", "")
redirect_url: str = ( redirect_url: str = (
@ -350,6 +348,7 @@ def _record_assiduite_etud(
ok = True ok = True
debut_jour = "00:00" debut_jour = "00:00"
fin_jour = "23:59:59" fin_jour = "23:59:59"
date_fin = None
# On commence par convertir individuellement tous les champs # On commence par convertir individuellement tous les champs
try: try:
date_debut = datetime.datetime.strptime(form.date_debut.data, "%d/%m/%Y") date_debut = datetime.datetime.strptime(form.date_debut.data, "%d/%m/%Y")
@ -1275,7 +1274,7 @@ def tableau_assiduite_actions():
# Suppression : attention, POST ou GET ! # Suppression : attention, POST ou GET !
if action == "supprimer": if action == "supprimer":
objet.supprimer() objet.supprime()
flash(f"{objet_name} supprimé") flash(f"{objet_name} supprimé")
return redirect(request.referrer) return redirect(request.referrer)
@ -1640,9 +1639,7 @@ def signal_evaluation_abs(etudid: int = None, evaluation_id: int = None):
"assiduites.ajout_assiduite_etud", "assiduites.ajout_assiduite_etud",
etudid=etudid, etudid=etudid,
evaluation_id=evaluation.id, evaluation_id=evaluation.id,
date_deb=evaluation.date_debut.strftime( date_deb=evaluation.date_debut.strftime("%Y-%m-%dT%H:%M:%S"),
"%Y-%m-%dT%H:%M:%S"
), # XXX TODO
date_fin=evaluation.date_fin.strftime("%Y-%m-%dT%H:%M:%S"), date_fin=evaluation.date_fin.strftime("%Y-%m-%dT%H:%M:%S"),
moduleimpl_id=evaluation.moduleimpl.id, moduleimpl_id=evaluation.moduleimpl.id,
saisie_eval="true", saisie_eval="true",