diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py index fd3098665..b429187e9 100644 --- a/app/scodoc/sco_assiduites.py +++ b/app/scodoc/sco_assiduites.py @@ -1,22 +1,28 @@ """ Ecrit par Matthias Hartmann. """ + from datetime import date, datetime, time, timedelta from pytz import UTC +from flask import g from flask_sqlalchemy.query import Query from app import log, db, set_sco_dept -import app.scodoc.sco_utils as scu +from app.models import ( + Identite, + FormSemestre, + FormSemestreInscription, + ModuleImpl, + ModuleImplInscription, + ScoDocSiteConfig, +) from app.models.assiduites import Assiduite, Justificatif, compute_assiduites_justified -from app.models.etudiants import Identite -from app.models.formsemestre import FormSemestre, FormSemestreInscription from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_preferences from app.scodoc import sco_cache from app.scodoc import sco_etud -from app.models import ScoDocSiteConfig -from flask import g +import app.scodoc.sco_utils as scu class CountCalculator: @@ -93,9 +99,9 @@ class CountCalculator: evening if evening else ScoDocSiteConfig.get("assi_afternoon_time", "18:00") ) - self.non_work_days: list[ - scu.NonWorkDays - ] = scu.NonWorkDays.get_all_non_work_days(dept_id=g.scodoc_dept_id) + self.non_work_days: list[scu.NonWorkDays] = ( + scu.NonWorkDays.get_all_non_work_days(dept_id=g.scodoc_dept_id) + ) delta_total: timedelta = datetime.combine( date.min, self.evening @@ -371,6 +377,10 @@ def get_assiduites_stats( assiduites = filter_by_formsemestre( assiduites, Assiduite, filtered[key] ) + case "formsemestre_modimpls": + assiduites = filter_by_modimpls( + assiduites, Assiduite, filtered[key] + ) case "est_just": assiduites = filter_assiduites_by_est_just( assiduites, filtered[key] @@ -489,7 +499,9 @@ def filter_by_formsemestre( formsemestre: FormSemestre, ) -> Query: """ - Filtrage d'une collection en fonction d'un formsemestre + Filtrage d'une collection : conserve les élements + - si l'étudiant est inscrit au formsemestre + - Et que la plage de dates est complètement incluse dans le semestre (bizarre!) """ if formsemestre is None: @@ -514,6 +526,41 @@ def filter_by_formsemestre( return collection_result.filter(collection_class.date_fin <= form_date_fin) +def filter_by_modimpls( + collection_query: Assiduite | Justificatif, + collection_class: Assiduite | Justificatif, + formsemestre: FormSemestre, +) -> Query: + """ + Filtrage d'une collection d'assiduités: conserve les élements + - si l'étudiant est inscrit au formsemestre + - Et que l'assiduité concerne un moduleimpl de ce formsemestre + + Ne fait rien sur les justificatifs. + Ne fait rien si formsemestre is None + """ + if (collection_class != Assiduite) or (formsemestre is None): + return collection_query + + # restreint aux inscrits: + collection_result = ( + collection_query.join(Identite, collection_class.etudid == Identite.id) + .join( + FormSemestreInscription, + Identite.id == FormSemestreInscription.etudid, + ) + .filter(FormSemestreInscription.formsemestre_id == formsemestre.id) + ) + + collection_result = ( + collection_result.join(ModuleImpl) + .join(ModuleImplInscription) + .filter(ModuleImplInscription.etudid == collection_class.etudid) + ) + + return collection_result + + def justifies(justi: Justificatif, obj: bool = False) -> list[int] | Query: """ Retourne la liste des assiduite_id qui sont justifié par la justification diff --git a/app/scodoc/sco_edit_ue.py b/app/scodoc/sco_edit_ue.py index 2fd6a13b8..a02811c2a 100644 --- a/app/scodoc/sco_edit_ue.py +++ b/app/scodoc/sco_edit_ue.py @@ -133,7 +133,15 @@ def do_ue_create(args, allow_empty_ue_code=False): break args["ue_code"] = code + # last checks + if not args.get("acronyme"): + raise ScoValueError("acronyme vide") + args["coefficient"] = args.get("coefficient", None) + if args["coefficient"] == "": + args["coefficient"] = None + # create + # XXX TODO utiliser UniteEns.create_from_dict ue_id = _ueEditor.create(cnx, args) log(f"do_ue_create: created {ue_id} with {args}") @@ -303,11 +311,13 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
Note: sauf exception, l'UE n'a pas de coefficient associé. Seuls les modules ont des coefficients.
""", - f""" + ( + f"""