2022-10-28 11:42:52 +02:00
|
|
|
# -*- coding: UTF-8 -*
|
|
|
|
"""Gestion de l'assiduité (assiduités + justificatifs)
|
|
|
|
"""
|
|
|
|
from app import db
|
2022-12-14 17:41:57 +01:00
|
|
|
from app.models import ModuleImpl, ModuleImplInscription
|
2022-11-03 10:29:30 +01:00
|
|
|
from app.models.etudiants import Identite
|
2022-12-14 17:41:57 +01:00
|
|
|
from app.scodoc.sco_utils import EtatAssiduite, localize_datetime, verif_interval
|
2022-11-03 10:29:30 +01:00
|
|
|
|
|
|
|
from datetime import datetime
|
2022-10-28 11:42:52 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Assiduite(db.Model):
|
|
|
|
"""
|
|
|
|
Représente une assiduité:
|
|
|
|
- une plage horaire lié à un état et un étudiant
|
|
|
|
- un module si spécifiée
|
|
|
|
"""
|
|
|
|
|
|
|
|
__tablename__ = "assiduites"
|
|
|
|
|
2022-11-03 10:29:30 +01:00
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
assiduiteid = db.synonym("id")
|
2022-10-28 11:42:52 +02:00
|
|
|
|
|
|
|
date_debut = db.Column(
|
|
|
|
db.DateTime(timezone=True), server_default=db.func.now(), nullable=False
|
|
|
|
)
|
|
|
|
date_fin = db.Column(
|
|
|
|
db.DateTime(timezone=True), server_default=db.func.now(), nullable=False
|
|
|
|
)
|
|
|
|
|
|
|
|
moduleimpl_id = db.Column(
|
|
|
|
db.Integer,
|
|
|
|
db.ForeignKey("notes_moduleimpl.id", ondelete="SET NULL"),
|
|
|
|
)
|
|
|
|
etudid = db.Column(
|
|
|
|
db.Integer,
|
|
|
|
db.ForeignKey("identite.id", ondelete="CASCADE"),
|
|
|
|
index=True,
|
|
|
|
nullable=False,
|
|
|
|
)
|
2022-11-03 10:29:30 +01:00
|
|
|
etat = db.Column(db.Integer, nullable=False)
|
2022-10-28 11:42:52 +02:00
|
|
|
|
|
|
|
def to_dict(self) -> dict:
|
|
|
|
data = {
|
|
|
|
"assiduiteid": self.assiduiteid,
|
|
|
|
"etudid": self.etudid,
|
2022-11-03 10:29:30 +01:00
|
|
|
"moduleimpl_id": self.moduleimpl_id,
|
2022-10-28 11:42:52 +02:00
|
|
|
"date_debut": self.date_debut,
|
|
|
|
"date_fin": self.date_fin,
|
|
|
|
"etat": self.etat,
|
|
|
|
}
|
|
|
|
return data
|
|
|
|
|
2022-11-03 10:29:30 +01:00
|
|
|
@classmethod
|
|
|
|
def create_assiduite(
|
|
|
|
cls,
|
|
|
|
etud: Identite,
|
|
|
|
date_debut: datetime,
|
|
|
|
date_fin: datetime,
|
|
|
|
etat: EtatAssiduite,
|
2022-12-14 17:41:57 +01:00
|
|
|
module: int or None = None,
|
2022-11-03 10:29:30 +01:00
|
|
|
) -> object or int:
|
2022-12-14 17:41:57 +01:00
|
|
|
"""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.
|
|
|
|
"""
|
2022-11-03 10:29:30 +01:00
|
|
|
# Vérification de non duplication des périodes
|
2022-12-14 17:41:57 +01:00
|
|
|
assiduites: list[Assiduite] = etud.assiduites.all()
|
2022-11-03 10:29:30 +01:00
|
|
|
assiduites = [
|
|
|
|
ass
|
|
|
|
for ass in assiduites
|
2022-12-14 17:41:57 +01:00
|
|
|
if verif_interval(
|
|
|
|
(localize_datetime(date_debut), localize_datetime(date_fin)),
|
|
|
|
(ass.date_debut, ass.date_fin),
|
|
|
|
)
|
2022-11-03 10:29:30 +01:00
|
|
|
]
|
|
|
|
if len(assiduites) != 0:
|
|
|
|
return 1
|
|
|
|
|
|
|
|
if module is not None:
|
|
|
|
# Vérification de l'existance du module pour l'étudiant
|
|
|
|
if cls.verif_moduleimpl(module, etud):
|
|
|
|
nouv_assiduite = Assiduite(
|
2022-12-14 17:41:57 +01:00
|
|
|
date_debut=date_debut,
|
|
|
|
date_fin=date_fin,
|
2022-11-03 10:29:30 +01:00
|
|
|
etat=etat,
|
|
|
|
etudiant=etud,
|
|
|
|
moduleimpl_id=module,
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
return 2
|
|
|
|
else:
|
|
|
|
nouv_assiduite = Assiduite(
|
|
|
|
date_debut=date_debut.isoformat(),
|
|
|
|
date_fin=date_fin.isoformat(),
|
|
|
|
etat=etat,
|
|
|
|
etudiant=etud,
|
|
|
|
)
|
2022-12-14 17:41:57 +01:00
|
|
|
|
2022-11-03 10:29:30 +01:00
|
|
|
return nouv_assiduite
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def verif_moduleimpl(moduleimpl_id: int, etud: Identite or int) -> bool:
|
|
|
|
"""
|
|
|
|
Vérifie si l'étudiant est bien inscrit au moduleimpl
|
|
|
|
|
|
|
|
Retourne Vrai si c'est le cas, faux sinon
|
|
|
|
"""
|
2022-12-14 17:41:57 +01:00
|
|
|
output = True
|
2022-11-03 10:29:30 +01:00
|
|
|
module: ModuleImpl = ModuleImpl.query.filter_by(
|
|
|
|
moduleimpl_id=moduleimpl_id
|
|
|
|
).first()
|
|
|
|
if module is None:
|
2022-12-14 17:41:57 +01:00
|
|
|
output = False
|
2022-11-03 10:29:30 +01:00
|
|
|
|
2022-12-14 17:41:57 +01:00
|
|
|
if output:
|
|
|
|
search_etudid: int = etud.id if type(etud) == Identite else etud
|
|
|
|
is_module: int = ModuleImplInscription.query.filter_by(
|
|
|
|
etudid=search_etudid, moduleimpl_id=moduleimpl_id
|
|
|
|
).count()
|
2022-11-03 10:29:30 +01:00
|
|
|
|
2022-12-14 17:41:57 +01:00
|
|
|
output = is_module > 0
|
2022-11-03 10:29:30 +01:00
|
|
|
|
2022-12-14 17:41:57 +01:00
|
|
|
return output
|
2022-10-28 11:42:52 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Justificatif(db.Model):
|
|
|
|
"""
|
|
|
|
Représente un justificatif:
|
|
|
|
- une plage horaire lié à un état et un étudiant
|
|
|
|
- une raison si spécifiée
|
|
|
|
- un fichier si spécifié
|
|
|
|
"""
|
|
|
|
|
|
|
|
__tablename__ = "justificatifs"
|
|
|
|
|
|
|
|
justifid = db.Column(db.Integer, primary_key=True)
|
|
|
|
|
|
|
|
date_debut = db.Column(
|
|
|
|
db.DateTime(timezone=True), server_default=db.func.now(), nullable=False
|
|
|
|
)
|
|
|
|
date_fin = db.Column(
|
|
|
|
db.DateTime(timezone=True), server_default=db.func.now(), nullable=False
|
|
|
|
)
|
|
|
|
|
|
|
|
etudid = db.Column(
|
|
|
|
db.Integer,
|
|
|
|
db.ForeignKey("identite.id", ondelete="CASCADE"),
|
|
|
|
index=True,
|
|
|
|
nullable=False,
|
|
|
|
)
|
|
|
|
etat = db.Column(
|
|
|
|
db.Integer,
|
|
|
|
)
|
|
|
|
|
|
|
|
raison = db.Column(db.Text())
|
|
|
|
fichier = db.Column(db.Integer())
|
|
|
|
|
|
|
|
def to_dict(self) -> dict:
|
|
|
|
data = {
|
|
|
|
"justifid": self.assiduiteid,
|
|
|
|
"etudid": self.etudid,
|
|
|
|
"date_debut": self.date_debut,
|
|
|
|
"date_fin": self.date_fin,
|
|
|
|
"etat": self.etat,
|
2022-11-03 10:29:30 +01:00
|
|
|
"raison": self.raison,
|
|
|
|
"fichier": self.fichier,
|
2022-10-28 11:42:52 +02:00
|
|
|
}
|
|
|
|
return data
|