Quelques commentaires rapides
This commit is contained in:
parent
f96571f520
commit
e2ca9d417f
@ -28,7 +28,12 @@ import app.scodoc.sco_assiduites as scass
|
||||
@api_web_bp.route("/assiduite/<int:assiduiteid>")
|
||||
@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()
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user