show the broken line on timetable parsing error

Certains utilisateurs font remonter régulièrement que le générateur ne marche pas. C'est normal, on n'a pas forcément prévu tous les cas et on n'est pas à l'abri des changements de format de l'UTBM.

Ce qui est très embêtant, dans ces cas-là, c'est qu'on donne très peu d'informations sur ce qui n'a pas marché, et que les utilisateurs peuvent difficilement faire remonter plus que ça.

En décrivant la ligne qui n'a pas pu être parsée, ça devrait déjà rendre la gestion de ce genre de problème un peu plus facile, tout en étant plus transparent pour l'utilisateur
This commit is contained in:
imperosol
2026-09-08 23:49:04 +02:00
parent 564baf3b56
commit ecaef644b3
4 changed files with 37 additions and 19 deletions
+12 -1
View File
@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-04 11:24+0200\n" "POT-Creation-Date: 2026-09-08 23:36+0200\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n" "Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@@ -5852,6 +5852,17 @@ msgstr "les groupes pouvant créer des cotisations"
msgid "Timetable generator" msgid "Timetable generator"
msgstr "Générateur d'emploi du temps" msgstr "Générateur d'emploi du temps"
#: timetable/templates/timetable/generator.jinja
msgid ""
"Wrong timetable format. Make sure you copied if from your student folder."
msgstr ""
"Mauvais format d'emploi du temps. Assurez-vous que vous l'avez copié depuis "
"votre dossier étudiant."
#: timetable/templates/timetable/generator.jinja
msgid "Incorrect row"
msgstr "Ligne incorrecte"
#: timetable/templates/timetable/generator.jinja #: timetable/templates/timetable/generator.jinja
msgid "Generate" msgid "Generate"
msgstr "Générer" msgstr "Générer"
+3 -9
View File
@@ -7,7 +7,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-17 10:03+0200\n" "POT-Creation-Date: 2026-09-08 23:36+0200\n"
"PO-Revision-Date: 2024-09-17 11:54+0200\n" "PO-Revision-Date: 2024-09-17 11:54+0200\n"
"Last-Translator: Sli <antoine@bartuccio.fr>\n" "Last-Translator: Sli <antoine@bartuccio.fr>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@@ -22,8 +22,8 @@ msgid ""
"You're going to remove your own role from the presidency. You may lock " "You're going to remove your own role from the presidency. You may lock "
"yourself out of this page. Do you want to continue ? " "yourself out of this page. Do you want to continue ? "
msgstr "" msgstr ""
"Vous vous apprêtez à retirer votre propre rôle de la présidence. Vous risquez " "Vous vous apprêtez à retirer votre propre rôle de la présidence. Vous "
"de perdre l'accès à cette page. Voulez-vous continuer ?" "risquez de perdre l'accès à cette page. Voulez-vous continuer ?"
#: com/static/bundled/com/components/ics-calendar-index.ts #: com/static/bundled/com/components/ics-calendar-index.ts
msgid "More info" msgid "More info"
@@ -279,9 +279,3 @@ msgstr "Il n'a pas été possible de modérer l'image"
msgid "Couldn't delete picture" msgid "Couldn't delete picture"
msgstr "Il n'a pas été possible de supprimer l'image" msgstr "Il n'a pas été possible de supprimer l'image"
#: timetable/static/bundled/timetable/generator-index.ts
msgid ""
"Wrong timetable format. Make sure you copied if from your student folder."
msgstr ""
"Mauvais format d'emploi du temps. Assurez-vous que vous l'avez copié depuis "
"votre dossier étudiant."
@@ -59,7 +59,7 @@ function parseSlots(s: string): TimetableSlot[] {
.map((row: string) => { .map((row: string) => {
const parsed = TIMETABLE_ROW_RE.exec(row); const parsed = TIMETABLE_ROW_RE.exec(row);
if (!parsed?.groups) { if (!parsed?.groups) {
throw new Error(`Couldn't parse row ${row}`); throw new Error(`Couldn't parse row ${row}`, { cause: { row: row } });
} }
const [startHour, startMin] = parsed.groups.startHour const [startHour, startMin] = parsed.groups.startHour
.split(":") .split(":")
@@ -78,7 +78,7 @@ function parseSlots(s: string): TimetableSlot[] {
document.addEventListener("alpine:init", () => { document.addEventListener("alpine:init", () => {
Alpine.data("timetableGenerator", () => ({ Alpine.data("timetableGenerator", () => ({
content: DEFAULT_TIMETABLE, content: DEFAULT_TIMETABLE,
error: "", error: null as { incorrectRow?: string },
displayedWeekdays: [] as WeekDay[], displayedWeekdays: [] as WeekDay[],
courses: [] as TimetableSlot[], courses: [] as TimetableSlot[],
startSlot: 0, startSlot: 0,
@@ -106,10 +106,9 @@ document.addEventListener("alpine:init", () => {
generate() { generate() {
try { try {
this.courses = parseSlots(this.content); this.courses = parseSlots(this.content);
} catch { this.error = null;
this.error = gettext( } catch (err) {
"Wrong timetable format. Make sure you copied if from your student folder.", this.error = { incorrectRow: err?.cause?.row };
);
return; return;
} }
+16 -2
View File
@@ -16,9 +16,23 @@
<div x-data="timetableGenerator"> <div x-data="timetableGenerator">
<form @submit.prevent="generate()"> <form @submit.prevent="generate()">
<h1>Générateur d'emploi du temps</h1> <h1>Générateur d'emploi du temps</h1>
<div class="alert alert-red" x-show="!!error" x-cloak> <template x-if="error !== null" x-cloak>
<span class="alert-main" x-text="error"></span> <div class="alert alert-red">
<div class="alert-main">
<p>
{% trans trimmed %}
Wrong timetable format. Make sure you copied if from your student folder.
{% endtrans %}
</p>
<template x-if="!!error.incorrectRow">
<p>
{% trans %}Incorrect row{% endtrans %} :
<code x-text="error.incorrectRow"></code>
</p>
</template>
</div> </div>
</div>
</template>
<div class="form-group"> <div class="form-group">
<label for="timetable-input">Colle ton emploi du temps (sans l'entête)</label> <label for="timetable-input">Colle ton emploi du temps (sans l'entête)</label>
<textarea id="timetable-input" cols="30" rows="15" x-model="content"></textarea> <textarea id="timetable-input" cols="30" rows="15" x-model="content"></textarea>