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):