1
0
forked from ScoDoc/ScoDoc

Quelques commentaires rapides

This commit is contained in:
Emmanuel Viennet 2022-12-25 11:42:58 -03:00
parent f96571f520
commit e2ca9d417f
3 changed files with 39 additions and 14 deletions

View File

@ -28,7 +28,12 @@ import app.scodoc.sco_assiduites as scass
@api_web_bp.route("/assiduite/<int:assiduiteid>") @api_web_bp.route("/assiduite/<int:assiduiteid>")
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def assiduite(assiduiteid: int = None): # XEV à revoir pour les droits d'accès par département
def assiduite(
assiduite_id: int = None,
): # XEV xxx_id (sauf pour etudid qui est l'exception qui confirme la règle)
"""Retourne un objet assiduité à partir de son id """Retourne un objet assiduité à partir de son id
Exemple de résultat: Exemple de résultat:
@ -41,10 +46,14 @@ def assiduite(assiduiteid: int = None):
"etat": "retard" "etat": "retard"
} }
""" """
# XEV je pense qu'il faut requeter ainsi pour vérifier qu'on est dans le bon département
# afin que quelqu'un avec la paermission ScoView dans son département n'ait pas
# accès aux infos des autres départements: à tester
query = Assiduite.query.filter_by(id=assiduite_id)
if g.scodoc_dept:
query = query.join(Identite).filter_by(dept_id=g.scodoc_dept_id)
assiduite = Assiduite.query.get(assiduiteid) assiduite = query.first_or_404()
if assiduite is None:
return json_error(404, message="assiduité inexistante")
data = assiduite.to_dict() data = assiduite.to_dict()

View File

@ -19,7 +19,7 @@ class Assiduite(db.Model):
__tablename__ = "assiduites" __tablename__ = "assiduites"
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
assiduiteid = db.synonym("id") assiduite_id = db.synonym("id")
date_debut = db.Column( date_debut = db.Column(
db.DateTime(timezone=True), server_default=db.func.now(), nullable=False db.DateTime(timezone=True), server_default=db.func.now(), nullable=False
@ -58,12 +58,14 @@ class Assiduite(db.Model):
date_debut: datetime, date_debut: datetime,
date_fin: datetime, date_fin: datetime,
etat: EtatAssiduite, etat: EtatAssiduite,
module: int or None = None, module: int
or None = None, # XEV est-ce un id (alors module_id ou modimpl_id), ou un objet (ModuleImpl ??) => cela simplifiera le check d'erreur
) -> object or int: ) -> object or int:
"""Créer une nouvelle assiduité pour l'étudiant """Créer une nouvelle assiduité pour l'étudiant
Documentation des codes d'erreurs renvoyés: Documentation des codes d'erreurs renvoyés:
1: Duplication des assiduités (la période rentrée rentre en conflit avec une assiduité enregistrée) 1: Duplication des assiduités (la période rentrée rentre en conflit avec une assiduité enregistrée)
2: l'ID du module_impl n'existe pas. 2: l'ID du module_impl n'existe pas.
#XEV => utiliser plutôt des exceptions.
""" """
# Vérification de non duplication des périodes # Vérification de non duplication des périodes
assiduites: list[Assiduite] = etud.assiduites.all() assiduites: list[Assiduite] = etud.assiduites.all()
@ -73,16 +75,16 @@ class Assiduite(db.Model):
assiduites = [ assiduites = [
ass ass
for ass in assiduites for ass in assiduites
if verif_interval( if verif_interval( # XEV
(date_debut, date_fin), (date_debut, date_fin),
(ass.date_debut, ass.date_fin), (ass.date_debut, ass.date_fin),
) )
] ]
if len(assiduites) != 0: if len(assiduites) != 0:
return 1 return 1 # XEV raise une exception
if module is not None: if module is not None:
# Vérification de l'existance du module pour l'étudiant # Vérification de l'existence du module pour l'étudiant
if cls.verif_moduleimpl(module, etud): if cls.verif_moduleimpl(module, etud):
nouv_assiduite = Assiduite( nouv_assiduite = Assiduite(
date_debut=date_debut, date_debut=date_debut,
@ -110,7 +112,12 @@ class Assiduite(db.Model):
Retourne Vrai si c'est le cas, faux sinon Retourne Vrai si c'est le cas, faux sinon
""" """
# XEV: cette méthode n'a pas de raison d'être dans la classe Assiduite
# et pourrait etre ModuleImpl.est_inscrit(etud)
# + éviter les "Identite or int" : cela complique les tests, mieux vaut avoir un type unique bien défini.
output = True output = True
# XEV: "module" est un "modimpl": changer nom sinon on pense que c'est un Module
module: ModuleImpl = ModuleImpl.query.filter_by( module: ModuleImpl = ModuleImpl.query.filter_by(
moduleimpl_id=moduleimpl_id moduleimpl_id=moduleimpl_id
).first() ).first()
@ -119,6 +126,8 @@ class Assiduite(db.Model):
if output: if output:
search_etudid: int = etud.id if type(etud) == Identite else etud search_etudid: int = etud.id if type(etud) == Identite else etud
# XEV: is_xxx indique un booléen, or ici is_module est un comptage
is_module: int = ModuleImplInscription.query.filter_by( is_module: int = ModuleImplInscription.query.filter_by(
etudid=search_etudid, moduleimpl_id=moduleimpl_id etudid=search_etudid, moduleimpl_id=moduleimpl_id
).count() ).count()
@ -158,7 +167,8 @@ class Justificatif(db.Model):
) )
raison = db.Column(db.Text()) raison = db.Column(db.Text())
fichier = db.Column(db.Integer()) fichier = db.Column(db.Integer()) # XEV qu'est-ce que cet entier ?
# XEV pour les fichiers stockés, on va utiliser sco_archives.py
def to_dict(self) -> dict: def to_dict(self) -> dict:
data = { data = {

View File

@ -150,11 +150,12 @@ def is_iso_formated(date: str, convert=False) -> bool or datetime.datetime or No
def localize_datetime(date: datetime.datetime or str) -> datetime.datetime: def localize_datetime(date: datetime.datetime or str) -> datetime.datetime:
if type(date) == str: # XEV A documenter
if type(date) == str: # XEV utiliser isinstance
date = is_iso_formated(date, convert=True) date = is_iso_formated(date, convert=True)
new_date: datetime.datetime = date new_date: datetime.datetime = date
if date.tzinfo == None: if date.tzinfo == None: # XEV utiliser "is None"
from app.models.assiduites import Assiduite from app.models.assiduites import Assiduite
first_assiduite = Assiduite.query.first() first_assiduite = Assiduite.query.first()
@ -167,14 +168,19 @@ def localize_datetime(date: datetime.datetime or str) -> datetime.datetime:
return new_date return new_date
def verif_interval( def verif_interval( # XEV à renommer pour avoir nom de fonction plus explicite, genre dates_se_recouvrent() ou en anglais is_overlapping ???
periode: tuple[datetime.datetime], interval: tuple[datetime.datetime] periode: tuple[datetime.datetime], interval: tuple[datetime.datetime]
) -> bool: ) -> bool:
# XEV n'est-ce pas plutot tuple[datetime.datetime,datetime.datetime] ?
""" """
Vérifie si une période est comprise dans un interval, chevauche l'interval ou comprend l'interval Vérifie si une période est comprise dans un interval, chevauche l'interval ou comprend l'interval
#XEV: "vrai si la période et de l'intervalle intersectent"
Retourne Vrai si c'est le cas, faux sinon Retourne Vrai si c'est le cas, faux sinon
""" """
# XEV: si je comprends bien, il suffirait de vérifier les bornes
# voir par exemple https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-if-two-ranges-overlap
p_deb, p_fin = periode p_deb, p_fin = periode
i_deb, i_fin = interval i_deb, i_fin = interval