diff --git a/app/scodoc/sco_evaluations.py b/app/scodoc/sco_evaluations.py index ef2e8526b..ee11aa6c6 100644 --- a/app/scodoc/sco_evaluations.py +++ b/app/scodoc/sco_evaluations.py @@ -25,8 +25,8 @@ # ############################################################################## -"""Evaluations -""" +"""Evaluations""" + import collections import datetime import operator @@ -50,6 +50,7 @@ from app.scodoc import sco_cal from app.scodoc import sco_evaluation_db from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_groups +from app.scodoc import sco_gen_cal from app.scodoc import sco_moduleimpl from app.scodoc import sco_preferences from app.scodoc import sco_users @@ -360,6 +361,103 @@ def do_evaluation_etat_in_mod(nt, modimpl: ModuleImpl): return etat +class JourEval(sco_gen_cal.Jour): + """ + Représentation d'un jour dans un calendrier d'évaluations + """ + + COLOR_INCOMPLETE = "#FF6060" + COLOR_COMPLETE = "#A0FFA0" + COLOR_FUTUR = "#70E0FF" + + def __init__( + self, + date: datetime.date, + evaluations: list[Evaluation], + parent: "CalendrierEval", + ): + super().__init__(date) + + self.evaluations: list[Evaluation] = evaluations + self.evaluations.sort(key=lambda e: e.date_debut) + + self.parent: "CalendrierEval" = parent + + def get_html(self) -> str: + html: str = "" + + for e in self.evaluations: + url: str = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=e.moduleimpl_id, + ) + title: str = ( + e.moduleimpl.module.code or e.moduleimpl.module.abbrev or "éval." + ) + html += f""" + {title}
""" + + return html + + def _get_eval_style(self, e: Evaluation) -> str: + color: str = "" + # Etat (notes completes) de l'évaluation: + modimpl_result = self.parent.nt.modimpls_results[e.moduleimpl.id] + if modimpl_result.evaluations_etat[e.id].is_complete: + color = JourEval.COLOR_COMPLETE + else: + color = JourEval.COLOR_INCOMPLETE + if e.date_debut > datetime.datetime.now(scu.TIME_ZONE): + color = JourEval.COLOR_FUTUR + + return f"background-color: {color};" + + def _get_eval_title(self, e: Evaluation) -> str: + heure_debut_txt, heure_fin_txt = "", "" + if e.date_debut != e.date_fin: + heure_debut_txt = ( + e.date_debut.strftime(scu.TIME_FMT) if e.date_debut else "" + ) + heure_fin_txt = e.date_fin.strftime(scu.TIME_FMT) if e.date_fin else "" + + title = f"{e.description or e.moduleimpl.module.titre_str()}" + if heure_debut_txt: + title += f" de {heure_debut_txt} à {heure_fin_txt}" + + return title + + +class CalendrierEval(sco_gen_cal.Calendrier): + """ + Représentation des évaluations d'un semestre dans un calendrier + """ + + def __init__(self, year: int, evals: list[Evaluation], nt: NotesTableCompat): + # On prend du 01/09 au 31/08 + date_debut: datetime.datetime = datetime.datetime(year, 9, 1, 0, 0) + date_fin: datetime.datetime = datetime.datetime(year + 1, 8, 31, 23, 59) + super().__init__(date_debut, date_fin) + + # évalutions du semestre + self.evals: dict[datetime.date, list[Evaluation]] = {} + for e in evals: + if e.date_debut is not None: + day = e.date_debut.date() + if day not in self.evals: + self.evals[day] = [] + self.evals[day].append(e) + + self.nt: NotesTableCompat = nt + + def instanciate_jour(self, date: datetime.date) -> JourEval: + return JourEval(date, self.evals.get(date, []), parent=self) + + # View def formsemestre_evaluations_cal(formsemestre_id): """Page avec calendrier de toutes les evaluations de ce semestre""" @@ -369,52 +467,9 @@ def formsemestre_evaluations_cal(formsemestre_id): evaluations = formsemestre.get_evaluations() nb_evals = len(evaluations) - color_incomplete = "#FF6060" - color_complete = "#A0FFA0" - color_futur = "#70E0FF" - year = formsemestre.annee_scolaire() - events_by_day = collections.defaultdict(list) # date_iso : event - for e in evaluations: - if e.date_debut is None: - continue # éval. sans date - if e.date_debut == e.date_fin: - heure_debut_txt, heure_fin_txt = "", "" - else: - heure_debut_txt = ( - e.date_debut.strftime(scu.TIME_FMT) if e.date_debut else "" - ) - heure_fin_txt = e.date_fin.strftime(scu.TIME_FMT) if e.date_fin else "" - - # Etat (notes completes) de l'évaluation: - modimpl_result = nt.modimpls_results[e.moduleimpl.id] - if modimpl_result.evaluations_etat[e.id].is_complete: - color = color_complete - else: - color = color_incomplete - if e.date_debut > datetime.datetime.now(scu.TIME_ZONE): - color = color_futur - day = e.date_debut.date().isoformat() # yyyy-mm-dd - event = { - "color": color, - "date_iso": day, - "title": e.moduleimpl.module.code or e.moduleimpl.module.abbrev or "éval.", - "description": f"""{e.description or e.moduleimpl.module.titre_str()}""" - + ( - f""" de {heure_debut_txt} à {heure_fin_txt}""" - if heure_debut_txt - else "" - ), - "href": url_for( - "notes.moduleimpl_status", - scodoc_dept=g.scodoc_dept, - moduleimpl_id=e.moduleimpl_id, - ), - "modimpl": e.moduleimpl, - } - events_by_day[day].append(event) - - cal_html = sco_cal.YearTable(year, events_by_day=events_by_day) + cal = CalendrierEval(year, evaluations, nt) + cal_html = cal.get_html() return f""" { @@ -430,15 +485,15 @@ def formsemestre_evaluations_cal(formsemestre_id):