From 83765b584e5488408c91be6e1607d8e5e03f87a5 Mon Sep 17 00:00:00 2001 From: Iziram Date: Mon, 13 Nov 2023 08:35:19 +0100 Subject: [PATCH 1/4] Assiduites : champs "heure_deb" "heure_fin" timeline --- app/templates/assiduites/widgets/timeline.j2 | 29 +++++++++++++++++--- app/views/assiduites.py | 19 +++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/app/templates/assiduites/widgets/timeline.j2 b/app/templates/assiduites/widgets/timeline.j2 index 3a450708..9d614195 100644 --- a/app/templates/assiduites/widgets/timeline.j2 +++ b/app/templates/assiduites/widgets/timeline.j2 @@ -131,12 +131,12 @@ document.addEventListener( "mouseup", mouseUp, - {once:true} + { once: true } ); document.addEventListener( "touchend", mouseUp, - {once:true} + { once: true } ); } else if (event.target === periodTimeLine) { @@ -217,6 +217,14 @@ } function setPeriodValues(deb, fin) { + if (fin < deb) { + throw new RangeError(`le paramètre 'deb' doit être inférieur au paramètre 'fin' ([${deb};${fin}])`) + } + + if (deb < 0 || fin < 0) { + throw new RangeError(`Les paramètres doivent être des entiers positifis ([${deb};${fin}])`) + } + deb = snapToQuarter(deb); fin = snapToQuarter(fin); let leftPercentage = (deb - t_start) / (t_end - t_start) * 100; @@ -231,13 +239,13 @@ function snapHandlesToQuarters() { const periodValues = getPeriodValues(); - let lef = Math.min(computePercentage(periodValues[0], t_start), computePercentage(t_end, tick_delay)); + let lef = Math.min(computePercentage(Math.abs(periodValues[0]), t_start), computePercentage(Math.abs(t_end), tick_delay)); if (lef < 0) { lef = 0; } const left = `${lef}%`; - let wid = Math.max(computePercentage(periodValues[1], periodValues[0]), computePercentage(tick_delay, 0)); + let wid = Math.max(computePercentage(Math.abs(periodValues[1]), Math.abs(periodValues[0])), computePercentage(tick_delay, 0)); if (wid > 100) { wid = 100; } @@ -251,10 +259,23 @@ function computePercentage(a, b) { return ((a - b) / (t_end - t_start)) * 100; } + function fromTime(time, separator = ":") { + const [hours, minutes] = time.split(separator).map((el) => Number(el)) + return hours + minutes / 60 + } createTicks(); setPeriodValues(t_start, t_start + period_default); + {% if heures %} + let [heure_deb, heure_fin] = [{{ heures | safe }}] + if (heure_deb != '' && heure_fin != '') { + heure_deb = fromTime(heure_deb); + heure_fin = fromTime(heure_fin); + setPeriodValues(heure_deb, heure_fin) + } + {% endif %} + +{% endblock %} + + {% block app_content %}
@@ -33,6 +46,25 @@ affectent notamment les comptages d'absences de tous les bulletins des {{ wtf.form_field(form.edt_ics_path) }}
+
Extraction des identifiants depuis les calendriers
+
+ Indiquer ici comment récupérer les informations (titre, groupe, module) + dans les calendriers publiés par votre logiciel d'emploi du temps. +
+
+ {{ wtf.form_field(form.edt_ics_title_field) }} + {{ wtf.form_field(form.edt_ics_title_regexp) }} +
+
+ {{ wtf.form_field(form.edt_ics_group_field) }} + {{ wtf.form_field(form.edt_ics_group_regexp) }} +
+
+ {{ wtf.form_field(form.edt_ics_mod_field) }} + {{ wtf.form_field(form.edt_ics_mod_regexp) }} +
+ +
{{ wtf.form_field(form.submit) }} {{ wtf.form_field(form.cancel) }} @@ -41,8 +73,4 @@ affectent notamment les comptages d'absences de tous les bulletins des
- - - - {% endblock %} diff --git a/app/templates/formsemestre/edt.j2 b/app/templates/formsemestre/edt.j2 index b6ee3ad9..2dbdaadb 100644 --- a/app/templates/formsemestre/edt.j2 +++ b/app/templates/formsemestre/edt.j2 @@ -51,6 +51,13 @@ document.addEventListener('DOMContentLoaded', function() { return `${start} ${event.title}`; }, }, + timezone: { + zones: [ + { + timezoneName: 'CET', // TODO récupérer timezone serveur + }, + ], + }, usageStatistics: false, week: { dayNames: [ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"], diff --git a/app/views/scodoc.py b/app/views/scodoc.py index 4ecd9f60..4d5af816 100644 --- a/app/views/scodoc.py +++ b/app/views/scodoc.py @@ -324,6 +324,16 @@ def config_assiduites(): if request.method == "POST" and form.cancel.data: # cancel button return redirect(url_for("scodoc.index")) + edt_options = ( + ("edt_ics_path", "Chemin vers les calendriers ics"), + ("edt_ics_title_field", "Champ contenant titre"), + ("edt_ics_title_regexp", "Expression extraction titre"), + ("edt_ics_group_field", "Champ contenant groupe"), + ("edt_ics_group_regexp", "Expression extraction groupe"), + ("edt_ics_mod_field", "Champ contenant module"), + ("edt_ics_mod_regexp", "Expression extraction module"), + ) + if form.validate_on_submit(): if ScoDocSiteConfig.set("assi_morning_time", form.data["morning_time"]): flash("Heure du début de la journée enregistrée") @@ -333,8 +343,11 @@ def config_assiduites(): flash("Heure de fin de la journée enregistrée") if ScoDocSiteConfig.set("assi_tick_time", float(form.data["tick_time"])): flash("Granularité de la timeline enregistrée") - if ScoDocSiteConfig.set("edt_ics_path", form.data["edt_ics_path"]): - flash("Chemin vers les calendriers ics enregistré") + # --- Calendriers emploi du temps + for opt_name, message in edt_options: + if ScoDocSiteConfig.set(opt_name, form.data[opt_name]): + flash(f"{message} enregistré") + return redirect(url_for("scodoc.configuration")) if request.method == "GET": @@ -352,7 +365,9 @@ def config_assiduites(): except ValueError: form.tick_time.data = 15.0 ScoDocSiteConfig.set("assi_tick_time", 15.0) - form.edt_ics_path.data = ScoDocSiteConfig.get("edt_ics_path") + # --- Emplois du temps + for opt_name, _ in edt_options: + getattr(form, opt_name).data = ScoDocSiteConfig.get(opt_name) return render_template( "assiduites/pages/config_assiduites.j2",