129 lines
4.0 KiB
Python
129 lines
4.0 KiB
Python
# -*- coding: UTF-8 -*
|
|
|
|
"""ScoDoc models: moduleimpls
|
|
"""
|
|
from typing import Any
|
|
|
|
import pandas as pd
|
|
|
|
from app import db
|
|
from app.comp import df_cache
|
|
from app.models import APO_CODE_STR_LEN
|
|
from app.models import SHORT_STR_LEN
|
|
from app.models import CODE_STR_LEN
|
|
from app.models import UniteEns, Identite
|
|
|
|
import app.scodoc.notesdb as ndb
|
|
from app.scodoc import sco_evaluation_db
|
|
|
|
|
|
class ModuleImpl(db.Model):
|
|
"""Mise en oeuvre d'un module pour une annee/semestre"""
|
|
|
|
__tablename__ = "notes_moduleimpl"
|
|
__table_args__ = (db.UniqueConstraint("formsemestre_id", "module_id"),)
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
moduleimpl_id = db.synonym("id")
|
|
module_id = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey("notes_modules.id"),
|
|
)
|
|
formsemestre_id = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey("notes_formsemestre.id"),
|
|
index=True,
|
|
)
|
|
responsable_id = db.Column("responsable_id", db.Integer, db.ForeignKey("user.id"))
|
|
# formule de calcul moyenne:
|
|
computation_expr = db.Column(db.Text())
|
|
|
|
evaluations = db.relationship("Evaluation", lazy="dynamic", backref="moduleimpl")
|
|
enseignants = db.relationship(
|
|
"User",
|
|
secondary="notes_modules_enseignants",
|
|
lazy="dynamic",
|
|
backref="moduleimpl",
|
|
viewonly=True,
|
|
)
|
|
|
|
def __init__(self, **kwargs):
|
|
super(ModuleImpl, self).__init__(**kwargs)
|
|
|
|
def get_evaluations_poids(self) -> pd.DataFrame:
|
|
"""Les poids des évaluations vers les UE (accès via cache)"""
|
|
evaluations_poids = df_cache.EvaluationsPoidsCache.get(self.id)
|
|
if evaluations_poids is None:
|
|
from app.comp import moy_mod
|
|
|
|
evaluations_poids, _ = moy_mod.df_load_evaluations_poids(self.id)
|
|
df_cache.EvaluationsPoidsCache.set(self.id, evaluations_poids)
|
|
return evaluations_poids
|
|
|
|
def invalidate_evaluations_poids(self):
|
|
"""Invalide poids cachés"""
|
|
df_cache.EvaluationsPoidsCache.delete(self.id)
|
|
|
|
def check_apc_conformity(self) -> bool:
|
|
"""true si les poids des évaluations du module permettent de satisfaire
|
|
les coefficients du PN.
|
|
"""
|
|
if not self.module.formation.get_parcours().APC_SAE:
|
|
return True
|
|
from app.comp import moy_mod
|
|
|
|
return moy_mod.check_moduleimpl_conformity(
|
|
self,
|
|
self.get_evaluations_poids(),
|
|
self.module.formation.get_module_coefs(self.module.semestre_id),
|
|
)
|
|
|
|
def to_dict(self):
|
|
"""as a dict, with the same conversions as in ScoDoc7"""
|
|
e = dict(self.__dict__)
|
|
e.pop("_sa_instance_state", None)
|
|
# ScoDoc7 output_formators: (backward compat)
|
|
e["moduleimpl_id"] = self.id
|
|
e["ens"] = [
|
|
{"moduleimpl_id": self.id, "ens_id": e.id} for e in self.enseignants
|
|
]
|
|
return e
|
|
|
|
|
|
# Enseignants (chargés de TD ou TP) d'un moduleimpl
|
|
notes_modules_enseignants = db.Table(
|
|
"notes_modules_enseignants",
|
|
db.Column(
|
|
"moduleimpl_id",
|
|
db.Integer,
|
|
db.ForeignKey("notes_moduleimpl.id"),
|
|
),
|
|
db.Column("ens_id", db.Integer, db.ForeignKey("user.id")),
|
|
# ? db.UniqueConstraint("moduleimpl_id", "ens_id"),
|
|
)
|
|
# XXX il manque probablement une relation pour gérer cela
|
|
|
|
|
|
class ModuleImplInscription(db.Model):
|
|
"""Inscription à un module (etudiants,moduleimpl)"""
|
|
|
|
__tablename__ = "notes_moduleimpl_inscription"
|
|
__table_args__ = (db.UniqueConstraint("moduleimpl_id", "etudid"),)
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
moduleimpl_inscription_id = db.synonym("id")
|
|
moduleimpl_id = db.Column(
|
|
db.Integer,
|
|
db.ForeignKey("notes_moduleimpl.id"),
|
|
index=True,
|
|
)
|
|
etudid = db.Column(db.Integer, db.ForeignKey("identite.id"), index=True)
|
|
etud = db.relationship(
|
|
Identite,
|
|
backref=db.backref("moduleimpl_inscriptions", cascade="all, delete-orphan"),
|
|
)
|
|
modimpl = db.relationship(
|
|
ModuleImpl,
|
|
backref=db.backref("inscriptions", cascade="all, delete-orphan"),
|
|
)
|