diff --git a/app/api/assiduites.py b/app/api/assiduites.py index e2853dae7..d9e4abf50 100644 --- a/app/api/assiduites.py +++ b/app/api/assiduites.py @@ -28,7 +28,12 @@ import app.scodoc.sco_assiduites as scass @api_web_bp.route("/assiduite/") @scodoc @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 Exemple de résultat: @@ -41,10 +46,14 @@ def assiduite(assiduiteid: int = None): "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) - if assiduite is None: - return json_error(404, message="assiduité inexistante") + assiduite = query.first_or_404() data = assiduite.to_dict() diff --git a/app/models/assiduites.py b/app/models/assiduites.py index cd930e608..80ef1321e 100644 --- a/app/models/assiduites.py +++ b/app/models/assiduites.py @@ -19,7 +19,7 @@ class Assiduite(db.Model): __tablename__ = "assiduites" id = db.Column(db.Integer, primary_key=True) - assiduiteid = db.synonym("id") + assiduite_id = db.synonym("id") date_debut = db.Column( db.DateTime(timezone=True), server_default=db.func.now(), nullable=False @@ -58,12 +58,14 @@ class Assiduite(db.Model): date_debut: datetime, date_fin: datetime, 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: """Créer une nouvelle assiduité pour l'étudiant 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) 2: l'ID du module_impl n'existe pas. + #XEV => utiliser plutôt des exceptions. """ # Vérification de non duplication des périodes assiduites: list[Assiduite] = etud.assiduites.all() @@ -73,16 +75,16 @@ class Assiduite(db.Model): assiduites = [ ass for ass in assiduites - if verif_interval( + if verif_interval( # XEV (date_debut, date_fin), (ass.date_debut, ass.date_fin), ) ] if len(assiduites) != 0: - return 1 + return 1 # XEV raise une exception 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): nouv_assiduite = Assiduite( date_debut=date_debut, @@ -110,7 +112,12 @@ class Assiduite(db.Model): 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 + + # XEV: "module" est un "modimpl": changer nom sinon on pense que c'est un Module module: ModuleImpl = ModuleImpl.query.filter_by( moduleimpl_id=moduleimpl_id ).first() @@ -119,6 +126,8 @@ class Assiduite(db.Model): if output: 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( etudid=search_etudid, moduleimpl_id=moduleimpl_id ).count() @@ -158,7 +167,8 @@ class Justificatif(db.Model): ) 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: data = { diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index ea8d3288b..c2c6db15d 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -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: - if type(date) == str: + # XEV A documenter + if type(date) == str: # XEV utiliser isinstance date = is_iso_formated(date, convert=True) new_date: datetime.datetime = date - if date.tzinfo == None: + if date.tzinfo == None: # XEV utiliser "is None" from app.models.assiduites import Assiduite first_assiduite = Assiduite.query.first() @@ -167,14 +168,19 @@ def localize_datetime(date: datetime.datetime or str) -> datetime.datetime: 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] ) -> 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 - + #XEV: "vrai si la période et de l'intervalle intersectent" 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 i_deb, i_fin = interval