"""
if url_abs
else ""
)
+
+ ens_user_name = event["ens"].user_name if event["ens"] else None
+ ens_nomprenom = event["ens"].get_nomprenom() if event["ens"] else None
d = {
# Champs utilisés par tui.calendar
"calendarId": "cal1",
- "title": f"""{title} {group_disp} {link_abs}""",
+ "title": f"""{title} {group_disp} {
+ '('+ens_nomprenom+')' if ens_nomprenom else ''
+ } {link_abs}""",
"start": event["start"],
"end": event["end"],
"backgroundColor": event["group_bg_color"],
# Infos brutes pour usage API éventuel
+ "ens_edt": event["edt_ens"],
+ "ens_user_name": ens_user_name,
"group_id": group.id if group else None,
"group_edt_id": event["edt_group"],
"moduleimpl_id": modimpl.id if modimpl else None,
@@ -257,6 +270,16 @@ def load_and_convert_ics(formsemestre: FormSemestre) -> tuple[list[dict], list[s
raise ScoValueError(
"expression d'extraction du module depuis l'emploi du temps invalide"
) from exc
+ edt_ics_uid_field = ScoDocSiteConfig.get("edt_ics_uid_field")
+ edt_ics_uid_regexp = ScoDocSiteConfig.get("edt_ics_uid_regexp")
+ try:
+ edt_ics_uid_pattern = (
+ re.compile(edt_ics_uid_regexp) if edt_ics_uid_regexp else None
+ )
+ except re.error as exc:
+ raise ScoValueError(
+ "expression d'extraction de l'enseignant depuis l'emploi du temps invalide"
+ ) from exc
# --- Correspondances id edt -> id scodoc pour groupes, modules et enseignants
edt2group = formsemestre_retreive_groups_from_edt_id(formsemestre)
group_colors = {
@@ -266,6 +289,7 @@ def load_and_convert_ics(formsemestre: FormSemestre) -> tuple[list[dict], list[s
edt_groups_ids = set() # les ids de groupes tels que dans l'ics
default_group = formsemestre.get_default_group()
edt2modimpl = formsemestre_retreive_modimpls_from_edt_id(formsemestre)
+ edt2user: dict[str, User | None] = {} # construit au fur et à mesure (cache)
# ---
events = [e for e in calendar.walk() if e.name == "VEVENT"]
events_sco = []
@@ -313,7 +337,19 @@ def load_and_convert_ics(formsemestre: FormSemestre) -> tuple[list[dict], list[s
else:
modimpl = False
edt_module = ""
- # --- TODO: enseignant
+ # --- Enseignant
+ if edt_ics_uid_pattern:
+ edt_ens = extract_event_data(
+ event, edt_ics_uid_field, edt_ics_uid_pattern
+ )
+ if edt_ens in edt2user:
+ ens = edt2user[edt_ens]
+ else:
+ ens = User.query.filter_by(edt_id=edt_ens).first()
+ edt2user[edt_ens] = ens
+ else:
+ ens = None
+ edt_ens = ""
#
events_sco.append(
{
@@ -324,6 +360,9 @@ def load_and_convert_ics(formsemestre: FormSemestre) -> tuple[list[dict], list[s
"group_bg_color": group_bg_color, # associée au groupe
"modimpl": modimpl, # False si extracteur non configuré
"edt_module": edt_module, # id module edt non traduit
+ # Enseignant
+ "edt_ens": edt_ens, # id ens edt, non traduit
+ "ens": ens,
# heures pour saisie abs: en heure LOCALE DU SERVEUR
"heure_deb": event.decoded("dtstart")
.replace(tzinfo=timezone.utc)
diff --git a/app/static/icons/absences.svg b/app/static/icons/absences.svg
new file mode 100644
index 000000000..9a665ebb1
--- /dev/null
+++ b/app/static/icons/absences.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/templates/assiduites/pages/config_assiduites.j2 b/app/templates/assiduites/pages/config_assiduites.j2
index 7d2ae0a52..f1462cd7c 100644
--- a/app/templates/assiduites/pages/config_assiduites.j2
+++ b/app/templates/assiduites/pages/config_assiduites.j2
@@ -96,7 +96,7 @@ affectent notamment les comptages d'absences de tous les bulletins des
-
Voici un évènement chargé au milieu de ce calendrier.
+
Voici un évènement chargé, pris au hasard au milieu de ce calendrier.
Utilisez cet exemple pour configurer les expressions d'extraction
en bas de ce formulaire.
@@ -121,7 +121,10 @@ affectent notamment les comptages d'absences de tous les bulletins des
{{ wtf.form_field(form.edt_ics_mod_field) }}
{{ wtf.form_field(form.edt_ics_mod_regexp) }}